InvocationTargetException.getTargetException() 

解决方案 »

  1.   

    呵呵
    试试看InvocationTargetException.getTargetException()
      

  2.   

    多谢各位关注和提醒,BUT问题是我在主流程中没有catch到任何Exception(当然也没有InvocationTargetException)。
    即——在主流程中,不是找不出异常,而是根本没有异常。按理说JVM应该把invoke的执行异常打包进InvocationTargetException返回的,所以很是奇怪。这也可能是比较特殊的情况,我还没来得及仔细测试。希望有碰到过的兄弟指点一下。
      

  3.   

    仔细看楼主的问题,其中那句:"其中实际的代码是抛出了异常的(print出来了)"我奇怪的是,扔出来的异常还能打印出来?一般程序扔出异常就会终止,又怎么能print这个异常呢?可能是楼主catch了这个异常吧
      

  4.   

    to: xixigongzhu(夕夕公主) 
    楼主的意思应该是说程序中断后打在控制台上的异常.
      

  5.   

    invoke方法会抛出三种IllegalAccessException, IllegalArgumentException,InvocationTargetException异常,你这里是不是这三种当中的一种,如果不是,查查看是不是程序其他什么地方有问题.
      

  6.   

    可能真的是Error,仔细检查一下,由一些地方是null等等,最好是把代码贴出来
      

  7.   

    to xixigongzhu(夕夕公主) :
    怪我没说清楚,那个异常是invoke所调用的实际代码catch后print出来的。
    我所谓的“其中实际的代码”就是这个意思,即不是主流程中的invoke。to whyxx(我也是新手) :
    我的流程作为主框架模块通过反射调用了另一个同事的一个方法,他也有异常处理,所以那个异常信息是他的程序打到控制台的。但是我的程序(invoke)没有出现异常,也就不是你列出的那三种。to all:
    我是想不管他的异常是什么,既然是通过我的invoke调用出现的异常,我的流程怎么会没有一点反应呢?
    年底这几天极忙,还有更重要的一些其它问题没搞定,所以来麻烦各位啦。至于帖代码,我现在只能把我的代码贴出来,他的我拿不到。
    (下面是一段反射操作封装,只改了后面的两条注释)  private static Object doReflect(Pack code) throws Exception {
        Class[] args = null;
        Object[] vals = null;
        int cnt = 0;
        List list = code.list("para");
        if (list != null) {
          cnt = list.size();
          args = new Class[cnt];
          vals = new Object[cnt];
        }
        for (int i = 0; i < cnt; i++) {
          Pack pack = (Pack)list.get(i);
          String type = pack.getType();
          String value = pack.getValue();
          int dim = Tool.dimArray(type);//得到参数类型数组维数(0表示不是数组)
          if (dim > 0) type = type.substring(0, type.indexOf("["));
          type = Tool.typeName(type);//得到参数逻辑数据类型
          args[i] = Tool.typeClass(type, dim);//得到参数的对象
          //得到参数值
          if (value.equals("null")) continue;
          if (dim > 0) {//处理数组
            String[] val = value.split(",");
            Object ary = Array.newInstance(args[i], val.length);
            for (int j = 0; j < val.length; j++) {
              if (type.equals("str")) Array.set(ary,j, val[j]);
              else if (type.equals("int")) Array.setInt(ary, j, Tool.s2n(val[j]));
              else if (type.equals("bool")) Array.setBoolean(ary, j, Tool.s2b(val[j]));
              else ;//其它(暂未处理)
            }
            vals[i] = ary;
          } else vals[i] = Tool.newObject(type, value);
        }
        String class_name = code.getProp("class");
        Class cls = null;
        Object obj = null;
        if (class_name.equals("")) {//DatabaseMetaData操作
          obj = dbmd;
          cls = obj.getClass();
        } else {//系统其它函数或用户自定义函数(我碰到的问题走的是这儿)
          cls = Class.forName(class_name);
          obj = cls.newInstance();
        }
        Method method = cls.getMethod(code.getName(), args);
        return method.invoke(obj, vals);//在这儿我同事的程序在控制台打出了异常信息
      }(这是调用上述方法的代码,省略了无关流程)
        try {
          Pack exec = code.get("exec");
          if (exec != null) {//内部函数
    //......略掉
          } else result = doReflect(code);//在这儿调用,但下面的两段catch都没有触发
        } catch (InvocationTargetException e) {
          throw new WorkException("命令执行失败", e.getTargetException());
        } catch (Exception e) {
          throw new WorkException("命令执行错误", e);
        }
    //......下面的代码接着走了,没问题
    希望这次说得清楚了些,再有代码相关的解释问题各位尽管发话,多谢多谢!
      

  8.   

    唉,不好意思各位,一时糊涂问了这么个问题。既然是“invoke所调用的实际代码catch后print出来的”——他已经catch了,并且
    没有再throw出来,我当然是截不到了!!!因为我当时问了那个同事,他也不是很清楚,所以我以为是我的问题。
    但是他不清楚却又是因为他的程序里又调用了另外一个同事的代码,那个异常是第二个同事的程序处理了的。呵呵,给大家添乱了。过年好!散分!