2015-09-26 141 views
2

我正在爲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:粘貼的堆棧跟蹤,如果你想要一個完美的解決方案。 –

回答

7

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")將不進行評估。

5

在你的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開始,所以你只有一個 –

1

你給只需要一個命令行參數。因此,儘管檢查ARGS 1,你得到ArrayIndexOutOfBound例外。如果你給兩個參數,它會很好地工作.. my output

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]); 
    } 
    }  
} 
相關問題