Jvm处理Java Thread 的run方法中抛出异常的流程
2015-02-05 15:57
447 查看
众所周知,Java中在进行方法调用的时候,可能存在两种异常处理的场景:
被调用的方法在定义的时候就存在throws关键字,这种被抛出的异常,在Thread的run方法中,只能被try-catch语句块捕获,因为run方法本身是没有throws关键字的;
被调用的方法在定义的时候不存在throws关键字,但是仍然可能抛出异常,比如在Thread的run方法中,调用String的Parse系列方法对非数字的字符进行解析,就可能会抛出NumberFormatException,这种JVM是按照如下方式处理的:
首先看当前的线程,是否在start之前,通过调用setUncaughtExceptionHandler(UncaughtExceptionHandler, eh),设置了UncaughtExceptionHandler;如果已经设置,则使用此ExceptionHandler来处理;
否则,查看当前Thread所在的ThreadGroup,是否设置了UncaughtExceptionHandler;如果已经设置,则使用此ExceptionHandler来处理;
否则,查看Thread层面是否设置了UncaughtExceptionHandler,Thread类的静态方法setDefaultUncaughtExceptionHandler进行设置;如果已经设置,则使用此ExceptionHandler来处理;
如果上述UncaughtExceptionHandler都没有找到,那么JVM会直接在console中打印Exception的StackTrace信息。
被调用的方法在定义的时候就存在throws关键字,这种被抛出的异常,在Thread的run方法中,只能被try-catch语句块捕获,因为run方法本身是没有throws关键字的;
被调用的方法在定义的时候不存在throws关键字,但是仍然可能抛出异常,比如在Thread的run方法中,调用String的Parse系列方法对非数字的字符进行解析,就可能会抛出NumberFormatException,这种JVM是按照如下方式处理的:
首先看当前的线程,是否在start之前,通过调用setUncaughtExceptionHandler(UncaughtExceptionHandler, eh),设置了UncaughtExceptionHandler;如果已经设置,则使用此ExceptionHandler来处理;
否则,查看当前Thread所在的ThreadGroup,是否设置了UncaughtExceptionHandler;如果已经设置,则使用此ExceptionHandler来处理;
否则,查看Thread层面是否设置了UncaughtExceptionHandler,Thread类的静态方法setDefaultUncaughtExceptionHandler进行设置;如果已经设置,则使用此ExceptionHandler来处理;
如果上述UncaughtExceptionHandler都没有找到,那么JVM会直接在console中打印Exception的StackTrace信息。
相关文章推荐
- java 抛出异常处理的方法
- JAVA:内层方法抛出异常 外层方法捕捉并处理异常
- 异常Java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind处理方法
- 异常Java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind处理方法
- JAVA:内层方法抛出异常 外层方法捕捉并处理异常
- 1 异常的概述和体系结构: jvm处理异常的方式和try。。。Catch处理异常:异常的抛出:如何处理多个异常:Throwable的常用的方法:异常的分类 自定义异常:
- Java编程程序异常处理方法
- java中Thread类中的start()方法与run()方法
- thread"main"java.lang.NoClassDefFoundError:ServerProgram.java 抛出异常~
- 学习java多线程的笔记1--Thread(Runnable t)与重写run()方法等
- java错误异常处理时一定要处理抛出的异常
- java中重写方法必须抛出和原方法一样的异常或者不抛异常
- JAVA简单异常处理(main方法中的args[]命令行参数传入两个操作数)
- JVM 对Java异常的处理原理
- 关于UDP消息服务抛出“远程主机强迫关闭了一个现有的连接”的异常说明及处理方法
- java继承并重写方法时抛出一样的异常或不抛异常,既不能多也不能少,范围既不能打也不能小
- Asp.Net : 捕捉和记录网站中出现的所有未处理错误,抛出详细的页面来源和访问ip,调用的接口方法及异常实例(记事本日志,系统日志及数据库日志)
- 发送邮件时遇到mail包冲突异常Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream 解决方法
- Java 中子类重写父类的方法时声明抛出异常不能比父类范围大
- JDK5_Thread的run异常的setUncaughtExceptionHandler处理