`
Vicent_Lee
  • 浏览: 56208 次
  • 性别: 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  
楼主喜欢错别字吗?

相关推荐

    (检验科)医疗废物收集交接登记表.doc

    - 在登记表中记录最终去向,有助于追踪废物处理的全过程,防止非法处理。 5. **备注**: - 这一栏用于记录任何特殊情况,比如废物超量、特殊处理需求或异常事件,确保所有相关信息都被记录下来。 医疗废物的管理...

    医疗废物收集交接登记表.pdf

    表格中的“最终去向”一栏用于记录废物的处理情况,如焚烧、填埋或其他安全处理方式。 6. **监督与签名**:在交接过程中,除了收集和接收人员的签名外,还需要监督人的签名,以确保整个流程的透明度和合规性,防止...

    危险废物接收入库管理制度.pdf

    IQC进行形态和包装检查,判定去向并取样分析;仓管员最终确认入库,监督卸货过程。 - **废物入库**:仓管员填写物料卡、标签、手工台账等,物控员在系统中办理入库,记录管理需按规范化要求存档。 5. **相关文件**...

    成品检验报告 空白.doc

    - 客户订单号码:关联到具体的销售订单,便于了解产品的最终去向和需求。 - 检验日期:记录检验的具体时间,确保信息的时效性。 - 品名与规格:描述产品的具体类型和尺寸,确保检验符合产品特性。 - 订单数量与...

    软件工程需求分析概述.pdf

    6. 错误处理需求:定义系统在面对错误或异常情况时的响应方式,以保证系统能够正确处理异常,防止数据丢失或系统崩溃。 在进行需求分析时,通常会采用以下方法: - 访谈:通过与用户进行正式或非正式的交谈,了解...

    2021-2022计算机二级等级考试试题及答案No.2735.docx

    15. **题目内容**:“查询”菜单下的“查询去向”命令指定了查询结果的输出去向,输出去向不包括? - A. 报表 - B. 标签 - C. 文本文件 - D. 图形 **正确答案**:C **解析**: - 查询结果可以输出到报表、...

    山东省临沂市罗庄区2013届九年级生物一轮验收试题 新人教版

    11. 氧的最终去向:人体吸收的氧气主要用于氧化分解有机物,释放能量,因此C选项正确。 12. 血液成分分析:根据表格数据,1是尿液,因为其中蛋白质和葡萄糖含量为0,尿素含量高。 13. 视觉形成过程:光线依次经过...

    山东省吕标初中2020学年七年级生物下学期第一次月考试题(无答案) 新人教版.doc

    21. 人体吸收的氧最终去向:人体吸收的氧主要用于氧化分解有机物,释放能量供生命活动使用。 以上是对试题内容涉及知识点的详细解析,涵盖了生物课程中的基础营养、消化系统、呼吸系统、新陈代谢等多个方面。

    成品检验汇总表.doc

    《成品检验汇总表》是质量管理中的重要工具,主要用于记录和分析产品的最终检查结果,确保出厂产品的质量符合标准。这份文档通常包含多个关键组成部分,旨在提供一个全面、系统的方式来跟踪和控制生产过程中的品质...

    银行存款收支日报表(表格模板、DOC格式).doc

    3. **票据号码**:对于涉及支票或电子转账等非现金支付方式的交易,票据号码是确认交易的重要依据,能帮助财务部门跟踪资金的去向。 4. **摘要**:摘要部分简明扼要地描述了交易的内容,例如“销售收入”、“采购...

    2021-2022计算机二级等级考试试题及答案No.14070.docx

    4. C++源程序文件的默认扩展名为`.cpp`,编译后生成的目标文件扩展名为`.obj`,最终链接生成可执行文件的扩展名通常是`.exe`。 5. 对于面向对象编程,类C中的实例方法是可以被子类覆盖的,这是多态性的体现。选项A...

    安徽省阜阳市第九中学2015_2016学年七年级生物下学期期末考试试题.doc

    14. 氧气的最终去向:氧气最终在细胞内参与氧化分解有机物,释放能量(题目中的第十五题)。 15. 呼吸运动:图中甲表示吸气,膈肌收缩;乙表示呼气,膈肌舒张(题目中的第十六题)。 16. 呼吸系统健康:森林公园内...

    制造过程记录单.doc

    每个工序都有其特定的任务和目标,确保产品从原材料转化为最终成品。而“上道工序名称”和“下道工序名称”则明确了工序之间的逻辑关系,前一工序的产出是后一工序的输入,形成有序的生产流程。 “要求完工时间”是...

    2008年研究生数学建模c题

    - **作业流程**:车辆根据货物去向解体、集结、编组,最终形成新列车待发,整个过程需控制在一定时间内,以保持高效运转。 #### 知识点八:限制条件与目标指标 - **重量与长度限制**:每辆重车不超过80T,列车总...

    生产用料记录单.doc

    1. **物料管理**:物料管理是企业运营的核心部分,包括采购、存储、发放和跟踪原材料,以及中间产品和最终产品的过程。有效的物料管理能提高生产效率,减少浪费,降低库存成本。 2. **生产状况记录**:生产用料记录...

    材料提交日报表模板.doc

    首先,报表的日期部分是记录每日提交情况的基础,年、月、日的填写有助于追踪和分析物料流动的时间序列数据,从而发现规律或异常,及时调整采购策略。例如,通过分析历史数据,可以预测未来的物料需求高峰期,提前...

    公司可视化办法.doc

    总的来说,公司可视化办法是通过视觉工具和系统化的方法,提升企业管理水平,降低错误率,增强安全意识,优化工作流程,最终提高整体生产力和质量。通过实施这些模块,企业可以创建一个更加透明、有序的工作环境,...

    数据挖掘在研究生教育管理信息系统中的应用.pdf

    数据挖掘的任务可以分为关联分析、聚类分析、分类分析、异常分析、特异群组分析和演变分析等。其中,聚类分析法是将对象集合分成由相似对象组成的多个类的过程,常用的算法包括划分法、层次法、基于密度的方法、基于...

Global site tag (gtag.js) - Google Analytics