class Y {
public static void main(String[] args) throws RuntimeException{//Line 1
try {
doSomething();
}
catch (RuntimeException e) {
System.out.println(e);
}
}
static void doSomething() throws RuntimeException{ //Line 2
if (Math.random() > 0.5) throw new RuntimeException(); //Line 3
throw new IOException();//Line 4
}
}
当我抛出两种类型的异常(Line4中的IOException和Line3中的RunTimeException)时,我发现直到在第1行和第2行的throws子句中指出“
IOException”之前,我的程序才会编译。
而如果我反转“ throw”以表明IOException被抛出,则程序确实会成功编译,如下所示。
class Y {
public static void main(String[] args) throws IOException {//Line1
try {
doSomething();
}
catch (RuntimeException e) {
System.out.println(e);
}
}
static void doSomething() throws IOException {//Line 2
if (Math.random() > 0.5) throw new RuntimeException();//Line 3
throw new IOException();//Line 4
}
}
为什么即使还抛出RuntimeException(第3行),我也应该始终对IOException使用“ throws”?
因为IOException
是Checked
Exception,应该处理或声明为抛出该异常。相反,RuntimeException
是一个未经检查的异常。您不需要处理或声明它在方法throws子句中抛出(在这里,我的意思是,如果您不处理未经检查的异常,则在语法上是正确的。编译器不会生气)。但是,在某些情况下,您需要处理某些Unchecked
Exception并采取相应的措施。
参考文献: