2

我想知道Java中已处理和未处理的异常之间的区别。哪一个我应该使用 try/catch 块,以及当我必须扩展 throwables 时。

另外,如果我扩展 throwables,我是否总是必须在单独的类中处理异常?

如果要在单独的类中处理异常,我可以创建自定义功能(例如调用另一个方法或中断循环)而不是仅使用自定义消息覆盖超级构造函数吗?

4

1 回答 1

9

我认为“已处理和未处理”的异常是指“已检查和未检查”。

未经检查的异常- 所有扩展 RuntimeException 的类都称为未经检查的。它们通常表示编程错误,例如逻辑错误或 API 使用不当。

未经检查的异常示例:

● ArithmeticException
● NullPointerException
● IndexOutOfBoundsException
● IllegalArgumentException
● ClassCastException

例如,如果您尝试访问仅包含 5 个单元格的数组的第 10 个单元格,则会导致 ArrayIndexOutOfBoundsException。这是程序员的错误,也是程序员的错,所以应该这样对待。不应使用 try/catch 处理此异常,而应使用 if 语句检查数组的大小。

Checked exception s - 这些是编写良好的应用程序应该预测并从中恢复的异常情况。Java 中的已检查异常扩展了 Exception 类,但不扩展 RuntimeException 类。检查的异常受“<strong> Catch or Specify Requirement ”的约束:

当在方法体中某些代码可能会抛出已检查的异常时,该方法必须要么处理此异常,要么指定它可能会抛出此异常

检查异常的示例:

● FileNotFoundException
● IOException
● SQLException

例如,您可能有一个编写得很好的代码,可以将数据读取或写入文件,但该文件可能会突然被另一个用户从文件系统中删除。这不是程序员的错误,但它可能发生,因此您必须预测并处理这种情况。

总结一下:未经检查的异常应该被处理try/catch——它们应该被视为一个错误并且应该被修复(或通过if语句避免)。当然,您可以使用 try/catch 块来处理RuntimeException(例如NullPointerException),但这不是一个好习惯。

已检查的异常必须使用块处理,try/catch或者当方法不知道如何处理它们时,应将它们声明为由方法本身抛出。因此,处理异常的责任转移到调用这个方法的方法上。这就是Catch or Specify要求所说的。

于 2016-02-10T17:21:06.360 回答