2012-09-10 55 views
8

我的東西有點困惑。我寫了一個小代碼片段。java的args數組中的main()方法混亂(空檢查)

import java.util.*; 
class AA 
{ 
    public static void main(String args[]) 
    { 
    if(args == null) 
    { 
      System.out.println("I am null"); 
    } 
    else{ 
      System.out.println(args); 
     } 
} 
} 

這是一個簡單的測試。我雖然不是從傳遞作爲參數的命令行 什麼,但還是參數表是不爲空,這意味着JVM初始化爲 像String數組。爲什麼背後有任何具體原因?我很好奇 知道。任何指針都會有幫助。 謝謝, 本

+0

[Args保證爲非null?](http://stackoverflow.com/questions/9605532/args-guaranteed-to-be-non-null),http://程序員。 stackexchange.com/questions/120355/is-it-better-to-return-null-or-empty-values-from-functions-method s-where-the-ret –

回答

6

當你不及格的話,就是args不是null - 它

if(args.length == 0) 
{ 
     System.out.println("I am empty"); 
} else{ 
     System.out.println(args); 
} 
+2

這種行爲是否在語言規範中說明了任何地方?任何參考? – kosa

+0

args是一個數組並且代表命令行參數,並且它由JVM初始化(在調用main的程序初始化時),所以數組永遠不會爲空... – aleroot

+1

@Nambari我在找那個,但我找不到明確的答案:在第12.1節中,他們說:「初始類被指定給Java虛擬機的方式超出了本規範的範圍,但在主機環境中使用命令行,將該類的完全限定名稱指定爲命令行參數,並將後續命令行參數用作字符串作爲方法main的參數提供「,並且它們不提供更多細節。所以我想添加一個'null'檢查可能是一個好主意。 – dasblinkenlight

0

,JVM會創建和傳遞所有參數是一個字符串[]命名爲「ARGS 」。這樣做(除其他原因外),以便我們不必檢查args對象上的null。這是一件小事,但它節省了少量時間。

+0

嘿,這非常有幫助。我得到了,好奇心得到了解決。萬分感謝。 – benz

1

main方法的參數將包括在命令行傳遞的字符串參數。如果沒有通過,但仍然不會null,但將有一個大小爲0試試看:

public static void main(String[] args) { 
    System.out.println(args[0]); 
} 

你可以看到一個異常被拋出:

 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
4

它的語義。如果沒有參數,這意味着你的參數列表是空的,這並不意味着參數的概念不存在。因此,args列表爲空數組(即沒有參數),而不是空(即參數不存在)。

+0

非常感謝。我明白了。這是一個非常有用的解釋。 – benz

0

檢查ARGS字符串數組的大小,如果零點比有什麼在裏面,如果尺寸大於1比有東西在裏面,嘗試把一個斷點(如果你使用的IDE)或者遍歷數組來查看數組的內容。

1

如果不是因爲Java程序的args函數被JVM本身初始化,所以數組永遠不會爲空,它就不會錯誤只能是空的,但不能爲空。 的JVM擔保該args陣列將被初始化。檢查null仍然沒有錯,但它是多餘的,並沒有太多意義,尤其是它沒有你給它的意義(沒有參數傳遞給命令行)。

由於數組將總是被初始化,你可以肯定,這將是不爲空,並且只能執行空管檢查:

if(argsl.length == 0) { 
//Is empty 
} 

你甚至可以直接通過數組迭代,而無需擔心NullPointerException異常:

for(String arg : args) { 
    System.out.println(arg); 
} 
+0

謝謝你是一個更合乎邏輯的解釋。 – benz

+0

「JVM保證args數組將被初始化」您能否提供此參考?我們真的在尋找官方文件。 – kosa

+0

@Nambari你有沒有見過JAva程序主函數的args數組參數爲null?我不... – aleroot