-3

私のプログラムは基本的に ISBN 番号のリストを取得し、それらが有効かどうかを判断します。したがって、エラーは次のとおりです。s1[l]=digits[i][l-1]+digits[i][l]; このコード行は、for ループを使用して ISBN 番号の部分的な合計を取得します。その下のもう 1 つのループは、配列 s1 内のすべての int の部分合計を取ります。助けてください?エラーは次のとおりです。

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();
       }
      }
4

4 に答える 4

5

あなたは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] がない (最大値は s[11]) ため、エラーが発生します。

于 2013-03-29T07:27:48.483 に答える
0
for(l=1;l<=12;l++){
    s1[l]=digits[i][l-1]+digits[i][l];
}

l12最後の繰り返しになり、効果的に加算ステートメントの 2 番目の部分をこのように作成します。

digits[i][12]

同じケースもあり、両方がこのように宣言されているs1[l]ため、 になりますs1[12]

int [] [] digits = new int [ISBN.length] [12];
int [] s1 = new int [12];

配列のアクセス可能な最大インデックスは であることを常に覚えておいてarray.length-1ください。したがって、長さ の配列の12場合、最後のインデックスは になります11

于 2013-03-29T07:28:57.420 に答える
0

配列は 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 == 12 の [l] を超えました。

[l] は 0 から 11 までです。

于 2013-03-29T07:31:28.937 に答える
0

12th配列s1とのインデックスに値を割り当てているため、これはすべて起こっていますs2。また、あなたはループを壊していません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";
   }
 }
于 2013-03-29T07:33:06.237 に答える