Java - “throws”子句中的异常未从正文中抛出

我有一个像下面这样的课程:


public class MyClass {


    public void foo() throws IOException {

        System.out.println("Hola");

    }


    public MyClass() throws IOException {


    }


}

如您所见,我在方法和构造函数IOException的throws子句中进行了声明。但我不会在身体的任何地方抛出这个异常。所以它应该是一个编译时错误,就像我们试图捕获一个不是从 try 块抛出的异常一样。但在这种情况下,它编译得很好。谁能解释这种行为背后的原因?


慕森王
浏览 174回答 3
3回答

ITMISS

声明throws IOException并不要求您实际抛出异常。如果是这种情况,那么将无法编程,因为该方法的所有分支都需要抛出异常(即使在非异常情况下)。这更像是一个拥有完整合约的问题,其中调用者可以处理可能的异常。这适用于可能被迫实际抛出异常的未来实现。可能出于同样的原因,允许重写的方法省略已检查的异常(您不会被迫抛出它)

慕姐4208626

Show Stopper 有一个很好的答案并引用了一个很好的帖子。这个答案试图帮助 OP 了解什么是受检查和未经检查的异常。检查异常是在签名中声明的异常(无论是否抛出)。public void doSomething() throws SomeExtremelyDevastatingEndOfTheWorldException {    // Maybe it might happen (but whoever calls this MUST acknowledge handle this case)}这个应用程序不会编译,因为作者认为必须处理这种情况才能运行应用程序。未经检查的异常是不一定需要处理并且可以在运行时冒泡的异常。public void doSomething() {    throws RuntimeException("not the end of the world...but we'll probably want this stacktrace and let the program run on");}现在,如果作者希望,任何异常都可以成为未经检查的异常。

蝴蝶刀刀

声明 throws IOException 不需要该方法抛出异常。它是方法签名的一部分,也是设计软件的一部分。考虑下面的例子。Interface 中有一种方法和它的两种实现。无论是否抛出异常,两个实现都应该具有相同的签名。他们可以忽略异常条款。所以这是编译器在编译时无法显示错误的有效原因。Interface parent {     void method() throws Exception}Class Implementation1 {    void method() throws Exception {        System.out.println("Do not throws exception");    }}Class Implementation2 {    void method() throws Exception {        throw new Exception("Error");    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java