【问题标题】:missing return statement without throw new IllegalArgumentException缺少返回语句而不抛出新的 IllegalArgumentException
【发布时间】:2019-11-07 13:16:04
【问题描述】:

我正在查看 leetcode 两个 sum 代码,并且对 throw new IllegalArgumentException 语句感到困惑。代码的目标是返回两个数字的索引,以便在给定整数数组的情况下,它们相加到一个特定的目标。假设每个输入都只有一个解决方案,并且您不能两次使用相同的元素。代码如下:

如果我在没有 throw new IllegalArgumentException("No two sum solution") 的情况下运行此代码,则会显示错误消息:

第 10 行:错误:缺少返回语句 } ^

但如果我添加 throw new IllegalArgumentException("No two sum solution"),代码运行顺畅。

我的问题是,既然 假设每个输入都只有一个解决方案,那么在这种情况下为什么 throw new 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");
    }
}

【问题讨论】:

  • 您的假设对编译器没有帮助。它需要对所有可能的路径进行有效返回。
  • 感谢安迪的详细解释。这澄清了一切。

标签: java illegalargumentexception


【解决方案1】:

编译器无法知道您关于只有一种解决方案的假设。

关于语句可达性的规则实际上是非常基本的。特别是,由于外部循环上的循环保护存在,而不是值为true 的常量表达式,编译器认为循环体可能永远不会被执行。因此,您需要处理这种可能性。

因为方法是非 void 的,所以你要么返回一个值,要么抛出一个异常。

【讨论】:

    【解决方案2】:

    欢迎来到 SO!

    编译器将分析您的代码,并需要使用适当的退出语句终止通过您的代码可以到达的每条路径。

    由于您声明要返回一个整数数组,因此每条路径都必须指向一个返回语句返回该声明类型的结尾。

    由于你只能在你的 for 中的 for 中到达你的 if 中的 return,编译器可以很容易地找到绕过它的方法:

    for (int i = 0; i < nums.length; i++) {
    

    如果是num.length == 0,则不会输入。由于您不检查这一点,即使是智能编译器也必须将空数组作为有效输入(即使 null 也是有效的 - 并且会使您的函数崩溃)

    for (int j = i + 1; j < nums.length; j++) {
    

    再次,需要num.length &gt; j。由于num.length==1 是有效输入,因此您不会输入此 for 循环。

    if (nums[i] + nums [j] == target) {
    

    返回语句的最后一个障碍完全取决于数组的内容和target 的值。由于这些值仅在运行时才知道,并且编译器对它事先不知道的东西有点模仿,所以它会期望您提供许多会导致此条件失败的输入,因此永远不会达到返回值。

    因此,编译器可以很容易地看到,有些代码路径没有正确的返回语句。抛出异常是另一种终止语句,从而使您的编译器满意。

    【讨论】:

    • 感谢您的详细解释。这解决了问题。
    猜你喜欢
    • 2013-11-30
    • 2017-01-26
    • 2017-09-21
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2021-07-11
    相关资源
    最近更新 更多