2009-06-12 64 views
0

你好我困在簡單的Java練習中,希望有人能幫忙。解析java main args []數組錯誤

對不起,如果這很簡單我是一個java新手。

什麼我有麻煩:如果用戶輸入不是「幫助」以外的字符串,如「富」然後我得到了以下錯誤:

Exception in thread "main" java.lang.NumberFormatException: For input string: "foo" 

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 

at java.lang.Integer.parseInt(Integer.java:447) 

at java.lang.Integer.parseInt(Integer.java:497) 

at NumberGuess.main(NumberGuess.java:10) 

我認爲正在發生的事情:「富「不會被」else「捕獲,因爲args [0]是一個對象引用,並不是一個字符串。

我想知道的是:如何抓住除「幫助」或數字「1」到「5」之外的所有內容?

這裏是代碼...

public class NumberGuess { 

public static void main(String args[]){ 

    int r; 
    int g; 

    if ((args[0].compareTo("help")) == 0){ 
     System.out.println("Enter a number between 1-5 to play."); 
    } else if (Integer.parseInt(args[0]) > 0 && Integer.parseInt(args[0]) <= 5){ 

     r = ((int)(Math.random())); 
     g = Integer.parseInt(args[0]); 

     if (r == g){ 
      System.out.println("YOU WON!"); 
     } else { 
      System.out.println("Wrong: number was " + r); 
     } 

    } else { 
     System.out.println("Something went horribly wrong."); 

    }}} 
+0

只是FYI,對於更復雜的參數解析,我會建議commons-cli。 – KitsuneYMG 2009-09-09 19:05:14

回答

3

程序邏輯本質,「如果說法零不再是‘幫助’,解析它作爲一個整數&hellip; 「此時,拋出異常,因爲」foo「不是有效整數。

最簡單的方法是捕獲NumberFormatException並打印更有用的消息。

if ("help".equals(args[0])) { 
    System.out.println("Enter a number between 1 and 5 to play."); 
} 
else { 
    int number; 
    try { 
    number = Integer.parseInt(args[0]); 
    } 
    catch (NumberFormatException ex) { 
    System.out.println("Input is not an integer: " + args[0]); 
    return; 
    } 
    if ((number < 1) || (number > 5)) { 
    System.out.println("Number out of bounds: " + number); 
    return; 
    } 
    int r = new java.util.Random().nextInt(5) + 1; 
    if (number == r) 
    System.out.println("You won!"); 
    else 
    System.out.println("You lost!"); 
} 
0

正如你已經注意到,parseInt如果你試圖解析字符串不正確表示錯誤引發的異常; try/catch是用於捕獲這些異常並處理它們的Java構造 - 查看您最喜歡的Java文檔!

+1

它實際上是Java中的try/catch。 – 2009-06-13 00:07:42

+0

哎呀,謝謝@mmyers,編輯答案來糾正這個! – 2009-06-13 02:21:02

1

尋求「幫助」後,做的第一件事就是試圖解析它作爲一個數量:

g = Integer.parseInt(args[0]); 

什麼,你可以嘗試做的是通過改變該行捕獲此異常:

try { 
    g = Integer.parseInt(args[0]); 
} catch(NumberFormatException e) { 
    System.out.println("The first parameter was supposed to be a number!"); 
    System.exit(1); 
} 

如果你的意思是接受像「富1」參數,那麼你應該分析ARGS [1]的數量,和args [0]你應該測試,看看它的「富」是這樣的:

if(args[0].equalsIgnoreCase("foo")) { 
    // now we know foo is the first arg. Parse args[1]! 
    ... 
} 

哦,順便說一句。大多數語言中的「隨機」數字都是介於0和1之間的數字。它們通常看起來像「.108937190823 ...」

如果要檢查1-10之類的數字,則需要執行此類操作:

Random().nextInt(10) + 1; // (Thanks @mmyers) 

(不能完全確定這就是做正確的方式,但它很接近

+0

正確的做法是創建一個java.util.Random對象並調用nextInt(10)。在[0,9]範圍內給出一個int,然後你可以加1。 – 2009-06-13 00:19:36

1

這到底是怎麼發生的是,代碼放在else塊(如你猜)和else塊馬上嘗試將參數轉換成一個數字(的Integer.parseInt(參數[0])。所以,你可以將一個try catch塊來處理這樣的場景:

公共類猜數字{

公共靜態無效的主要(字符串ARGS []){

 int r; 
    int g; 
    int temp; 

    if ((args[0].compareTo("help")) == 0){ 
      System.out.println("Enter a number between 1-5 to play."); 
    } else { 
      try{ 
       temp = Integer.parseInt(args[0]); 
      }catch(NumberFormatException e){ 
       System.out.println("Please enter a number"); 
       System.exit(-1); 
      } 
      if (Integer.parseInt(args[0]) > 0 && Integer.parseInt(args[0]) <= 5){ 
      r = ((int)(Math.random())); 
      g = Integer.parseInt(temp); 

      if (r == g){ 
        System.out.println("YOU WON!"); 
      } else { 
        System.out.println("Wrong: number was " + r); 
      } 
      } 

    } else { 
      System.out.println("Something went horribly wrong."); 

    }}} 

以下是您可以編寫代碼的一種方式(只是一個建議)。