我正准备参加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 :(得分:7)
在java Fork live2
中,只有一个命令行参数 - 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")
将不会被评估。
答案 1 :(得分:5)
:
args[1].equals("test")
你只有一个参数,所以args [1]抛出数组超出范围
答案 2 :(得分:2)
不使用|
,而是使用||
而不是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]);
}
}
}
答案 3 :(得分:1)
您只提供一个命令行参数。因此,在检查args 1时,您将获得ArrayIndexOutOfBound Exception ..如果您提供两个参数,它将完美地工作..