gpt4 book ai didi

java - 为什么当方法永远不会抛出异常时编译器允许抛出

转载 作者:太空狗 更新时间:2023-10-29 22:32:49 30 4
gpt4 key购买 nike

我想知道为什么 java 编译器允许在方法声明中抛出异常,而方法永远不会抛出异常。因为“抛出”是一种处理异常的方式(告诉调用者去处理它)。

因为有两种处理异常的方法(throws & try/catch)。在 try/catch 中,它不允许捕获未在 try block 中抛出的异常,但它允许在可能不会抛出异常的方法中抛出。

private static void methodA() {
try {
// Do something
// No IO operation here
} catch (IOException ex) { //This line does not compile because
//exception is never thrown from try
// Handle
}
}

private static void methodB() throws IOException { //Why does this //compile when excetion is never thrown in function body
//Do Something
//No IO operation
}

最佳答案

throws 子句是方法契约的一部分。它要求方法的调用者表现得好像指定的异常可能会被方法抛出(即捕获异常或声明自己的 throws 子句)。

方法的初始版本可能不会抛出 throws 子句中指定的异常,但 future 的版本可以在不破坏 API 的情况下抛出它(即调用该方法的任何现有代码仍然会通过编译)。

反之亦然。如果用于抛出 throws 子句中指定的异常的方法,但它的 future 版本不再抛出它,则应保留 throws 子句以免破坏使用您的方法的现有代码。

第一个例子:

假设您的代码使用了methodB:

private static void methodA() {
methodB(); // doesn't have throws IOException clause yet
}

如果稍后你想改变methodB抛出IOExceptionmethodA将停止通过编译。

第二个例子:

假设您的代码使用了methodB:

private static void methodA() {
try {
methodB(); // throws IOException
}
catch (IOException ex) {

}
}

如果您从 methodB 的 future 版本中删除 throws 子句,methodA 将不再通过编译。

methodAprivate 时,这个例子不是很有趣,因为它只能在本地使用(在同一个类中,很容易修改所有方法叫它)。

但是,如果它变为public,您将不知道谁使用(或将使用)您的方法,因此您无法控制所有可能因添加或更改而中断的代码删除 throws 子句。

如果它是一个实例方法,还有另一个允许 throws 子句的原因,即使你不抛出异常——该方法可以被覆盖,覆盖方法甚至可能抛出异常如果基类实现没有。

关于java - 为什么当方法永远不会抛出异常时编译器允许抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55334879/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com