我在编程方面很新,因此这个问题可能看起来很愚蠢。下面提到的方法的返回类型为 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 语句永远没有必要或有用。