`
Vicent_Lee
  • 浏览: 55442 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

异常的最终去向是哪里?

阅读更多

 

什么是异常:程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。异常本身是一个对象,产生异常就是产生了一个异常对象。异常都是从类Throwable派生出来。包括运行时异常和飞运行时异常。(这个多说无益,知道怎么处理就行)

 

如何产生的:是由系统自动实例化一个异常对象。那这里的系统指的就是JVM。当然、我们可以自己new一个异常对象将其抛出。

 

自定义异常:可以通过继承Exception或者其子类。

 

如何处理异常:通过try…catch…finally语句进行捕获异常。当然也可以不处理异常、通过关键字throws继续传递异常。注:没有try块、catch不能单独存在。Finally块永远都执行、除非你在catch块中退出系统(System.exit(0))try块中只有return并不能终止finally块的执行。RuntimeException的任何子类都无需再throws子句中声明。

 

异常传递:当我们不对产生的异常做任何处理、那么这个异常何去啊?它会向它的调用者传递这个异常。

 

方法调用栈:在程序中、没有说一个方法就像全部的东西的实现、而是充分的独立、一个方法处理一件事情、那么如果我有一个方法、需要使用另一个方法的处理结果、那么我没就在这个方法中调用另一个方法(如何调用?自己想)、这就是方法调用栈、通过这个“栈“,我们就知道它是什么特性了(后进先出)、

 

问:如果产生一个异常、不对进行任何处理、这个异常最终会抛向哪里?

解析:通过上面的提示、知道方法调用栈的存在、那么这个异常的产生肯定是在在方法调用栈的栈顶的那个方法、当然我们在看控制台抛出的是异常栈、如果我们不对其进行处理、那么它会继续向下抛(栈的特性)、一次都不对其处理、最后会抛到这个栈的栈底、就是程序的起始位置、那么一个java程序的入口地址是哪里呢?main方法、对、就是这、

 

问:那如果是J2EE应用呢?异常抛向哪里?前提也是不对其进行任何处理。

求解!

 

 

挺有意思的文章:http://www.iteye.com/topic/765287

透过JVM看Exception的本质:http://www.iteye.com/topic/857722

J2EE项目异常处理:http://www.iteye.com/topic/72170

译JVMS3 §2.10 Exceptionhttp://www.iteye.com/topic/1039883

异常处理艺术:http://zhxing.iteye.com/blog/374307

分享到:
评论
27 楼 Vicent_Lee 2011-05-13  
RednaxelaFX 写道
Vicent_Lee 写道
RednaxelaFX 写道
sswh 写道
启动一个线程是  Thread.start()  不是Thread.run()
把代码改成start()试试。

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


为什么不指点指点而非要吐槽呢   

因为昨晚忙…本来想写一帖的,诶等有空吧。
有兴趣的话可以看看Thread.UncaughtExceptionHandler和ThreadGroup.uncaughtException相关。这算是指点么?


又木有关于这方面的书籍给推荐一本?
26 楼 Vicent_Lee 2011-05-13  
RednaxelaFX 写道
Vicent_Lee 写道
RednaxelaFX 写道
sswh 写道
启动一个线程是  Thread.start()  不是Thread.run()
把代码改成start()试试。

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


为什么不指点指点而非要吐槽呢   

因为昨晚忙…本来想写一帖的,诶等有空吧。
有兴趣的话可以看看Thread.UncaughtExceptionHandler和ThreadGroup.uncaughtException相关。这算是指点么?


给点路子总比什么都没有强啊、我这是个初学者、什么都不会呢、需要各路神仙指点啊、
25 楼 cttnbcj 2011-05-13  
ravenex 写道
cttnbcj 写道
玩JAVA的人,80%不知道异常去哪里。。。
异常和调试子系统+系统中断密切关联。
JVM只是调用调试子系统已而。。。。

请教一下楼上的大大,Java的异常跟调试子系统的关系是什么?调试子系统指的是什么,是JDPA说的调试系统吗?还是GDB、WinDBG那样?


科普小说,看一下吧。
http://baike.baidu.com/view/272933.htm
24 楼 cttnbcj 2011-05-13  
科普小说,看一下吧。
http://baike.baidu.com/view/272933.htm
23 楼 ravenex 2011-05-12  
cttnbcj 写道
玩JAVA的人,80%不知道异常去哪里。。。
异常和调试子系统+系统中断密切关联。
JVM只是调用调试子系统已而。。。。

请教一下楼上的大大,Java的异常跟调试子系统的关系是什么?调试子系统指的是什么,是JDPA说的调试系统吗?还是GDB、WinDBG那样?
22 楼 cttnbcj 2011-05-12  
玩JAVA的人,80%不知道异常去哪里。。。
异常和调试子系统+系统中断密切关联。
JVM只是调用调试子系统已而。。。。
21 楼 sonic710 2011-05-12  
<div class="quote_title">sswh 写道</div>
<div class="quote_div">
<div class="quote_title">Vicent_Lee 写道</div>
<div class="quote_div">
<div class="quote_title">sonic710 写道</div>
<div class="quote_div">
<pre name="code" class="java"> public static void main(String[] args)
    {
        for (int i = 0; i &lt; 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);
            }
        }</pre>
<p> 测试了一下,确实中止在main线程</p>
</div>
<p> </p>
<p>恩、我测试了一下、控制台抛出:</p>
<p> </p>
<pre name="code" class="java">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)</pre>
<p> 按照我的理解是从这个异常栈的上面往下找、到这<span style="white-space: pre;">at java.lang.Thread.run(Unknown Source)</span>是说的异常抛给了:Thread.run()</p>
<p>那下一步该到JVM终止了、但是这个异常栈的最底部却又回到了<span style="white-space: pre;">at com.xiejie.ExceptionTest2.main(ExceptionTest2.java:25)这个地方就是b.run();这条语句</span></p>
<p>但是终归还是main方法、</p>
</div>
<p> </p>
<p><span style="color: #ff0000;">启动一个线程是  Thread.start()  不是Thread.run() </span></p>
<p> </p>
<p>把代码改成strat()试试。</p>
<p> </p>
<p> </p>
</div>
<p><br>啊哦,低级失误</p>
20 楼 RednaxelaFX 2011-05-12  
Vicent_Lee 写道
RednaxelaFX 写道
sswh 写道
启动一个线程是  Thread.start()  不是Thread.run()
把代码改成start()试试。

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


为什么不指点指点而非要吐槽呢   

因为昨晚忙…本来想写一帖的,诶等有空吧。
有兴趣的话可以看看Thread.UncaughtExceptionHandler和ThreadGroup.uncaughtException相关。这算是指点么?
19 楼 Vicent_Lee 2011-05-12  
RednaxelaFX 写道
sswh 写道
启动一个线程是  Thread.start()  不是Thread.run()
把代码改成start()试试。

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


为什么不指点指点而非要吐槽呢   
18 楼 khotyn 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容器应该如何去处理传播到容器的异常。
17 楼 RednaxelaFX 2011-05-11  
sswh 写道
启动一个线程是  Thread.start()  不是Thread.run()
把代码改成start()试试。

正准备吐槽的时候发现已经被吐了…槽点啊槽点
16 楼 sswh 2011-05-11  
<div class="quote_title">Vicent_Lee 写道</div>
<div class="quote_div">
<div class="quote_title">sonic710 写道</div>
<div class="quote_div">
<pre name="code" class="java"> public static void main(String[] args)
    {
        for (int i = 0; i &lt; 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);
            }
        }</pre>
<p> 测试了一下,确实中止在main线程</p>
</div>
<p> </p>
<p>恩、我测试了一下、控制台抛出:</p>
<p> </p>
<pre name="code" class="java">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)</pre>
<p> 按照我的理解是从这个异常栈的上面往下找、到这<span style="white-space: pre;">at java.lang.Thread.run(Unknown Source)</span>是说的异常抛给了:Thread.run()</p>
<p>那下一步该到JVM终止了、但是这个异常栈的最底部却又回到了<span style="white-space: pre;">at com.xiejie.ExceptionTest2.main(ExceptionTest2.java:25)这个地方就是b.run();这条语句</span></p>
<p>但是终归还是main方法、</p>
</div>
<p> </p>
<p><span style="color: #ff0000;">启动一个线程是  Thread.start()  不是Thread.run() </span></p>
<p> </p>
<p>把代码改成strat()试试。</p>
<p> </p>
<p> </p>
15 楼 Vicent_Lee 2011-05-11  
<div class="quote_title">sonic710 写道</div>
<div class="quote_div">
<pre name="code" class="java"> public static void main(String[] args)
    {
        for (int i = 0; i &lt; 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);
            }
        }</pre>
<p> 测试了一下,确实中止在main线程</p>
</div>
<p> </p>
<p>恩、我测试了一下、控制台抛出:</p>
<p> </p>
<pre name="code" class="java">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)</pre>
<p> 按照我的理解是从这个异常栈的上面往下找、到这<span style="white-space: pre;">at java.lang.Thread.run(Unknown Source)</span>是说的异常抛给了:Thread.run()</p>
<p>那下一步该到JVM终止了、</p>
14 楼 Vicent_Lee 2011-05-11  
IcyFenix 写道
LZ的头像很吸引人

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


图片的确是很吸引人、我还有更吸引的、但是不能再这里放、这里是学习的地方、嘿嘿、你的那篇文章我看了、感觉挺深奥的、我再多学习学习就差不多能理解吸收了、先谢谢了啊  
13 楼 niclg 2011-05-11  
抛给了J2EE容器
12 楼 sonic710 2011-05-11  
<pre name="code" class="java"> public static void main(String[] args)
    {
        for (int i = 0; i &lt; 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);
            }
        }
    }</pre>
<p>  </p>
<p>测试结果</p>
<pre name="code" class="java">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)</pre>
<p> </p>
<p> </p>
11 楼 sswh 2011-05-11  
<div class="quote_title">Vicent_Lee 写道</div>
<div class="quote_div">
<p> </p>
<p class="MsoNormal"><span>问:如果产生一个异常、不对进行任何处理、这个异常最终会抛向哪里?</span></p>
<p class="MsoNormal"><span>解析:通过上面的提示、知道方法调用栈的存在、那么这个异常的产生肯定是在在方法调用栈的栈顶的那个方法、当然我们在看控制台抛出的是异常栈、如果我们不对其进行处理、那么它会继续向下抛(栈的特性)、一次都不对其处理、最后会抛到这个栈的栈底、就是程序的起始位置、那么一个</span><span lang="EN-US">java</span><span>程序的入口地址是哪里呢?</span><span lang="EN-US">main</span><span>方法、对、就是这、</span> </p>
</div>
<p> </p>
<p>绝对不是main方法。</p>
<p> </p>
<p>每个方法都在一个线程里运行, 在Java代码可以处理的范围内,最顶层的就是 Thread.run()方法了。</p>
<p> </p>
<p>至于Thread.run()方法抛出的异常,应该是JVM处理的范围了。一般我们可以观察到的结果就是如果Thread.run()方法抛出的异常(比如RuntimeException)</p>
<p> </p>
<p>JVM会把方法栈打印到System.out中。</p>
<p> </p>
<p> </p>
<div style="color: #000000; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff; margin: 8px;">
<div class="quote_title" style="font-weight: bold; margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; padding: 5px;">Vicent_Lee 写道</div>
<div class="quote_div" style="margin-top: 0px; margin-right: 5px; margin-bottom: 5px; margin-left: 15px; background-color: #fafafa; padding: 3px; border: 1px solid #cccccc;">
<p style="margin: 0px;"> </p>
<p class="MsoNormal" style="margin: 0px;"><span>问:那如果是</span><span lang="EN-US">J2EE</span><span>应用呢?异常抛向哪里?前提也是不对其进行任何处理。</span></p>
<p class="MsoNormal" style="margin: 0px;"><span>求解!</span></p>
<p class="MsoNormal" style="margin: 0px;"> </p>
</div>
</div>
<p>J2EE应用程序和Java应用程序本质上是一样的。</p>
<p> </p>
<p>不过,对于容器来说,每一个请求到来时,都会开始一个新线程或者从线程池中重用一个线程,容器会在Thread.run()方法中捕获所有异常进行处理的。</p>
<p> </p>
<p>想了解更详细的话,可以去读Tomcat源码。只是处理请求部分就可以了。</p>
<p> </p>
10 楼 IcyFenix 2011-05-11  
LZ的头像很吸引人

发了篇和这个问题相关的帖子,LZ可以参考一下:http://www.iteye.com/topic/1039883
9 楼 Vicent_Lee 2011-05-11  
zhangyou1010 写道
楼主喜欢错别字吗?

错别字这个问题、我没法解决啊、我用SOUGUO输入法、能理解就行呗、谁敢保证自己打字没错别字啊
8 楼 zhangyou1010 2011-05-11  
楼主喜欢错别字吗?

相关推荐

Global site tag (gtag.js) - Google Analytics