Java中的Checked Vs Unchecked异常

时间:2020-01-09 10:34:57  来源:igfitidea点击:

在这篇文章中,我们将看到Java中已检查和未检查的异常之间的一些区别。在介绍检查异常与未检查异常之前,我们先来了解一下哪些异常分类为检查异常,哪个异常分类为未检查异常。

Java中的检查异常

在编写Java代码时,对于某些代码行,编译器将抱怨未处理的异常。

作为示例–如果创建一个InputStream对象以用Java读取文件。

InputStream是= new FileInputStream(new File(" D:\ test.txt")));

该语句将导致编译时错误"未处理的异常类型FileNotFoundException"。

由于上面的语句可能会抛出异常类型(FileNotFoundException),因此在编译时出现了错误,该异常在Java中被分类为已检查异常。

Java中未经检查的异常

代码中可能包含一些业务逻辑,这些逻辑可能会在运行时导致错误,某些常见原因是传递null或者超出数组长度。

例如

int[] numArr = {4,5,6};
int num = numArr[4];

上面的代码将在运行时导致ArrayIndexOutOfBoundsException,但在编译时不会像我们看到检查异常那样出现任何错误。这些类型的编译器不会强迫我们处理的异常在Java中被归类为未经检查的异常。

Java异常类层次结构中已检查和未检查的异常

在Java异常类层次结构中,Throwable在所有异常类的顶部父类中。 Throwable类的两个直接后代称为Exception类和Error类。

异常类具有一个称为RunTimeException的子类。

异常层次

如果Exception类(直接或者间接)从Exception继承,而不是从RunTimeException类继承,则它是已检查的异常。

任何可能引发检查异常的代码都必须包含在try-catch块中,以处理该异常,或者使用方法签名中的throws子句对其进行声明。否则会导致编译时错误。

从RunTimeException类继承的所有异常类以及从Error类继承的所有类统称为未经检查的异常。

对于未经检查的异常,由于编译器未强制执行,因此无需将代码放在try-catch块中或者使用throws子句声明它们。请注意,我们也可以捕获未检查的异常,也可以使用throws子句来指定它,而不会像所有已检查的异常那样强制执行。

Java中检查的异常类

下面列出了在Java中被分类为检查异常的一些类。

  • ClassNotFoundException

  • CloneNotSupportedException

  • FileNotFoundException

  • InstantiationException

  • IOException

  • ParseException

Java中未经检查的异常类

下面列出了一些在Java中被归类为未经检查的异常的类。

  • ArithmeticException

  • ArrayIndexOutOfBoundsException

  • ClassCastException

  • IllegalArgumentException

  • NullPointerException

  • NumberFormatException

  • ExceptionInInitializerError

  • OutOfMemoryError

  • StackOverflowError

Java中的Checked Vs Unchecked异常

现在,让我们尝试列出Java中已检查和未检查的异常之间的一些区别。

  • 已检查的异常将使用try-catch块捕获,或者使用throws子句指定。不这样做将导致编译时错误。不处理或者指定未经检查的异常不会导致编译时错误。

  • 受检查的异常是Exception类的子类,而未经检查的异常是RunTimeException类的子类和Error类的子类。

  • 已检查的异常是指我们希望从中恢复的那些异常。这就是编译器强制执行检查异常的原因,因为这样可以减少无法正确处理的异常数量。另一方面,未检查的异常大多数是编程错误,我们无法从中恢复错误,因此不会强制执行它来处理未检查的异常。