异常如果不捕获,最后会到哪里?是抛到哪里去。。

解决方案 »

  1.   

        当一个线程抛出异常时,如果该线程没有捕获异常,那么Java虚拟机就会寻找相关的UncaughtExceptionHandler实例,如果找到,就调用它的uncaughtException(Thread t,Throwable e)方法。寻找UncaughtExceptionHandler实例的步骤如下:
    1、寻找线程实例的当前异常处理器,如果找到就调用它的uncaughtException(Thread t,Throwable e)方法。
    2、把线程实例所属的线程组作为异常处理器(ThreadGroup类实现了Thread.UncaughtExceptionHandler接口,所以ThreadGroup类的实例也是一个UncaughtExceptionHandler实例),如果有uncaughtException(Thread t,Throwable e)方法,就调用它,如果没有,就调用父线程组的uncaughtException
    (Thread t,Throwable e)方法(如果顶层的uncaughtException (Thread t,Throwable e)方法再调用super.uncaughtException(Thread t,Throwable e),那么将找线程实例所属的线程类的默认异常处理器)。
    3、如果线程实例所属的线程类具有默认异常处理器,那就调用这个默认异常处理器的uncaughtException
    (Thread t,Throwable e)方法。
    4、如果都找不到,那么就把来自方法调用堆栈的异常信息打印到标准输出流System.err中。
      

  2.   

    总结:当Java虚拟机追溯到调用栈的底部的方法时,如果仍然没有找到处理该异常的代码块,将按以下步骤处理:
    1、调用异常对象的printStackTrace()方法,打印来自方法调用栈的异常信息。
    2、如果该线程不是主线程,那么终止这个线程,其他线程继续正常运行。如果该线程是主线程(即方法调用栈的底部为main()方法),那么整个应用程序被终止。
      

  3.   

    按照方法调用一层一层的向上传递,如果到达main方法还得不到处理,则程序终止
      

  4.   

    抛到main后,被jvm捕获,然后程序就over了
      

  5.   

    想不到好久没来 CSDN还是这么多这么多的SB
    中国这几年盛产SB啊
    除了2楼的