锁定老帖子 主题:异常的最终去向是哪里?
精华帖 (0) :: 良好帖 (9) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-11
LZ的头像很吸引人
发了篇和这个问题相关的帖子,LZ可以参考一下:http://www.iteye.com/topic/1039883 |
|
返回顶楼 | |
发表时间:2011-05-11
最后修改:2011-05-11
Vicent_Lee 写道
问:如果产生一个异常、不对进行任何处理、这个异常最终会抛向哪里? 解析:通过上面的提示、知道方法调用栈的存在、那么这个异常的产生肯定是在在方法调用栈的栈顶的那个方法、当然我们在看控制台抛出的是异常栈、如果我们不对其进行处理、那么它会继续向下抛(栈的特性)、一次都不对其处理、最后会抛到这个栈的栈底、就是程序的起始位置、那么一个java程序的入口地址是哪里呢?main方法、对、就是这、
绝对不是main方法。
每个方法都在一个线程里运行, 在Java代码可以处理的范围内,最顶层的就是 Thread.run()方法了。
至于Thread.run()方法抛出的异常,应该是JVM处理的范围了。一般我们可以观察到的结果就是如果Thread.run()方法抛出的异常(比如RuntimeException)
JVM会把方法栈打印到System.out中。
Vicent_Lee 写道
问:那如果是J2EE应用呢?异常抛向哪里?前提也是不对其进行任何处理。 求解!
J2EE应用程序和Java应用程序本质上是一样的。
不过,对于容器来说,每一个请求到来时,都会开始一个新线程或者从线程池中重用一个线程,容器会在Thread.run()方法中捕获所有异常进行处理的。
想了解更详细的话,可以去读Tomcat源码。只是处理请求部分就可以了。
|
|
返回顶楼 | |
发表时间:2011-05-11
最后修改:2011-05-12
public static void main(String[] args) { for (int i = 0; i < 3; i++) { final Thread a = new Thread(new Runnable() { public void run() { throw new NullPointerException(); } }); Thread b = new Thread(new Runnable() { public void run() { a.start(); } }); b.start(); try { Thread.sleep(5000); } catch (InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } }
测试结果 Exception in thread "Thread-0" java.lang.NullPointerException at testexception.Main$1.run(Main.java:29) at java.lang.Thread.run(Thread.java:619) Exception in thread "Thread-2" java.lang.NullPointerException at testexception.Main$1.run(Main.java:29) at java.lang.Thread.run(Thread.java:619) Exception in thread "Thread-4" java.lang.NullPointerException at testexception.Main$1.run(Main.java:29) at java.lang.Thread.run(Thread.java:619)
|
|
返回顶楼 | |
发表时间:2011-05-11
抛给了J2EE容器
|
|
返回顶楼 | |
发表时间:2011-05-11
IcyFenix 写道 LZ的头像很吸引人
发了篇和这个问题相关的帖子,LZ可以参考一下:http://www.iteye.com/topic/1039883 图片的确是很吸引人、我还有更吸引的、但是不能再这里放、这里是学习的地方、嘿嘿、你的那篇文章我看了、感觉挺深奥的、我再多学习学习就差不多能理解吸收了、先谢谢了啊 |
|
返回顶楼 | |
发表时间:2011-05-11
最后修改:2011-05-12
sonic710 写道
public static void main(String[] args) { for (int i = 0; i < 3; i++) { final Thread a = new Thread(new Runnable() { public void run() { throw new UnsupportedOperationException("Not supported yet."); } }); Thread b = new Thread(new Runnable() { public void run() { a.start(); } }); b.start(); try { Thread.sleep(5000); } catch (InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } 测试了一下,确实中止在main线程
恩、我测试了一下、控制台抛出:
Exception in thread "Thread-0" java.lang.UnsupportedOperationException: Not supported yet. at com.xiejie.ExceptionTest2$1.run(ExceptionTest2.java:17) at java.lang.Thread.run(Unknown Source) Exception in thread "Thread-2" java.lang.UnsupportedOperationException: Not supported yet. at com.xiejie.ExceptionTest2$1.run(ExceptionTest2.java:17) at java.lang.Thread.run(Unknown Source) Exception in thread "Thread-4" java.lang.UnsupportedOperationException: Not supported yet. at com.xiejie.ExceptionTest2$1.run(ExceptionTest2.java:17) at java.lang.Thread.run(Unknown Source) 按照我的理解是从这个异常栈的上面往下找、到这at java.lang.Thread.run(Unknown Source)是说的异常抛给了:Thread.run() 那下一步该到JVM终止了、 |
|
返回顶楼 | |
发表时间:2011-05-11
最后修改:2011-05-11
Vicent_Lee 写道
sonic710 写道
public static void main(String[] args) { for (int i = 0; i < 3; i++) { final Thread a = new Thread(new Runnable() { public void run() { throw new UnsupportedOperationException("Not supported yet."); } }); Thread b = new Thread(new Runnable() { public void run() { a.run(); } }); b.run(); try { Thread.sleep(5000); } catch (InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } 测试了一下,确实中止在main线程
恩、我测试了一下、控制台抛出:
Exception in thread "main" java.lang.UnsupportedOperationException: Not supported yet. at com.xiejie.ExceptionTest2$1.run(ExceptionTest2.java:17) at java.lang.Thread.run(Unknown Source) at com.xiejie.ExceptionTest2$2.run(ExceptionTest2.java:22) at java.lang.Thread.run(Unknown Source) at com.xiejie.ExceptionTest2.main(ExceptionTest2.java:25) 按照我的理解是从这个异常栈的上面往下找、到这at java.lang.Thread.run(Unknown Source)是说的异常抛给了:Thread.run() 那下一步该到JVM终止了、但是这个异常栈的最底部却又回到了at com.xiejie.ExceptionTest2.main(ExceptionTest2.java:25)这个地方就是b.run();这条语句 但是终归还是main方法、
启动一个线程是 Thread.start() 不是Thread.run()
把代码改成strat()试试。
|
|
返回顶楼 | |
发表时间:2011-05-11
sswh 写道 启动一个线程是 Thread.start() 不是Thread.run()
把代码改成start()试试。 正准备吐槽的时候发现已经被吐了…槽点啊槽点 |
|
返回顶楼 | |
发表时间:2011-05-11
Vicent_Lee 写道 gzyyygyf 写道 java程序由JVM掌控,异常也不例外,JVM收到异常就会中断线程的执行
就是说、当这个异常产生了、异常被抛到异常栈的底部调用者、如果这个调用者同样没有处理、拿着个异常会抛给JDK/JRE的JVM、JVM会终止这个异常线程的执行、是这么一个过程吧、 那这个异常会不会对Tomcat有影响呢? 小弟现在也糊涂了、天天都要上班、学校还一堆毕业的事情、毕业设计到现在还没着落呢、哎、 Tomcat对异常的处理主要由StandardHostValve和ErrorReportValve来处理,具体可以参考这篇文章:http://www.goldendoc.org/2011/02/tomcat_host/ Tomcat对异常的处理主要是根据JSR154来做的,里面有讲Servlet容器应该如何去处理传播到容器的异常。 |
|
返回顶楼 | |
发表时间:2011-05-12
RednaxelaFX 写道 sswh 写道 启动一个线程是 Thread.start() 不是Thread.run()
把代码改成start()试试。 正准备吐槽的时候发现已经被吐了…槽点啊槽点 为什么不指点指点而非要吐槽呢 |
|
返回顶楼 | |