我正在看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");
}
}
答案 0 :(得分:3)
编译器无法知道您对存在唯一一种解决方案的假设。
关于语句可及性的规则实际上是非常基本的。特别是,由于存在外部循环上的循环保护,而不是具有值true
的常量表达式,因此编译器认为循环体可能永远不会执行。因此,您需要处理这种情况。
由于该方法是非无效的,因此您必须返回一个值或引发异常。
答案 1 :(得分:1)
欢迎您!
编译器将分析您的代码,并需要使用适当的exit语句终止可以到达的所有代码路径。
由于您声明要返回整数数组,因此每个路径都必须通向return语句返回该声明类型的结尾。
由于您只能在for内的if内获得收益,因此编译器可以轻松地找到解决方法:
for (int i = 0; i < nums.length; i++) {
如果num.length == 0
,则不会输入。由于您无需进行检查,因此即使智能编译器也必须期望将空数组作为有效输入(即使null为有效-也会使函数崩溃)
for (int j = i + 1; j < nums.length; j++) {
再次,需要num.length > j
。由于num.length==1
是有效的输入,因此您将不会输入此for循环。
if (nums[i] + nums [j] == target) {
return语句的最后一个障碍完全取决于数组的内容和target
的值。由于这些值仅在运行时才知道,并且编译器对它之前不知道的东西有点模仿,因此期望您提供许多输入来使此条件失败,因此永远不会达到返回值。
因此,编译器可以很容易地看到,有些代码路径没有正确的return语句。引发异常是另一种终止语句,因此使您的编译器满意。