我有一个代码,我正在从另一个实现,但我得到Java的错误ArrayIndexOutofBoundsException
有人可以帮助我吗?我不知道该怎么做可能是触发错误的代码
文件中的数据是
Username|HashedPassword|no.of chips
代码在
之下public static void DeletePlayer()throws IOException{
File inputFile = new File("players.dat");
File tempFile = new File ("temp.dat");
BufferedReader read = new BufferedReader(new FileReader(inputFile));
BufferedWriter write = new BufferedWriter(new FileWriter(tempFile));
ArrayList<String> player = new ArrayList<String>();
try {
String line;
Scanner reader = new Scanner(System.in);
System.out.println("Please Enter Username:");
String UserN = reader.nextLine();
System.out.println("Please Enter Chips to Add:");
String UserCadd = reader.nextLine();
while((line = read.readLine()) != null){
String[] details = line.split("\\|");
String Username = details[0];
String Password = details[1];
String Chips = details[2];
Integer totalChips = (Integer.parseInt(UserCadd) + Integer.parseInt(Chips));
if(Username.equals(UserN)){
line = Username + "|" + Password + "|" + totalChips;
write.write("\r\n"+line);
}
}
read.close();
write.close();
inputFile.delete();
tempFile.renameTo(inputFile);
main(null);
}catch (IOException e){
System.out.println("fail");
}
}
答案 0 :(得分:1)
String[] details = line.split("\\|");
String Username = details[0];
String Password = details[1];
String Chips = details[2];
您的详细信息数组似乎只有一个或两个元素。那一刻,你试图从数组中得到一些东西,对于超出(现有)范围的索引,抛出异常。
你确定你的文件没有以空行结尾吗?
添加以下行:
System.out.println("length: " + details.length);
在你的split方法之后,或者打印出details数组的所有元素,它会告诉你有多少元素,以及你尝试为哪些值执行此操作的次数。
答案 1 :(得分:0)
在此代码中:
while((line = read.readLine()) != null){
String[] details = line.split("\\|");
String Username = details[0];
String Password = details[1];
String Chips = details[2];
//...
}
您必须检查用户输入是否符合预期格式(在您的情况下)
乔| g00d | 12
最小化检查是将3个元素分隔为|
。 e.g。
while((line = read.readLine()) != null){
String[] details = line.split("\\|");
if (details.length != 3) {
System.out.println("Bad input, try agains...");
continue;
}
String Username = details[0];
String Password = details[1];
String Chips = details[2];
//...
}
请注意,您应该String#trim()
输入以消除前导和结尾空格(这允许输入像joe | g00d | 123
),并且在解析具有的筹码数时仍然会出错是一个整数。我当然也会检查一下。