2014-09-20 60 views
1

在新的Java。我正在嘗試寫一個彩票模擬器。我有以下代碼:Java錯誤時爲int

Scanner input = new Scanner(System.in); 
System.out.println("Enter six whole numbers between 1 and 49 in a comma-separated list: "); 
String userNumbersString = input.nextLine(); 
String[] userNumbersArray = userNumbersString.replaceAll("\\s+","").split(","); 
ArrayList userNumbers = new ArrayList(Arrays.asList(userNumbersArray)); 
boolean validNumbers = true; 
for(int v = 0; v <= 6; v++){ 
    if((int)userNumbers.get(v) > 49){ 
     validNumbers = false; 
      v = 7; 
     }else{ 
      v++; 
     } 
    } 
if(validNumbers == false){ 
    String[] str = new String[0]; 
    main(str); 
} 

它編譯正確。但是,當我輸入一系列數字時,出現此錯誤:

java.lang.ClassCastException: java.lang.String不能轉換爲java.lang.Integer。

我爲什麼這個字符串不能轉換爲整數很困惑。

很抱歉,如果這是一個囉嗦的問題,但我會非常有得到任何幫助。

我剛剛意識到OutOfBounds異常是源於我的一個愚蠢的錯誤,數學; v從0開始;數組中有五個值,但是我給出了for循環的條件< = 6.對不起。

謝謝大家的一切幫助。一起,你已經解決了我的問題。

+0

不要爲有問題的人自己按摩。把它作爲評論在這個人的答案下。 – Pshemo 2014-09-20 20:55:18

+0

@Pshemo好的;對不起, – user3315726 2014-09-20 20:57:52

回答

1

簡單來說

int是用於表示一個32位的整數基本類型。 String是一個引用類型,圍繞一個數組char s來表示一系列字符。

你不能只是從int改爲String的類型,並使字符串中的字符序列神奇地成爲一個數字。

想想你將如何實現這種轉換。你會看每一個字符,請確保它是一個有效數字等

變化:

if((int)userNumbers.get(v) > 49) 

要:

if(Integer.parseInt(userNumbers.get(v)) > 49) 

此外,創建通用型容器,如ArrayList時,請確保您也爲了類型安全的原因聲明他們存儲的對象類型。

變化:

ArrayList userNumbers = new ArrayList(Arrays.asList(userNumbersArray)); 

要:

ArrayList<String> userNumbers = new ArrayList<String>(Arrays.asList(userNumbersArray)); 

這樣,你叫userNumber.get()將返回String。 如果你不這樣做,它將返回一個Object,所以你實際上會呼叫Integer.parseInt(Object)這是無效的。你會得到一個不言自明的錯誤看起來像這樣:

The method parseInt(String) in the type Integer is not applicable for the arguments (Object)

編輯:

爲了您IndexOutOfBounds錯誤,您試圖訪問比你擁有更多的元素。基本上,你想有6個值,但你的for循環說from 0 until 6 (included)。這是一個總的7個要素:0, 1, 2, 3, 4, 5, 6

你可以通過改變你的循環的<= 6< 6但解決它,所以它會工作,不管你有多少個元素具有最好的方式解決這個問題就是使用size()屬性的ArrayList

變化:

for(int v = 0; v <= 6; v++) 

要:

for(int v = 0; v < userNumbers.size(); v++) 
+0

感謝您的及時回覆,但是,當我這樣做,我收到編譯錯誤。我會用錯誤更新我原來的問題,因爲它很長。 – user3315726 2014-09-20 20:47:47

+0

爲什麼'valueOf'而不是'parseInt'?在這種情況下,沒有理由使用「Integer」而不是「int」。 – bcsb1001 2014-09-20 20:49:02

+0

@ bcsb1001你是正確的,雖然它仍然有效,parseInt是一個更好的選擇。更新我的回答 – nem035 2014-09-20 20:51:10

0

首先,您應該使用泛型爲ArrayList。請

ArrayList<String> userNumbers = new ArrayList<>(Arrays.asList(userNumbersArray)); 

更換

ArrayList userNumbers = new ArrayList(Arrays.asList(userNumbersArray)); 

然而,這不是你的問題。這裏的誤解是演員會推斷出你需要什麼類型的轉換; 它不會。將(int)userNumbers.get(v)替換爲Integer.parseInt(userNumbers.get(v))以從String解析int

+0

我現在已經使用泛型,它會用parseInt編譯,但我輸入逗號後,分隔數字字符串:java.lang.IndexOutOfBoundsException:index:6,size:6(在java.util.ArrayList中) – user3315726 2014-09-20 20:56:33

0

類型轉換不意味着從字符串中解析一個Integervalue。

您應該使用Integer.parseInt

if(Integer.parseInt(userNumbers.get(v)) > 49

應該解決你的錯誤。

0

首先,由於for循環中的< = 6,您將得到一個ArrayIndexOutOfBounds異常。其次,您應該使用Integer.parseInt(String intStr)方法將每個數字轉換爲它的int等效值。

這裏是一個精簡版,我認爲作品:

public static void main(String[] args) 
{ 
    String testInputOne = "14,22,18,2,5,11"; 

    boolean allNumbersAreValid = true; 

    String[] userNumbersStrArray = testInputOne.split(","); 

    for (String numberStr: userNumbersStrArray) 
    { 
     Integer number = Integer.parseInt(numberStr.trim()); 

     if (number > 49) 
     { 
      allNumbersAreValid = false; 
      break; 
     } 
    } 

    System.out.println("Testing " + testInputOne + ": " + (allNumbersAreValid?"All valid!":"At least one invalid")); 
} 

如果您想進一步對錯誤的輸入後衛如某人進入一個字母字符,你可以一試包裹的Integer.parseInt調用catch塊並捕獲NumberFormatException並輸出一個合適的錯誤消息。

坦率地說,對於main的遞歸調用應該做什麼有點害怕? :)