运行时异常和已检查异常

时间:2014-12-14 05:58:50

标签: java exception

有很多例外,并且不容易记住。是否有任何规则可以知道哪种类型的异常将属于哪种类型(运行时与已检查),因此我们知道在哪种情况下我们需要捕获,在这种情况下我们只是抛出异常?谢谢!

3 个答案:

答案 0 :(得分:0)

如果你想成为新事物只是抓住一切......(虽然只是为了懒惰但可怕的想法)否则看看javados它会告诉你每种方法扔的是什么。

try {
   // this code
} catch (Exception e) {
  e.printStackTrace();
}

是的,如果您在编译时遇到问题,则意味着它不会编译,因此不存在且无法运行。

答案 1 :(得分:0)

首先,没有例外是编译时异常。区别在于已检查异常未经检查的异常。编译器通过表现为好像每个操作(方法,构造函数和初始化程序块)签名总是在其声明中隐式包含throws Error, RuntimeException来进行区分。这样, handle-or-declare 规则,这意味着编译器强制您处理catch子句中的异常或声明带有throws声明的异常是已禁用ErrorRuntimeException - 它们始终是隐式声明的。

所以我们总体上有以下类别:

编译器处理:

  • 未经检查的异常(处理是可选的):RuntimeExceptionError
  • 已检查异常(适用处理或声明规则):所有其他例外,包括Throwable

分类

  • Error - 我们通常不会抓住这些。
  • RuntimeException - 捕捉取决于根本原因。
  • Exception - 我们必须处理或声明它们(编译器强制执行)。

Error很容易记住。如果VM或其中一个API认为它是导致问题的VM或API的缺陷,则它是Error通常我们不会抓住Error s ,虽然有一些突出的例子,例如:

  • 在资源分配代码中捕获OutOfMemoryError,以便在向用户显示错误消息后让应用程序继续。即用户想要加载太大的图片。
  • 在单元测试框架中捕获AssertionError。 (他们实际上抓住Throwable,但AssertionError被特别处理,它是测试失败,而不是测试错误。)

运行时异常是在程序正确编写时不会发生的异常,只要可能导致这些异常的条件不依赖于用户。例如,Integer.parseInt(String) throws NumberFormatException。如果转换的字符串来自程序本身,它应该是正确的,我们不会关心异常。如果转换的字符串来自用户,我们通常宁愿catch NumberFormatException而不是让用户通过错误的输入来使程序崩溃。

在故障情况有可能的情况下使用其他异常,但总是希望程序以某种方式处理它们。例如,如果您打开文件,则文件可能始终不存在,由于缺少权限或锁定而无法读取,或者存储已损坏。

答案 2 :(得分:-1)

不要捕获RuntimeExceptions和Errors,捕获其他异常或将throws添加到方法声明