异常不需要被抛出,但IOException异常
为什么下面的代码编译正常,但被调用的方法不需要抛出Exception
?是不是Exception
检查异常,而不是未经检查的异常?请澄清。异常不需要被抛出,但IOException异常
class App { public static void main(String[] args) {
try {
amethod();
System.out.println("try ");
} catch (Exception e) {
System.out.print("catch ");
} finally {
System.out.print("finally ");
}
System.out.print("out ");
}
public static void amethod() { }
}
如果我想使用一个IOexception
尝试捕捉(checked exception)时,该方法被调用需要扔IOException
。我明白了。
import java.io.IOException; class App {
public static void main(String[] args) {
try {
amethod();
System.out.println("try ");
} catch (IOException e) {
System.out.print("catch ");
} finally {
System.out.print("finally ");
}
System.out.print("out ");
}
public static void amethod() throws IOException { }
}
回答:
不是 '例外' checked异常,而不是一个未经检查的异常?
是的。
但即使我们知道该方法本身不会丢弃Exception
本身,代码catch(Exception e){
仍然可以执行。 try
块中的代码仍然可以抛出继承自Exception
的内容。这包括RuntimeException
及其子类,它们未被选中。
catch(IOException e){
另一方面,只能捕获检查异常。 (Java不允许多继承,所以任何属于IOException
的子类都不可能是RuntimeException
的子类。)编译器可以很容易地发现try
块中的任何代码都不可能抛出IOException
(因为任何引发检查异常的方法都必须明确地说明),从而允许它标记代码。
回答:
您正在观察的行为来自Java语言规范在这种情况下专门处理Exception
的事实。据§11.2.3:
这是一个编译时错误,如果catch子句能赶上检查异常E类,这是不是相当于
catch
子句try
块的情况下可以抛出除E 为Exception
或Exception
的超类之外的作为E 的子类或超类的检查异常类。
这是合理的,因为Exception
(和它的超类Throwable
)可以被用来捕捉延伸RuntimeException
也异常。由于运行时异常总是可行的,编译器总是允许Exception
出现在catch
子句中,而不管是否存在已检查的异常。
以上是 异常不需要被抛出,但IOException异常 的全部内容, 来源链接: utcz.com/qa/260881.html