为什么在这里抛出异常?
我正在为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提供值吗? 有人可以解释我发生了什么事吗? 谢谢!
在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]扔阵列越界
但我提供'java fork'作为参数,所以args的长度应该是3对吗? –
解决方案是'if(args.length == 1 || args [0] .equals(“test”)){' –
@NodirNasirov - java是执行命令,Fork是您的类名,参数从live2开始,所以你只有一个 –
而不是使用|
的,使用||
和,而不是使用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]);
}
}
}
ARGS [1]的问题 – user2953113
Downvote:粘贴的堆栈跟踪,如果你想要一个完美的解决方案。 –