美文网首页
异常抛到上一层

异常抛到上一层

作者: 墨色尘埃 | 来源:发表于2018-12-07 16:05 被阅读23次

PublicInfoPlatformBack公共信息平台项目
MapBeanUtil中mapToBean内层方法 throws Exception 异常到外层方法,遇到类型转换异常比如map.put("isDelete", 1);存的是Integer类型的时候,外层方法deletebylogic捕捉到错误信息 e.getMessage();但是无法定位到具体位置
控制台报错信息如下:内层方法①+外层方法①

image.png

内层方法①+外层方法②组合在一起会提示外层方法②try catch,最终还是→内层方法①+外层方法①

如果内层方法直接捕捉,外层方法也捕捉(内层方法②+外层方法①),则
控制台报错信息如下:内层方法②+外层方法①

image.png

控制台报错信息如下:内层方法②+外层方法②

image.png

所以最终使用的应该是内层方法②+外层方法②的组合

内层方法①

    /**
     * 将Map对象通过反射机制转换成Bean对象
     *
     * @param map   存放数据的map对象
     * @param clazz 待转换的class
     * @return 转换后的Bean对象
     * @throws Exception 异常
     */
    public static Object mapToBean(Map<String, Object> map, Class<?> clazz) throws Exception {
        Object obj = clazz.newInstance();
        if (map != null && map.size() > 0) {
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                String propertyName = entry.getKey();       //属性名
                Object value = entry.getValue();
                String setMethodName = "set"
                        + propertyName.substring(0, 1).toUpperCase()
                        + propertyName.substring(1);
                Field field = getClassField(clazz, propertyName);
                if (field == null)
                    continue;
                Class<?> fieldTypeClass = field.getType();
                value = convertValType(value, fieldTypeClass);
                try {
                    clazz.getMethod(setMethodName, field.getType()).invoke(obj, value);
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return obj;
    }

内层方法②

    /**
     * 将Map对象通过反射机制转换成Bean对象
     *
     * @param map   存放数据的map对象
     * @param clazz 待转换的class
     * @return 转换后的Bean对象
     * @throws Exception 异常
     */
    public static Object mapToBean(Map<String, Object> map, Class<?> clazz) {
        Object obj = null;
        try {
            obj = clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        if (map != null && map.size() > 0) {
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                String propertyName = entry.getKey();       //属性名
                Object value = entry.getValue();
                String setMethodName = "set"
                        + propertyName.substring(0, 1).toUpperCase()
                        + propertyName.substring(1);
                Field field = getClassField(clazz, propertyName);
                if (field == null)
                    continue;
                Class<?> fieldTypeClass = field.getType();
                value = convertValType(value, fieldTypeClass);
                try {
                    clazz.getMethod(setMethodName, field.getType()).invoke(obj, value);
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return obj;
    }

外层方法①

    /**
     * 通用接口:逻辑删除,逻辑删除原表
     * 修改备份表"IS_NEW=1 and 原表主键字段=当前传过来的主键"的记录的 IS_NEW=0;
     * 备份表插入一条记录:BAK_ID后台生成、IS_NEW=1、OPERATION=2、BATCH_TIME=服务器时间;
     * OPERATION:操作标志0:插入,1:更新,2:删除
     *
     * @return
     */
    public ResponseObj<Boolean> deletebylogic(@RequestBody List<T> list) {
               ............
        if (list != null && list.size() > 0) {
               ............
                Map<String, Object> map = MapBeanUtil.beanToMap(object);
                map.put("isDelete", 1);  //0没有删除 1逻辑删除。注意这里应该是String类型
                try {
                    logicObject = MapBeanUtil.mapToBean(map, c);
                } catch (Exception e) {
                    e.getMessage();
                    System.out.println(e.getMessage());
                }

//                logicObject = MapBeanUtil.mapToBean(map, c);

               ............
            }
        }
               ............
    }

外层方法②

    /**
     * 通用接口:逻辑删除,逻辑删除原表
     * 修改备份表"IS_NEW=1 and 原表主键字段=当前传过来的主键"的记录的 IS_NEW=0;
     * 备份表插入一条记录:BAK_ID后台生成、IS_NEW=1、OPERATION=2、BATCH_TIME=服务器时间;
     * OPERATION:操作标志0:插入,1:更新,2:删除
     *
     * @return
     */
    public ResponseObj<Boolean> deletebylogic(@RequestBody List<T> list) {
               ............
        if (list != null && list.size() > 0) {
               ............
                Map<String, Object> map = MapBeanUtil.beanToMap(object);
                map.put("isDelete", 1);  //0没有删除 1逻辑删除。注意这里应该是String类型
//                try {
//                    logicObject = MapBeanUtil.mapToBean(map, c);
//                } catch (Exception e) {
//                    e.getMessage();
//                    System.out.println(e.getMessage());
//                }

                logicObject = MapBeanUtil.mapToBean(map, c);

               ............
            }
        }
               ............
    }

报错原因:

360截图165307158610576.png
360截图164408046797103.png

同样错误还有如下

map→Object过程中,因为类型不一致报错java.lang.IllegalArgumentException argument type mismatch.png

相关文章

网友评论

      本文标题:异常抛到上一层

      本文链接:https://www.haomeiwen.com/subject/thtthqtx.html