为什么RuntimeException不需要显式的异常处理?

9
一般来说,在Java中处理异常有两种方式:
  1. 在方法签名中添加throws声明
  2. 使用try/catch块包围代码。
然而,我注意到一些异常,特别是那些继承自RuntimeException的异常,不需要显式的异常处理。
例如,我创建了一个下面的示例方法,并标记了“不需要”不需要显式的异常处理。
public void textException(){
    int i = (new Random()).nextInt(100);

    switch (i){
    case 1:
        throw new NullPointerException();   //Not required
    case 2:
        throw new NumberFormatException();  //Not required
    case 3:
        throw new RuntimeException();       //Not required
    case 4:         
        throw new ClassNotFoundException(); //Required
    case 5:
        throw new IOException();            //Required
    case 6:
        throw new Exception();              //Required
    default:
        return;
    }
}

我注意到RuntimeException是继承自Exception的。
为什么RuntimeException不需要显式捕获即可编译,而其他Exceptions则需要呢?

3
这些在Java中被称为已检查异常和未检查异常。这些已经在SO上讨论过很多次,请参考https://dev59.com/DW025IYBdhLWcg3wRDq8 - Pradeep Simha
一个方法在声明 throws 子句时不需要声明任何 RuntimeException 的子类,这些子类可能在方法执行过程中被抛出但未被捕获。 - sudmong
2个回答

3

1

对于Java而言,RuntimeException被认为是系统异常,通常情况下它是不可恢复的,因此你不需要在方法上添加throws声明或使用try catch块来处理它。然而,Exception被认为是应用程序异常,它是可以恢复的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接