`
terry0501
  • 浏览: 313628 次
  • 性别: 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异常区别

    对checked异常和unchecked异常进行区分的原因是编译器将检查是否为所有的checked异常提供了异常处理机制。如果程序中没有处理checked异常,编译器将报错。这样可以确保程序的正确性和可靠性。 四、应该对哪些异常...

    Java的checked和unchecked异常

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

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

    Java 异常分为两种类型:checked 异常和 unchecked 异常。checked 异常是可以在执行过程中恢复的,例如无效的用户输入、文件不存在、网络或者数据库链接错误等。这些错误都不是程序内部可以控制的,必须在代码中显式...

    Checked and Unchecked Exception

    与Checked异常不同,Unchecked异常在编译时不强制要求处理,但良好的编程实践仍然建议对这些异常进行适当的处理。未处理的Unchecked异常可能导致程序突然崩溃,影响用户体验。 StrutsTestCase是Apache Struts框架的...

    java 异常详解,java异常分类,创建自己的异常

    异常可以分为两大类:-checked 异常和 unchecked 异常。Checked 异常必须在编译时捕捉并处理,而 unchecked 异常可以在编译时忽略,但是在运行时总是会被抛出。 在 Java 中,每个异常都是一个对象,它是 java.lang....

    java异常处理习题

    * `throw` 语句可以抛出 checked 异常和 unchecked 异常。 八、异常处理的 best practice * 尽量避免使用 `catch` 子句来捕捉所有异常,而是根据实际情况捕捉特定的异常类型。 * 使用 `finally` 子句来释放资源和...

    Java异常处理策略研究.pdf

    Java 异常类可以分为两大类:checked 异常和 unchecked 异常。checked 异常是编译器检查的异常,需要在编译时处理;unchecked 异常是运行时异常,不需要在编译时处理。 三、Java 异常处理方法 Java 异常处理方法...

    J2EE应用程序的异常处理框架

    首先,我们要区分两种类型的异常:checked异常和unchecked异常。Checked异常是那些在编译时就需要被捕获或声明的异常,比如IOException和SQLException。它们通常代表了程序中可以预见的错误,需要调用者处理或传递给...

    Java异常处理与自定义异常.pdf

    Java 异常处理可以分为两大类:checked 异常和 unchecked 异常。 checked 异常是指编译器可以检查的异常,例如 NullPointerException、ArrayIndexOutOfBoundsException 等。这些异常可以在编译阶段被检查和捕获,以...

    Java异常故障模式分析.pdf

    Java 异常处理机制可以分为两类:checked 异常和 unchecked 异常。checked 异常是指编译器强制要求捕获的异常,而 unchecked 异常是指编译器不强制要求捕获的异常。 三、Java 异常处理机制的故障模式 1. catch ...

    java中常见的异常类

    在 Java 中,异常可以分为两种: checked 异常和 unchecked 异常。checked 异常是编译器检查的异常,我们需要在编译时处理这些异常。unchecked 异常是运行时异常,我们需要在运行时处理这些异常。 了解和掌握这些...

    Java中常用异常列表.pdf

    在Java中,异常可以分为两大类:checked异常和unchecked异常。checked异常是编译器强制检查的异常,unchecked异常是运行时异常。在本文中,我们将对Java中常用的6种unchecked异常进行详细的解释。 1. java.lang....

    Java平台统一异常框架归类.pdf

    在JavaEye论坛上,有关Checked异常和Unchecked异常的讨论很多,简而言之,Checked异常是在编译时需要处理的异常,而Unchecked异常则可以在运行时处理。 程序异常的处理通常涉及异常信息的国际化,以适应不同地区的...

    基于Java语言的异常处理机制的研究.pdf

    在Java语言中,异常处理机制可以分为两种:checked异常和unchecked异常。checked异常是编译器强制检查的异常,例如IOException、SQLException等;unchecked异常是编译器不强制检查的异常,例如RuntimeException、 ...

    java 异常处理

    在Java异常体系中,Exception类有两大分支:checked异常和unchecked异常。Checked异常(已检查异常)是指那些必须在代码中进行捕获处理的异常,它们都是非RuntimeException的子类。这类异常通常代表外部环境问题,...

    JAVA面试2.pdf

    1. Java中的两种异常类型是checked异常和unchecked异常。Checked异常需要在方法或构造函数上声明,而unchecked异常不需要声明。 2. Exception和Error都是Throwable的子类,Exception用于用户程序可以捕获的异常情况...

    Error类和Exception类剖析

    Exception是所有可抛出异常的基类,分为两种主要类型:Checked异常和Unchecked异常。 1. Checked异常(例如IOException、SQLException等)是可控制的,意味着在编译期间必须显式处理这些异常。如果一个方法可能抛出...

    java期末复习代码 5个 记事本 异常 文件复制 socket编程 数据库

    在这个项目中,你将学习如何使用这些结构,以及如何定义自定义异常,理解Checked异常和Unchecked异常的区别。 文件复制是另一个关键点。Java的IO流提供了解决这个问题的工具,如FileInputStream和FileOutputStream...

    编程语言JavaExceptionTool知识点.pdf

    而Exception是指程序本身可以处理的异常情况,分为checked异常和unchecked异常。 Checked异常必须被显式地捕获处理,否则程序无法通过编译。它包括了IOException、ClassNotFoundException等。unchecked异常又称为...

Global site tag (gtag.js) - Google Analytics