欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-19 16:32:52
java异常分为两种类型,checked异常和unchecked异常,另一种叫法是异常和错误。 简单地讲,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异常

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异常

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

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。

2. unchecked异常

如果将invalidurlexception改成extends runtimeexception

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异常的一些观点:

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

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

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

调用checked异常的方法,就必须处理这个方法的异常,这使得上层的调用者代码混乱。

选择checked还是unchecked都是由你自己决定的,很难说哪种就一定正确,反之就一定错误。目前比较流行的语言中,java似乎是唯一支持checked异常的语言,其他语言都只有unchecked异常。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。