丢失返回语句,而没有投掷新的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");
    }
}

编译器无法知道您对有一个解决方案的假设。

围绕语句达到的规则实际上是基本的。特别是,由于存在外循环上的循环防护罩,而不是具有值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的值。由于这些值仅在运行时才知道,而且编译器对事先不知道的事物有点咪咪,因此它希望您提供许多将失败此情况的输入,因此从未达到返回。

>

因此,编译器可以轻松地看到,有代码路径没有适当的返回语句。抛出例外是另一种终止声明,因此使您的编译器快乐。

最新更新