为什么在这里抛出异常?

问题描述:

我正在为OCA考试做准备,并阅读了很多,所以今天我看到了一个问题。 下面是一个代码:为什么在这里抛出异常?

public class Fork { 
    public static void main(String[] args) { 
    if (args.length == 1 | args[1].equals("test")) { 
     System.out.println("Test case"); 
    } else { 
     System.out.println("production " + args[0]); 
    } 
    }  
} 

和命令行调用:

java Fork live2 

我认为答案应该是"production java" 但得到的答复是"An exception is thrown at runtime"。 这是为什么?我们正在为args提供值吗? 有人可以解释我发生了什么事吗? 谢谢!

+0

ARGS [1]的问题 – user2953113

+1

Downvote:粘贴的堆栈跟踪,如果你想要一个完美的解决方案。 –

java Fork live2只有1个命令行参数 - live2

args.length == 1 | args[1].equals("test")是OR运算符不短路,这意味着两个操作数都保证进行评估(||是OR运算如果左操作数是假的是短路和仅评估右操作数),因此,如果如在java Fork live2中所做的那样,您提供单个命令行参数,args[1].equals("test")仍然会被评估并抛出ArrayIndexOutOfBoundsException异常。

如果你改变你的条件

if (args.length == 1 || args[1].equals("test")) 

你会得到Test case印刷,因为args.length == 1将是真实的,并args[1].equals("test")将不进行评估。

在你的if语句:

args[1].equals("test") 

你只有一个参数,因此ARGS [1]扔阵列越界

+0

但我提供'java fork'作为参数,所以args的长度应该是3对吗? –

+0

解决方案是'if(args.length == 1 || args [0] .equals(“test”)){' –

+1

@NodirNasirov - java是执行命令,Fork是您的类名,参数从live2开始,所以你只有一个 –

你给只需要一个命令行参数。因此,尽管检查ARGS 1,你得到ArrayIndexOutOfBound例外。如果你给两个参数,它会很好地工作.. my output

而不是使用|的,使用||和,而不是使用args[1].equals("test")使用args[0].equals("test")

到底应该是这个样子:

public class Fork { 
    public static void main(String[] args) { 
    if (args.length == 1 || args[0].equals("test")) { 
     System.out.println("Test case"); 
    } else { 
     System.out.println("production " + args[0]); 
    } 
    }  
}