`
terry0501
  • 浏览: 305524 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

checked异常和unchecked异常

 
阅读更多

Java异常分为两种类型,checked异常和unchecked异常,另一种叫法是异常和错误。

简单地讲,checked是可以在执行过程中恢复的,而unchecked异常则是无法处理的错误。

checked异常:

  • 表示无效,不是程序中可以预测的。比如无效的用户输入,文件不存在,网络或者数据库链接错误。这些都是外在的原因,都不是程序内部可以控制的。
  • 必须在代码中显式地处理。比如try-catch块处理,或者给所在的方法加上throws说明,将异常抛到调用栈的上一层。
  • 继承自java.lang.Exception(java.lang.RuntimeException除外)。

unchecked异常:

  • 表示错误,程序的逻辑错误。是RuntimeException的子类,比如IllegalArgumentException, NullPointerException和IllegalStateException。
  • 不需要在代码中显式地捕获unchecked异常做处理。
  • 继承自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已经说明了调用哪些方法可能会抛出异常。如果不做处理编译就不能通过,从某种程度上说,这种做法可以避免程序的一些错误。

两个简单的例子

1. checked异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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才能编译。

2. unchecked异常

1
2
3
4
5
6
7
8
9
10
11
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异常。

自定义异常

1. checked异常

自定义异常类InvalidUrlException

1
2
3
4
5
public class InvalidUrlException extends Exception {
public InvalidUrlException(String s){
super(s);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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。

2. unchecked异常

如果将InvalidUrlException改成extends RuntimeException,

1
2
3
4
5
public class InvalidUrlException extends Exception {
public InvalidUrlException(String s){
super(s);
}
}

那么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异常。

分享到:
评论

相关推荐

    详解Java中的checked异常和unchecked异常区别

    主要介绍了详解Java中的checked异常和unchecked异常区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java的checked和unchecked异常

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

    通过实例了解java checked和unchecked异常

    主要介绍了通过实例了解checked和unchecked异常,Java异常分为两种类型,checked异常和unchecked异常,另一种叫法是异常和错误。下面小编就带大家来一起学习一下吧

    什么是Java中的异常处理机制?Java中的异常分为哪些类型?(java面试题附答案).txt

    Java中的异常分为三种类型:检查型异常(Checked Exception)、非检查型异常(Unchecked Exception)和错误(Error)。 检查型异常(Checked Exception): 这些异常在代码中必须进行显式处理,否则编译器会报错。 ...

    基础深化和提高-异常机制

    Java中的异常分为已检查异常(checked exception)和未检查异常(unchecked exception)。已检查异常需要在方法签名中声明或者通过try-catch块进行捕获和处理,否则编译器会报错。未检查异常通常是RuntimeException...

    Python中处理unchecked未捕获异常实例

    和Java一样,python也提供了对于checked exception和unchecked exception. 对于checked exception,我们通常使用try except可以显示解决,对于unchecked 异常,其实也是提供回调或者是钩子来帮助我们处理的,我们可以在...

    探讨c#中的unchecked是什么意思,起什么作用?

    Checked与Unchecked 对于因为整数类型参与算术操作和类型转换时产生的“溢出异常”——System.OverflowException,在某些算法来讲不算真正的“异常”,相反这种溢出常常为程序所用。C#通过引入checked和unchecked...

    java异常与日志课程2.docx

    所有异常都是Throwable的子类,分为Error(致命异常)和Exception(非致命异常)。Error是一种非常特殊的异常类型,它的出现标识着系统发生了不可控...Exception又分为checked异常(受检异常)和unchecked异常(非受检异常)。

    《Java程序设计案例教程》教学课件07异常处理.pptx

    7.2 异常与异常类 7.2.3 未受检异常 属于RuntimeException类及其子类的异常和Error类及其子类的异常被称为未受检异常(unchecked exception)。未受检异常在编译阶段不能被Java编译器检测到。不强迫用户利用异常...

    Android 捕获运行时异常详解

    Android 异常分为两类:CheckedException 和 UnCheckedException CheckException:在编译代码时就需要进行try()catch捕获的。 UnCheckException:所有的运行时异常,RuntimeException类和他的子类,都是在APP运行...

    java中异常的笔试题-java_interview_questions:发表于https://sathish2905.github.io/j

    和Error 之外,直接继承Throwable class称为Checked 异常,例如IOException、SQLException 等。Checked 异常在编译时检查。 2. Unchecked Exception :继承RuntimeException的类被称为 unchecked 异常,例如 ...

    java 面试常见问题整理

    Checked Exception 和 Unchecked Exception 有什么区别? Throwable 类常用方法有哪些? try-catch-finally 如何使用? finally 中的代码一定会执行吗? 如何使用 try-with-resources 代替try-catch-finally? I/O ...

    软件工程课后习题宝典

    java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不...

    zdp072#java-interview#Java基础知识1

    Java有两种类型的异常:checked(检查)与unchecked(未检查)异常.checked异常必须通过方法或构造函数的throws子句显式声明.unch

    Android崩溃异常捕获方法

    那么今天主要讲一下如何去捕捉系统出现的Unchecked异常。何为Unchecked异常呢,换句话说就是指非受检异常,它不能用try-catch来显示捕捉。 我们先从Exception讲起。Exception分为两类:一种是CheckedException,一...

    exception-framework

    在java的世界里,异常是一个永恒的话题,很...使用checked exception 还是 unchecked exception?成为了衡量一个java程序员是高手还是菜鸟的标准。exception-framework提供了一种托管异常的方案,值得我们去研究学习。

    同花顺java面试笔试题-Java-Interview:面试问题和程序

    和Error 之外,直接继承Throwable class称为Checked 异常,例如IOException、SQLException 等。Checked 异常在编译时检查。 2. Unchecked Exception :继承RuntimeException的类被称为 unchecked 异常,例如 ...

    同花顺java面试笔试题-java-interview-questions:java面试题

    和Error 之外,直接继承Throwable class称为Checked 异常,例如IOException、SQLException 等。Checked 异常在编译时检查。 2. Unchecked Exception :继承RuntimeException的类被称为 unchecked 异常,例如 ...

    同花顺java面试笔试题-Interview-Questions:Java面试问题

    和Error 之外,直接继承Throwable class称为Checked 异常,例如IOException、SQLException 等。Checked 异常在编译时检查。 2. Unchecked Exception :继承RuntimeException的类被称为 unchecked 异常,例如 ...

    同花顺java面试笔试题-java-interview-:java-面试-

    和Error 之外,直接继承Throwable class称为Checked 异常,例如IOException、SQLException 等。Checked 异常在编译时检查。 2. Unchecked Exception :继承RuntimeException的类被称为 unchecked 异常,例如 ...

Global site tag (gtag.js) - Google Analytics