为什么引发未经检查的异常会消除"缺少返回语句"错误



我在编程方面很新,因此这个问题可能看起来很愚蠢。下面提到的方法的返回类型为 int 数组。当我们不抛出任何未经检查的异常时,它会抛出一个我理解的错误。但是,为什么包含未经检查的异常会消除该错误?它仍然没有任何返回语句,不正确吗?

public static int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] { i, j };
}
}
}
//throw new IllegalArgumentException("No two sum solution");
}

在具有非 void 返回类型的方法中没有返回语句的实际要求。例如:

int huh() {
while (true) {}
}

是合法的。

要求是该方法无法正常完成 (JLS(:

如果将方法声明为具有返回类型 (§8.4.5(,则当方法的主体可以正常完成 (§14.1( 时,将发生编译时错误。

正常完成基本上是当执行"从方法的底部掉下来"时,即到达方法的末尾而不遇到返回或抛出语句。

因此,如果您在方法末尾放置一个 throw 语句,则执行无法到达方法的末尾,因此这是合法的。

在上面huh()示例中,while 循环无法正常完成,因此执行无法到达方法的末尾,因此您不需要返回或抛出。

在某些情况下,程序永远不会到达内部返回语句。 例如,如果nums的长度为 0 或nums[j] == target - nums[i]永远不会为真。对于这些情况,该方法需要返回某些内容,或者可以引发异常。对于您的用例,正确的行为由您决定。如果没有为这种情况定义任何内容,并且您的 IDE 会让您完成它,那么您的代码就会损坏。如果您抛出异常而不执行任何操作,则 IDE 会说它很好,因为您的代码在技术层面上是正确的。

异常会强制将您从被调用的方法中分离出来。然后,调用方法被强制捕获异常并继续计算,而不访问被调用方法的返回值。

如果异常是不可避免的/无条件的,那么后面的 return 语句永远没有必要或有用。

相关内容

  • 没有找到相关文章

最新更新