将ArrayList中的String转换为int时出现Java错误

时间:2014-09-20 20:42:38

标签: java string arraylist casting 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循环条件&lt; = 6.抱歉。

感谢大家的帮助。你们一起解决了我的问题。

4 个答案:

答案 0 :(得分:2)

简单来说

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)。你会得到一个非常明显的不言自明的错误:

  

Integer类型中的方法parseInt(String)不适用于参数(Object)

修改

对于IndexOutOfBounds错误,您尝试访问的元素多于您所拥有的元素。基本上,您希望有6个值,但for循环显示为from 0 until 6 (included)。这总共有7个元素:0, 1, 2, 3, 4, 5, 6

您可以通过将循环中的<= 6更改为< 6来解决此问题,但最好的方法是修复它,这样无论您使用多少元素都可以使用{{1} } size()的属性:

变化:

ArrayList

要:

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

答案 1 :(得分:0)

首先,您应该为ArrayList使用泛型。请替换

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

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

然而,这不是你的问题。这里的误解是铸造将推断出你需要什么类型的转换; 它不会。将(int)userNumbers.get(v)替换为Integer.parseInt(userNumbers.get(v)),以解析int中的String

答案 2 :(得分:0)

类型转换不是要从String解析整数值。

您应该使用Integer.parseInt

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

应该解决你的错误。

答案 3 :(得分:0)

首先,由于for循环中的&lt; = 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并输出合适的错误消息。

我坦率地对主要的递归调用应该做些什么感到害怕? :)