我一直收到这个错误:java.lang.ArrayIndexOutOfBoundsException:12
我的程序基本上是获取ISBN编号列表,并确定它们是否有效。因此,错误在:s1[l]=数字[i][l-1]+数字[i][l];这行代码使用for循环获取ISBN数字的部分和。下面的另一个循环获取数组s1中所有整数的部分和。请帮忙?错误是:我一直收到这个错误:java.lang.ArrayIndexOutOfBoundsException:12,java,arrays,eclipse,int,indexoutofboundsexception,Java,Arrays,Eclipse,Int,Indexoutofboundsexception,我的程序基本上是获取ISBN编号列表,并确定它们是否有效。因此,错误在:s1[l]=数字[i][l-1]+数字[i][l];这行代码使用for循环获取ISBN数字的部分和。下面的另一个循环获取数组s1中所有整数的部分和。请帮忙?错误是: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12 at ISBN.main(ISBN.java:67) import java.util.*; import
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12
at ISBN.main(ISBN.java:67)
import java.util.*;
import java.io.*;
public class ISBN {
public static void main(String [] args) throws IOException{
//Reads file line by line
File ISBNFile = new File ( "isbn_input.txt" );
Scanner input = new Scanner(ISBNFile);
String [] preISBN = new String [9999];
int i = 0;
int j =0;
int l =0;
int m = 0;
int count =0;
while (input.hasNextLine()){
String line = input.nextLine();
preISBN [i] = line;
i++;
count++;
}
input.close();
//Makes new array with specified count
String [] ISBN = new String [count];
String [] ISBNresult = new String [count];
for(i=0;i<ISBN.length;i++){
ISBN [i] = preISBN [i];
}
// int [] s1 = new int =
int [] [] digits = new int [ISBN.length] [12];
int [] s1 = new int [12];
int [] s2 = new int [12];
//Loads digits [] [] with values that will later be summed
for(i=0;i<ISBN.length;i++){
if(ISBN[i].length()!=12){
ISBNresult [i] = "Invalid";
continue;
}
for(j=0;j<12;j++){
if(ISBN[i].charAt(j)=='X'||ISBN[i].charAt(j)=='x'){
digits [i] [j] = 10;
}
else if(ISBN[i].charAt(j)=='-'){
digits [i] [j] = 0;
}
else
if(ISBN[i].charAt(j)==1||ISBN[i].charAt(j)==2||ISBN[i].charAt(j)==3||ISBN[i].charAt(j)==4||ISBN[i].charAt(j)==5||ISBN[i].charAt(j)==6||ISBN[i].charAt(j)==7||ISBN[i].charAt(j)==8||ISBN[i].charAt(j)==9){
digits [i][j] = Character.getNumericValue(ISBN[i].charAt(j));
}
else{
ISBNresult[i] = "Invalid";
break;
}
}
}
for(i=0;i<ISBN.length;i++){
for(j=0;j<ISBN[i].length();j++){
if(ISBN[i].length()!=12){
ISBNresult [i] = "Invalid";
continue;
}
s1[0]=digits[i][0];
for(l=1;l<=12;l++){
s1[l]=digits[i][l-1]+digits[i][l];
}
s2[0]=s1[0];
for(m=1;m<=12;m++){
s2[m]=s2[m-1]+s1[m];
}
}
if(s2[12]%11==0){
ISBNresult[i]="Valid";
}
else{
ISBNresult[i]="Invalid";
}
}
File outFile = new File("isbn_output.txt");
FileWriter fWriter = new FileWriter (outFile, true);
PrintWriter pWriter = new PrintWriter (fWriter);
for(i = 0;i<ISBN.length;i++){
pWriter.println (ISBN[i]+ " "+ ISBNresult[i] );
}
pWriter.close();
}
}
您已将s1声明为
int [] s1 = new int [12];
它将有12个元素,但索引是从0到11
在下面的代码中
for(l=1;l<=12;l++){
s1[l]=digits[i][l-1]+digits[i][l];
}
当l=12时,将结果与s[12]相等
但是没有s[12],max是s[11],因此存在错误
for(l=1;l<=12;l++){
s1[l]=digits[i][l-1]+digits[i][l];
}
s1[l]也是同样的情况,它变成了s1[12],因为两者都是这样声明的
int [] [] digits = new int [ISBN.length] [12];
int [] s1 = new int [12];
请始终记住,数组的最大可访问索引是array.length-1。因此,对于长度为12的数组,最后一个索引将是11。该数组定义为12
int [] [] digits = new int [ISBN.length] [12];
s1[0]=digits[i][0];
for(l=1;l<=12;l++){
s1[l]=digits[i][l-1]+digits[i][l];
}
您在[l]处超过,其中l==12
[l] 从0开始到11。这一切都发生了,因为您正在为数组s1和s2的第12个索引赋值。此外,当ISBN[i].length>=12时,也不会中断循环。 for循环应如下所示:
for(i=0;i<ISBN.length;i++){
for(j=0;j<ISBN[i].length();j++){
if(ISBN[i].length()<=12){
ISBNresult [i] = "Invalid";
continue;
}
else if (ISBN[i].length() > 12)
{
break;
}
s1[0]=digits[i][0];
for(l=1;l<=12;l++){
s1[l]=digits[i][l-1]+digits[i][l];
}
s2[0]=s1[0];
for(m=1;m<12;m++){
s2[m]=s2[m-1]+s1[m];
}
}
if(s2[11]%11==0){
ISBNresult[i]="Valid";
}
else{
ISBNresult[i]="Invalid";
}
}
你应该重构你的代码。尝试创建负责解析文件的类,并添加一些小方法。正如Sayem Ahmed所写的那样,也尝试使用列表/集合而不是数组。
for(i=0;i<ISBN.length;i++){
for(j=0;j<ISBN[i].length();j++){
if(ISBN[i].length()<=12){
ISBNresult [i] = "Invalid";
continue;
}
else if (ISBN[i].length() > 12)
{
break;
}
s1[0]=digits[i][0];
for(l=1;l<=12;l++){
s1[l]=digits[i][l-1]+digits[i][l];
}
s2[0]=s1[0];
for(m=1;m<12;m++){
s2[m]=s2[m-1]+s1[m];
}
}
if(s2[11]%11==0){
ISBNresult[i]="Valid";
}
else{
ISBNresult[i]="Invalid";
}
}