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