我正在查看leetcode两个总代码,并对投掷新的illegalargumentException语句感到困惑。代码的目的是返回两个数字的索引,以便给定整数数组,将它们汇总到特定的目标。假定每个输入将完全具有一个解决方案,并且您可能不会两次使用相同的元素。这是代码:
如果我在不投掷new IllegalArgumentException("No two sum solution")
的情况下运行此代码,则显示错误消息:
第10行:错误:缺少返回语句 } ^
但是,如果我添加了throw new IllegalArgumentException("No two sum solution")
,则代码运行顺利。
我的问题是,由于假定每个输入都有一个解决方案,因此在这种情况下,为什么要投掷新的IllegalargumentException。
class Solution {
public 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[i] + nums [j] == target) {
return new int[] {i, j};
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
编译器无法知道您对有一个解决方案的假设。
围绕语句达到的规则实际上是基本的。特别是,由于存在外循环上的循环防护罩,而不是具有值true
的恒定表达式,因此编译器认为循环主体可能永远不会执行。因此,您需要处理该最终性。
由于该方法是非空隙的,因此您必须返回值或投掷异常。
欢迎来到so!
编译器将分析您的代码,并需要通过适当的退出声明终止可以达到的代码的每个路径。
由于您声明返回整数阵列,因此每个路径必须导致返回语句返回声明类型的结束。
由于您只能在内部的内部返回,因此编译器可以轻松找到围绕它的方法:
for (int i = 0; i < nums.length; i++) {
如果num.length == 0
,将不会输入。由于您不检查此问题,即使是智能编译器,也必须期望一个空数组作为有效输入(即使无效 - 有效 - 并且会崩溃您的功能(
for (int j = i + 1; j < nums.length; j++) {
再次需要num.length > j
。由于num.length==1
是有效的输入,因此您不会输入此循环。
if (nums[i] + nums [j] == target) {
您的返回语句的最后障碍完全取决于数组的内容和target
的值。由于这些值仅在运行时才知道,而且编译器对事先不知道的事物有点咪咪,因此它希望您提供许多将失败此情况的输入,因此从未达到返回。
因此,编译器可以轻松地看到,有代码路径没有适当的返回语句。抛出例外是另一种终止声明,因此使您的编译器快乐。