美文网首页
(转)Java的checked和unchecked异常

(转)Java的checked和unchecked异常

作者: congnie116 | 来源:发表于2017-09-25 21:11 被阅读0次

Java异常分为两种类型,checked异常和unchecked异常,另一种叫法是异常和错误。
简单地讲,checked是可以在执行过程中恢复的,而unchecked异常则是无法处理的错误。

checked异常:

1、表示无效,不是程序中可以预测的。比如无效的用户输入,文件不存在,网络或者数据库链接错误。这些都是外在的原因,都不是程序内部可以控制的。

2、必须在代码中显式地处理。比如try-catch块处理,或者给所在的方法加上throws说明,将异常抛到调用栈的上一层。

3、继承自java.lang.Exception(java.lang.RuntimeException除外)。

unchecked异常:

1、表示错误,程序的逻辑错误。是RuntimeException的子类,比如IllegalArgumentException, NullPointerException和IllegalStateException。

2、不需要在代码中显式地捕获unchecked异常做处理。

3、继承自java.lang.RuntimeException(而java.lang.RuntimeException继承自java.lang.Exception)。

Java中的checked异常需要在代码中显式地通过try-catch捕获或者再抛出,如果不需要对这个异常做处理,可以简地将异常再次抛出,这种异常存在一点不足,很多人习惯在代码中直接写一个空的catch块,这样不但使代码变得有些冗余和“丑陋”,而且给调试带来麻烦,增加了代码维护的难度。所以有人说checked使代码变的冗长,空的catch块也没什么意义,所以checked异常应该从Java标准中去除,像C#中就没有checked异常的概念,C#中不强制显式地捕获异常。
Java异常之所以会分为这两种,应该是出于如下考虑:
checked异常可以帮助开发人员意识到哪一行有可能会出现异常,因为Java的API已经说明了调用哪些方法可能会抛出异常。如果不做处理编译就不能通过,从某种程度上说,这种做法可以避免程序的一些错误。

两个简单的例子:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class Main {
    public static void main(String[] args) {
        File f = new File("C:\test.txt");
        FileReader r = new FileReader(f); //A
        BufferedReader br = new BufferedReader(r);
        br.readLine(); //B
        br.close(); //C
    }
}

这段代码不能通过编译,原因是A,B和C行会抛出IOException,必须将这段代码放入try-catch块中,或者给main方法加上throws IOException才能编译。

public class Main {
    public static void main(String[] args) {
        int a = 0;
        int b = 100;
        int c = b/a;
    }
}

可以编译,但执行会报错
Exception in thread “main” java.lang.ArithmeticException: / by zero at Main.main(Main.java:13)
ArithmeticException是一个unchecked异常。

自定义异常

checked异常

自定义异常类InvalidUrlException

public class InvalidUrlException extends Exception {
    public InvalidUrlException(String s){
        super(s);
    }
}
public class Main {
    public static void getRemoteData(String url) throws InvalidUrlException{
        if(isValidUrl(url)){
        //获取远程数据
        }
        else {
            throw new InvalidUrlException("Invalid URL: " + url);
        }
    }

    public static boolean isValidUrl(String url){
        .... //验证URL是否有效
    }

    public static void main(String[] args) {
        getRemoteData(args[0]);
    }
}

如果在main方法里调用getRemoteData,有两种做法,一种是try-catch,另一种则是直接给main加上throws InvalidUrlException。

unchecked异常

如果将InvalidUrlException改成extends RuntimeException,那么main不需要再加throws或者try-catch。

选择checked还是unchecked异常?

一些Java书籍建议使用checked异常处理程序中所有可恢复的异常,而用unchecked异常作为无法恢复的错误。但是实际上那些继承自RuntimeException的Java异常大多也可以在程序中恢复的,比如NullPointerException、IllegalArgumentExceptions、除0异常等等都可以通过捕获处理使程序继续运行。只有一些特殊情况会破坏程序的执行,比如启动的时候读取配置文件,如果配置文件不存在或者有严重错误,程序只好退出。

以下是是支持和反对checked异常的一些观点:

1、编译器强制捕获或者抛出unchecked异常使开发人员时刻记着要处理异常。

2、抛出checked异常的方法必须声明throws,throws成为了方法或者接口的一部分,给后续版本增加或者修改方法的异常带来不便。

3、unchecked异常不需要显式地处理反而使异常处理变的困难。

4、调用checked异常的方法,就必须处理这个方法的异常,这使得上层的调用者代码混乱。
选择checked还是unchecked都是由你自己决定的,很难说哪种就一定正确,反之就一定错误。目前比较流行的语言中,Java似乎是唯一支持checked异常的语言,其他语言都只有unchecked异常。

相关文章

  • Spring事务与回滚原理(异常篇)

    checked异常和unchecked异常 这里之所以让大家清楚checked异常和unchecked异常概念,是...

  • Checked and Unchecked Exceptions

    前言 Java异常分为两大类:checked exceptions 和 unchecked exceptions。...

  • (转)Java的checked和unchecked异常

    Java异常分为两种类型,checked异常和unchecked异常,另一种叫法是异常和错误。简单地讲,check...

  • Java异常

    Java中所有的异常都是派生于Throwablepeople的一个实例 一、checked异常和unchecked...

  • Java异常处理

    描述: 1.checked异常和unchecked异常 2.异常处理类的封装 一、checked异常和unchec...

  • 异常

    异常类 异常分为受检异常(checked exception)和非受检异常(unchecked exception...

  • unchecked和checked异常

    派生于Error或者RuntimeException的异常称为unchecked异常,所有其他的异常称为check...

  • 如何理解java中checked exception和unche

    Java中存在两种异常,一种是checked exception,一种是unchecked exception。 ...

  • Java - checked 和 unchecked excep

    简书 賈小強转载请注明原创出处,谢谢! 在我们所从事的许多项目中,我们看到了各种不同的编码,代码格式,类的命名方式...

  • Java异常

    Java异常 java异常分为两大类,Checked异常和Runtime异常,Checked异常都是在编译阶段可以...

网友评论

      本文标题:(转)Java的checked和unchecked异常

      本文链接:https://www.haomeiwen.com/subject/moadextx.html