Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 缺少没有抛出新IllegalArgumentException的返回语句_Java_Illegalargumentexception - Fatal编程技术网

Java 缺少没有抛出新IllegalArgumentException的返回语句

Java 缺少没有抛出新IllegalArgumentException的返回语句,java,illegalargumentexception,Java,Illegalargumentexception,我正在看leetcode的两个和代码,对抛出新的IllegalArgumentException语句感到困惑。代码的目标是返回两个数字的索引,以便在给定整数数组的情况下,将它们相加到特定的目标。假设每个输入都有一个解决方案,并且不能使用同一元素两次。代码如下: 如果我运行此代码时没有抛出新的IllegalArgumentException(“无二和解决方案”),则会显示错误消息: 第10行:错误:缺少return语句 } ^ 但是,如果我添加throw新的IllegalArgumentExcep

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

如果我运行此代码时没有抛出新的IllegalArgumentException(“无二和解决方案”),则会显示错误消息:

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

但是,如果我添加throw
新的IllegalArgumentException(“无二和解决方案”)
,代码运行会很平稳

我的问题是,既然假定每个输入只有一个解决方案,那么在这种情况下,抛出新的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");
    }
}
类解决方案{
公共int[]twoSum(int[]nums,int目标){
对于(int i=0;i
编译器无法知道您关于只存在一个解决方案的假设

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

由于该方法是非void的,因此必须返回值或引发异常。

欢迎使用SO

编译器将分析您的代码,并需要使用正确的exit语句终止代码中可以到达的每个路径

由于您声明返回一个整数数组,因此每个路径都必须指向return语句返回该声明类型的端点

由于只能在if-in-for-in-for中找到返回值,编译器可以很容易地找到一种解决方法:

for (int i = 0; i < nums.length; i++) {
同样,需要
num.length>j
。因为
num.length==1
是一个有效的输入,所以您不会为循环输入这个值

if (nums[i] + nums [j] == target) {
返回语句的最后一个障碍完全取决于数组的内容和
target
的值。由于这些值只有在运行时才知道,而且编译器对它事先不知道的事情有点模棱两可,因此它希望您提供许多将使此条件失败的输入,因此永远不会返回


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

您的假设对编译器没有帮助。它需要所有可能路径的有效返回。感谢Andy的详细解释。这澄清了一切。谢谢你的详细解释。这就解决了问题。
if (nums[i] + nums [j] == target) {