`
zqc_0101
  • 浏览: 229733 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

区分运行时异常和受检查异常【文摘+转】

    博客分类:
  • java
阅读更多

正确运用异常处理机制,有助于提高程序的健壮性。

 

所谓程序的健壮性,就是指程序在多数情况下能够正常运行,返回预期的正确结果;如果偶尔遇到异常情况,程序也能采取周到的解决措施。

 

受检查异常表示程序可以处理的异常,如果抛出异常的方法本身不能处理它,那么方法调用者应该去处理它,从而使程序恢复运行,不至于终止程序。例如,喷墨打印机在打印文件时,如果纸用完或者墨水用完,就会暂停打印,等待用户添加打印纸或更换墨盒,如果用户添加了打印纸或更换了墨盒,就能继续打印。

 

可以用OutOfPaperException类和OutOfInkException类来表示纸张用完和墨水用完这两种异常情况,由于这些异常是可修复的,因此是受检查异常,可以把它们定义为Exception类的子类:

public class OutOfPaperException extends Exception{…}  
public class OutOfInkException extends Exception{…}

 

以下是打印机的print()方法:

public void print()
{
    while(文件未打印完)
    {
        try
        { 
            打印一行      
        }
        catch(OutOfInkException e)
        {        
             do
             {
                 等待用户更换墨盒
             }
             while(用户没有更换墨盒)      
        }
        catch(OutOfPaperException e)
        {  
             do
             {          
                  等待用户添加打印纸        
             }
             while(用户没有添加打印纸)      
        }    
    }  
}

 

运行时异常表示无法让程序恢复运行的异常,导致这种异常的原因通常是由于执行了错误操作。一旦出现了错误操作,建议终止程序,因此Java编译器不检查这种异常。

 

如果程序代码中有错误,就可能导致运行时异常,如以下for语句的循环条件不正确,会导致ArrayIndexOutOfBoundsException:

public void method(int[] array)
{
    for (int i = 0; i <=array.length; i++)
    { 
        // 当i的取值为array.length时,将抛出ArrayIndexOutOfBoundsException
        array[i] = 1;
    }
} 

 

只要对程序代码做适当修改,就能避免数组下标越界异常:

public void method(int[] array)
{
    for (int i = 0; i <array.length; i++)
    { 
        // 当i的取值为array.length时,将抛出ArrayIndexOutOfBoundsException
        array[i] = 1;
    }
} 

 

再例如对于以下代码,如果变量m为null,访问"m.name"会导致NullPointerException异常:

Monkey m=null;  
if(m!==null & m.name.equals("Tom"))
{……}

 

只要对程序代码做适当修改,就能避免NullPointerException异常:

Monkey m=null;  
if(m!==null && m.name.equals("Tom"))
{……}

 

由此可见,运行时异常是应该尽量避免的,在程序调试阶段,遇到这种异常时,正确的做法是改进程序的设计和实现方式,修改程序中的错误,从而避免这种异常。捕获它并且使程序恢复运行并不是明智的办法,因为即使程序恢复运行,可能会导致程序的业务逻辑错乱,导致更严重的异常,或者得到错误的运行结果。

 

java什么情况下必须用throws抛出异常?
答:在程序中抛出了非RuntimeException异常却没有对其处理(用try catch块处理)的情况下,必须在方法头throws该异常。

 

什么情况下需要自定义异常呢?

通常情况下是程序运行状态与用户的预先定义的逻辑不符合,但程序并不能识别这种逻辑错误时需自定义异常。比如某个方法的参数只能接受0~9的数字,数字1除外,万一用户要是输入了1,我们可以自定义一个异常来处理1这个意外,从而控制程序流程等。

 

什么情况下捕获异常应该立即处理呢?

比如说接收用户输入整型值,而用户却输入了不能解析成整型的字符串,这会抛出异常,我们不应该往外抛,而应该立即处理之,提示用户输入合法的值,待用户输入合法值之后,接着往下执行程序。捕获到异常之后一般处理办法是输出错误日志,或者给用户一些提示。

 

[转文]

Exception异常分为:RuntimeException(运行时异常,也叫未检查异常或不受检查异常)和已检查异常(或受检查异常):

 

已检查异常 是指程序员已经足够小心的检查了他的代码,但是还是不能保证代码不出现异常;如,程序要访问某个文件,但访问时文件不存在,这和程序本身没有太大关系;再如,程序要进行网络连接,但执行时没有连接网线,这些问题都是已检查异常。

 

未检查异常 一般是由程序员没有细心检查代码,而导致的如空指针异常、数组越界、类型转换异常等都是由于程序员粗心大意造成的。这些异常是在编码过程中是能够避免的。

 

看到此你需要思考:我们需要处理的到底是已检查异常还是未检查异常?如一幢大楼运行过程中被雷击中,这肯定是已检查异常,但运行过程中发现有个地方四周没有窗户和门,这就是未检查异常,那到底我们需要针对哪个异常进行应急预案呢?当验收大楼时肯定政府部门要检查你的抗震级别,消防措施等,这些措施是你在修建时必须考虑,而且要求是强制执行的,那么这个要求就是必须处理的,如果不处理则编译通不过。如果出现未检查异常,那就只能加门或窗户,即修改代码了。

 

从另外一个角度来讲,已检查异常(受检查异常)就是受编译器检查的异常。

 

运行时异常,属于RuntimeException类及子类范围的类(以及衍生类)都属于运行时异常。

 

受检查异常,在Exception范围内,除了运行时异常的类都是受检查异常类,为checked exception

 

它们之间的区别在于:

例如在代码中写了 throw new Exception(); 和 throw new RuntimeException();  两者都会在运行期间抛出异常!

(1)但是在编译阶段前者属于抛出一个受检查异常,要求对它进行显式的try..catch捕获处理或者向上一层方法抛出,否则在编译期间就显示错误!

 

(2)后者抛出是运行时异常,在编译阶段不予检查,语法上不会显示任何错误(throws处没声明不会出错,但最好声明)!

所以简单的通过throw手动抛出受检查异常和抛出运行时异常,前者要求显式处理,后者不要求作出处理。


我以为的设计原则:

(1)受检查异常如FileNotFoundException,编译时期受检查,提醒用户try{}catch{}或者throw到上一层,当然你可以一直throw直至抛给虚拟机,然而这并不是好的方式,因为对于这个异常,我们是可以进行一些处理,挽救的,比如我们可以在捕获到异常的时候,提醒用户"找不到文件",用户就可以根据这个信息,把相应文件放到指定位置,从而解决问题,并不需要终止程序,或者修改代码。

 

(2)而对于非受检查异常如ArrayIndexOutOfBoundsException(数组越界异常),编译时期不提供错误检查,我想是因为,针对这个错误,用户是无能为力的,同样程序员也是部分无能为力的,你不可能通过try{}catch{}去捕获这个异常之后,再去增加数组容量。这时你所能做的,只能是去修改代码,如修改数组容量,或换个自增的数据结构。这种运行时错误,只能通过在编译阶段,依靠程序员的小心谨慎来避免。


(完)

 

 

分享到:
评论
1 楼 jongsuny 2013-08-17  
http://kimnote.com/2013/08/java%E4%B8%ADerror%E4%B8%8Eexception%E7%9A%84%E5%8C%BA%E5%88%AB/

相关推荐

    winsock编程网路文摘+实例

    1. **多线程编程**:当处理多个并发连接时,可以利用VB的多线程功能,每个连接在一个单独的线程中运行,以提高性能和响应性。 2. **套接字选项和属性**:Winsock提供多种套接字选项,如SO_REUSEADDR、SO_LINGER等,...

    Java编程技术文摘

    Java提供了异常类层次结构,分为检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。检查异常在编译期间就必须被处理,如IOException和SQLException。而运行时异常则在程序执行过程中发生,如...

    红盾文摘浏览器红盾文摘浏览器

    2. **安全检查**:在下载和运行setup.exe之前,应确保来源可靠,防止下载到含有恶意软件的文件。 3. **许可协议**:安装前需阅读并同意软件的许可协议,了解软件的使用条款和隐私政策。 4. **安装路径**:可以选择...

    vb精华文摘-api篇

    声明时需要指定函数名、库名、参数类型和返回值类型。 2. **API函数调用**:API函数的参数通常是ByVal或ByRef,前者传递副本,后者传递引用。理解参数传递方式对正确调用API至关重要。 3. **常量与数据类型**:API...

    基于潜在语义索引和句子聚类的中文自动文摘

    ### 基于潜在语义索引和句子聚类的中文自动文摘 #### 引言及背景 随着互联网的迅速发展,文本资源的数量呈现爆炸式增长,这使得从海量文本中高效地提取有价值信息变得至关重要。自动文摘技术正是为解决这一问题而...

    RS232开发技术文摘

    RS232技术文摘RS232技术文摘RS232技术文摘RS232技术文摘RS232技术文摘RS232技术文摘RS232技术文摘RS232技术文摘RS232技术文摘RS232技术文摘RS232技术文摘RS232技术文摘RS232技术文摘RS232技术文摘RS232技术文摘RS232...

    华为文摘第十四辑(PDF,mobi,epub,doc)

    这份文摘通过PDF、EPUB、MOBI和DOC等多种格式,为读者提供了便捷的阅读体验,适应不同设备的需求。华为作为全球领先的ICT(信息与通信技术)解决方案提供商,其内部文摘是了解公司文化、管理理念以及技术创新的重要...

    C语言学习和精华文摘

    C语言学习和精华文摘.chm C语言教程 C程序100例 唯C论坛精华贴

    寻梦文摘 v1.0

    "寻梦文摘 v1.0" 是一个用于创建和管理静态网页的程序,它能够自动化更新网站内容,提供了一种高效的方式维护个人或小型企业的在线存在。在介绍这个程序之前,我们首先需要理解几个核心概念和技术。 ASP,全称...

    初中语文文摘生活山不转路转

    初中语文文摘生活山不转路转

    BCB编程文摘

    文摘可能会讲解如何有效地捕获和处理运行时错误,以提高程序的健壮性。 4. **多线程编程**:为了实现并发操作,BCB提供了TThread类。开发者可能需要了解如何创建和管理线程,以及线程间的数据共享和同步机制。 5. ...

    多文档自动文摘.pdf

    本文分别讨论了基于抽取的文摘生成算法和基于理解的文摘生成方法。 ##### 4.1 基于抽取的文摘生成 基于抽取的方法直接从原文档中选择代表性句子形成文摘。这种方法简单有效,但在保证文摘流畅性和连贯性方面存在...

    VB精华文摘-api

    《VB精华文摘-api》是针对Visual Basic编程语言中API(Application Programming Interface)使用的深入探讨和精选摘要。API是软件开发中的一个重要概念,它是一组预定义的函数、类、对象和常量,允许开发者通过调用...

    基于LDA主题特征的自动文摘方法

    在现代信息技术的浪潮中,自动文摘技术已成为人们处理海量信息时不可或缺的工具。随着数据量的激增,如何从繁杂的文档中快速准确地提炼出有价值的信息显得尤为重要。LDA模型的提出,为这一需求提供了新的可能性。 ...

    用遗传算法实现自动文摘

    标题 "用遗传算法实现自动文摘" 指涉的核心技术是遗传算法(Genetic Algorithm,GA)在自然语言处理中的应用,特别是自动文摘领域。自动文摘是指通过计算机程序从大量文本中提取关键信息,生成简洁、连贯的摘要,而...

Global site tag (gtag.js) - Google Analytics