论坛首页 Java企业应用论坛

异常的最终去向是哪里?

浏览 9830 次
精华帖 (0) :: 良好帖 (9) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-11  
LZ的头像很吸引人

发了篇和这个问题相关的帖子,LZ可以参考一下:http://www.iteye.com/topic/1039883
0 请登录后投票
   发表时间: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源码。只是处理请求部分就可以了。

 

0 请登录后投票
   发表时间: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)

 

 

0 请登录后投票
   发表时间:2011-05-11  
抛给了J2EE容器
0 请登录后投票
   发表时间:2011-05-11  
IcyFenix 写道
LZ的头像很吸引人

发了篇和这个问题相关的帖子,LZ可以参考一下:http://www.iteye.com/topic/1039883


图片的确是很吸引人、我还有更吸引的、但是不能再这里放、这里是学习的地方、嘿嘿、你的那篇文章我看了、感觉挺深奥的、我再多学习学习就差不多能理解吸收了、先谢谢了啊  
0 请登录后投票
   发表时间: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终止了、

0 请登录后投票
   发表时间: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()试试。

 

 

0 请登录后投票
   发表时间:2011-05-11  
sswh 写道
启动一个线程是  Thread.start()  不是Thread.run()
把代码改成start()试试。

正准备吐槽的时候发现已经被吐了…槽点啊槽点
0 请登录后投票
   发表时间: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容器应该如何去处理传播到容器的异常。
0 请登录后投票
   发表时间:2011-05-12  
RednaxelaFX 写道
sswh 写道
启动一个线程是  Thread.start()  不是Thread.run()
把代码改成start()试试。

正准备吐槽的时候发现已经被吐了…槽点啊槽点


为什么不指点指点而非要吐槽呢   
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics