缺少返回语句而未引发新的IllegalArgumentException

时间:2019-06-25 16:33:03

标签: java illegalargumentexception

我正在看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");
    }
}

2 个答案:

答案 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语句。引发异常是另一种终止语句,因此使您的编译器满意。