将ArrayList中的字符串转换为int时发生Java错误

将ArrayList中的字符串转换为int时发生Java错误,java,string,arraylist,casting,int,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 = userNumbersSt

我对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);
}
扫描仪输入=新扫描仪(System.in);
System.out.println(“在逗号分隔的列表中输入6个介于1和49之间的整数:”;
String usernumberstring=input.nextLine();
String[]userNumbersArray=userNumbersString.replaceAll(“\\s+”,”).split(“,”);
ArrayList userNumbers=新的ArrayList(Arrays.asList(userNumbersArray));
布尔值validNumber=true;
对于(int v=0;v 49){
validNumber=假;
v=7;
}否则{
v++;
}
}
if(validNumber==false){
字符串[]str=新字符串[0];
主(str);
}
它编译正确。但是,当我输入一系列数字时,会出现以下错误:

java.lang.ClassCastException: 无法将java.lang.String转换为java.lang.Integer

我很困惑为什么这个字符串不能转换为整数

抱歉,如果这是一个冗长的问题,但我将非常感谢任何帮助

我刚刚意识到边界外的异常是由于我犯了一个愚蠢的数学错误;v从0开始;数组中有五个值,但我用简单的术语给出了条件的循环

int
是表示32位整数的基本类型。
String
是环绕
char
s数组的引用类型,用于表示字符序列

您不能只是将类型从
int
更改为
String
,然后让字符串中的字符序列神奇地变成数字

考虑一下如何实现这种转换。你应该检查每个字符,确保它是一个有效的数字等等

更改:

if((int)userNumbers.get(v) > 49)
ArrayList userNumbers = new ArrayList(Arrays.asList(userNumbersArray));
for(int v = 0; v <= 6; v++)
致:

此外,在创建类属类型容器(如
ArrayList
时,请确保还声明了出于类型安全原因存储的对象类型

更改:

if((int)userNumbers.get(v) > 49)
ArrayList userNumbers = new ArrayList(Arrays.asList(userNumbersArray));
for(int v = 0; v <= 6; v++)
致:

致:

for(int v=0;v
首先,您应该为
ArrayList
使用泛型。请更换

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

arraylistusernumbers=newarraylist(Arrays.asList(userNumbersArray));

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

类型转换并不意味着从字符串中解析Integervalue

你应该用这个

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


应该可以解决您的错误。

首先,您会得到一个ArrayIndexOutOfBounds异常,因为感谢您的及时回复,但是,当我这样做时,我会得到一个编译错误。我会用错误更新我的原始问题,因为它很长。为什么
valueOf
而不是
parseInt
?在这种情况下,没有理由使用一个
Integer
而不是
int
@bcsb1001您是对的,尽管它仍然有效,但是parseInt是一个更好的选择。更新了我的answer@user3315726
valueOf
需要字符串作为参数,而
get
返回
Object
,因为您没有指定应该
ArrayList
stor的元素类型e、 要做到这一点,您必须使用泛型类型(也更喜欢接口而不是实现),所以将
ArrayList userNumbers=new ArrayList(…
更改为
List userNumbers=new ArrayList(…
@Pshemo-haha我刚刚添加了这一部分,telepathy-wow:)感谢您的建议,不要包含问题中某个人的消息。请将其作为“此人回答”下的注释。@Pshemo OK;很抱歉,我现在使用了泛型,它将使用parseInt进行编译,但在输入逗号分隔的数字字符串后出现错误:java.lang.IndexOutOfBoundsException:索引:6,大小:6(在java.util.ArrayList中)
ArrayList<String> userNumbers = new ArrayList<>(Arrays.asList(userNumbersArray));
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"));
}