簡體   English   中英

將ArrayList中的String轉換為int時出現Java錯誤

[英]Java error when converting String in ArrayList to int

我在Java的非常新。 我正在嘗試編寫彩票模擬器。 我有以下代碼:

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。很抱歉。

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

簡單來說

int是用於表示32位整數的原始類型。 String是包裝在char數組周圍以表示字符序列的引用類型。

您不能僅將類型從int更改為String並使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) ,這是無效的。 您將看到一個非常不言自明的錯誤,如下所示:

Integer類型的方法parseInt(String)不適用於參數(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++)

首先,您應該對ArrayList使用泛型。 請更換

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

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

但是,這不是您的問題。 這里的誤解是強制轉換會推斷出您需要哪種類型的轉化; 不會的 Integer.parseInt(userNumbers.get(v))替換(int)userNumbers.get(v)以從String解析int

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

您應該為此使用Integer.parseInt

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

應該可以解決您的錯誤。

首先,由於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調用包裝在try catch塊中,並捕獲NumberFormatException並輸出適當的錯誤消息。

坦率地說,我對遞歸調用main應該做什么感到有些恐懼? :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM