为什么抛出方法签名的一部分

时间:2015-10-07 11:34:36

标签: java exception methods method-signature

为什么会抛出方法部分的签名。包含它似乎很奇怪。这是一个阻碍它的例子。

@Overide
public void foo() {
    throw new UnsupportedOperationException();
}

如果有人从外面看到这种方法,他们可能会尝试使用它而不知道它不受支持。他们只会在尝试运行代码时学习它。

但是,如果他们可以做这样的事情,他们会通过查看不受支持的方法知道,如果UnsupportedOperationException没有扩展RuntimeException,他们会收到编译错误。 EDIT1:但这是不可能的,因为throws是签名的一部分,因此覆盖将不起作用。

@Overide
public void foo() throws UnsupportedOperationException {
    throw new UnsupportedOperationException();
}

这个问题与Javas的设计有关,所以我知道如果没有其中一个工作的人可能很难回答并且回答它,但是我希望也许这个问题可能已经被问过了或者那个问题。用这种方式解释原因可能是一个明显的理由。

2 个答案:

答案 0 :(得分:5)

throws部分并不表示该方法需要抛出所提到的异常,即使在特定的位置也是如此。它只告诉该函数允许这样做。

因此,包含throws UnsupportedOperationException并不意味着该方法不受支持。除了UnsupportedOperationExceptionRuntimeException之外,所以无论如何,方法可以throw

现在因为人们会在方法的签名中要求它,它归结为完全检查异常的能力。为了使编译器能够确定方法是否只能抛出指定的异常,它必须能够确定它调用的方法不能抛出未捕获的异常。

这意味着,例如,覆盖方法意味着您无法添加可能引发的异常,否则您将无法验证调用该方法的方法是否可以抛出除此之外的其他方法。它已指定。另一种方式是可能的(但我不确定Java是否支持),覆盖一个可能抛出一个可能不会抛出的方法。

例如:

class B {
    int fubar(int) throws ExceptionA {
    }

    int frob(int) throws ExceptionA {
         return fubar(int);
    }
}

class D extends B {
    int fubar(int) throws ExceptionB {
    }
}

现在frob被指定为仅throw ExceptionA,但在调用this.fubar时,它会打开抛出其他内容的可能性,但fubar被定义为可能只有throw ExceptionA。这就是D.fubar是无效覆盖的原因,因为这会打开this.fubar实际抛出ExceptionB的可能性,编译器无法保证frob {1}}不会抛出ExceptionB

答案 1 :(得分:2)

  

Java有两种不同类型的例外:checked例外和   unchecked例外。

未经检查的例外是RuntimeException的子类,您不必添加投票声明。所有其他异常必须在方法体中处理,可以使用try / catch语句或使用throws声明。

未经检查的异常的示例:IllegalArgumentException有时用于通知,已使用非法参数调用方法。不需要投掷。

已检查异常的示例:IOException java.io包中的某些方法可能会抛出。使用try / catch或者将IOException抛出到方法声明中,并将异常处理委托给方法调用者。