2012-04-17 88 views
3

我的印象是,主要方法必須有形式「公共靜態無效的主要(字符串[] args){}」,你無法傳遞int []參數。使用int而不是字符串:public static void main(int [] args)

但是,在windows命令行中,運行下列.class文件時,它接受int和string作爲參數。

例如,使用此命令將使輸出「桁」:「Java的IntArgsTest桁」

我的問題是,爲什麼呢?爲什麼這段代碼接受一個字符串作爲參數而沒有錯誤?

這是我的代碼。

public class IntArgsTest 
{ 
    public static void main (int[] args) 
    { 

     IntArgsTest iat = new IntArgsTest(args); 

    } 

    public IntArgsTest(int[] n){ System.out.println(n[0]);}; 

} 
+3

按照其他人的反應,它失敗了我。沒有說你使用的是哪個JRE或OS,但是我強烈懷疑你沒有運行你認爲正在運行的東西。 – 2012-04-28 17:51:48

回答

15

所有傳遞給主方法的東西,JVM用來啓動程序的東西都是一個String,所有東西。它可能看起來像int 1,但它確實是字符串「1」,這是一個很大的區別。

現在用你的代碼,如果你嘗試運行它,會發生什麼?當然,由於它是有效的Java,所以它會編譯得很好,但是你的主要方法簽名與JVM所需的方法簽名不匹配,作爲程序的起點。

爲您的代碼運行,你需要添加一個有效的主要方法一樣,

public class IntArgsTest { 
    public static void main(int[] args) { 

     IntArgsTest iat = new IntArgsTest(args); 

    } 

    public IntArgsTest(int[] n) { 
     System.out.println(n[0]); 
    }; 

    public static void main(String[] args) { 
     int[] intArgs = new int[args.length]; 

     for (int i : intArgs) { 
     try { 
      intArgs[i] = Integer.parseInt(args[i]); 
     } catch (NumberFormatException e) { 
      System.err.println("Failed trying to parse a non-numeric argument, " + args[i]); 
     } 
     } 
     main(intArgs); 
    } 
} 

再經過幾個電話號碼,當程序被調用。

+0

非常有趣的做法!謝謝你的洞察力,我會經常用這個想象。儘管我沒有回答我的問題;它在cmd中運行.class文件時運行。奇怪,不是? – 2012-04-17 02:32:50

+0

@blackscholes:我可以向你保證它沒有運行。您可能認爲它已經運行了,但是沒有額外的代碼,您的代碼無法在標準Java編譯器中運行。再次,它會編譯,但它不會運行。期。 – 2012-04-17 02:35:17

+0

你正在編譯爲.jar文件嗎?或者.class文件?我所做的是從.jar文件中提取.class文件,將其放在我的桌面上,然後在cmd中運行....文件是「IntArgsTest.class」。它正在爲我運行..這就是爲什麼我很困惑!如果您希望我證明這一點,我可以向您發送該文件。 – 2012-04-17 02:36:28

1

此代碼不會實際運行。而代碼編譯(因爲你不需要主要編譯),當你嘗試運行它時,你會得到一個"Main method not found"錯誤。

更妙的是,當我跑它,它說

"please define the main method as: public static void main(String[] args) 
+0

謝謝你的回覆。關於您上面引用的錯誤消息:當我嘗試在Eclipse上運行它時,它給了我相同的消息。你是否嘗試提取一個.class文件並從命令行運行它?它似乎工作正常。 – 2012-04-17 02:24:42

+0

是的,我從命令行運行它(事實上,Eclipse不會將其視爲Java應用程序,因此除非您自行設置應用程序,否則無法運行它)。這是沒有辦法的,我懷疑你沒有重新編譯從'String args []'切換到'int args []'。 – 2012-04-17 02:59:51

2

好了,你可以有一個名爲main與任意數量的參數的任何方法。但JVM將查找main方法,其確切簽名爲public static void main(String[])

您定義的main方法只是該類的另一種方法。

我現在沒有Windows的訪問權限,但是讓我稍後試用一下。我曾嘗試在Fedora上,當然我得到以下異常:

Exception in thread "main" java.lang.NoSuchMethodError: main 

請注意,由於上述原因,該類可以很好地編譯。

更新:我在Windows 7上測試過,結果相同。我很驚訝你如何說它爲你工作。

+0

當我將它解壓縮到一個.class文件並在命令中運行時它對我有效......它在Eclipse中對我不起作用,它給了我類似的消息。謝謝您的回覆! – 2012-04-17 02:25:55

0

此代碼包含public static void main(int [] args)這不起作用。因爲JVM將參數值作爲字符串參數。它不需要任何int參數。所以,如果我們想要一個int參數意味着我們必須將字符串參數轉換爲整數參數。運行該代碼需要有效的主要方法(例如:公共靜態無效的主要(字符串ARGS [])

相關問題