1

我对编程很陌生,因此这个问题可能看起来很傻。下面提到的方法的返回类型为 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");
    }
4

3 回答 3

2

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

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

合法的。

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

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

正常完成基本上是在方法的执行“落到底部”时,即在没有遇到 return 或 throw 语句的情况下到达方法的末尾。

所以,如果你在方法的末尾放了一个 throw 语句,执行就无法到达方法的末尾,所以是合法的。

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

于 2020-07-06T22:31:18.637 回答
1

在某些情况下,您的程序永远不会到达内部 return 语句。例如 ifnums的长度为 0 或者 ifnums[j] == target - nums[i]永远不会为真。对于这些情况,该方法需要返回一些东西或者它可以抛出异常。您可以决定您的用例的正确行为是什么。如果没有为这种情况定义任何内容,并且您的 IDE 会让您通过它,那么您将破坏代码。如果您抛出异常而不是什么都不做,那么您的 IDE 会说没问题,因为您的代码在技术层面上是正确的。

于 2020-07-06T22:04:17.010 回答
1

该异常强行将您从被调用的方法中踢出。然后强制调用方法捕获异常并继续计算,而无需访问被调用方法的返回值。

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

于 2020-07-06T22:24:55.403 回答