将ArrayList中的字符串转换为int时发生Java错误
我对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
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@user3315726valueOf
需要字符串作为参数,而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"));
}