为什么会抛出异常?

时间:2015-09-26 18:44:42

标签: java arrays exception

我正准备参加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提供价值吗? 有人可以解释一下发生了什么事吗? 谢谢!

4 个答案:

答案 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)

你的if语句中的

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 ..如果您提供两个参数,它将完美地工作.. my output