2017-12-07 11 views
0

配列のサイズより小さい重複した数字/数字と配列のサイズより大きな数字の配列をチェックする簡単なコードを作ろうとしました。 (たとえば、サイズが7の配列の場合、配列内の数値は重複しないで1から7の間でなければなりません。システムで無効なエラーが出力されない場合) 1のサイズで配列を入力し、ここで、1 sumn.mainで (sumn.java:24)配列の重複入力が無効です

:スレッド "メイン" java.lang.ArrayIndexOutOfBoundsExceptionで

例外:私は次のエラーメッセージを取得し、例えば数2コード自体、これを修正する方法の任意の考えですか?

public class sumn { 
    public static boolean Duplicates(int arr[]) { 
     int a, b; 
     boolean flag = true; 
     for (a=0;a<arr.length-1;a++) { 
      for (b=a+1;b<arr.length;b++) { 
       if (arr[b]==arr[a]) { 
        return false;      
       }    
      } 
     } 
     return flag; 
    } 

    public static void main(String[] args) { 
     int N = MyConsole.readInt("Enter the size of the array:"); 
     int arr[] = new int [N]; 
     int i, j; 
     boolean flag = true; 
     for (i=0;i<arr.length;i++) { 
      arr[i]= MyConsole.readInt("Enter a number between 1 to "); 
     } 
     for (j=0;j<arr.length;j++) { 
      if (Duplicates(arr)==false || N<arr[i] || arr[i]<=0) 
       flag = false; 
      if (flag == false) { 
       System.out.println("Invalid input"); 
      } 
     } 
    } 


} 
+0

24' 。それをしないでください。 – Kayaman

+0

私はあなたがこれらの "自由な"命名にあまりにも慣れる前にいくつかのJavaスタイルガイドを見ることをお勧めします。 – kalsowerus

答えて

2

問題は、それ

if (Duplicates(arr)==false || N<arr[j] || arr[j]<=0) 

が、私はライン24を推測しているj

1

iを交換します。この行に

if (Duplicates(arr)==false || N<arr[i] || arr[i]<=0) 

あるif (Duplicates(arr)==false || N<arr[i] || arr[i]<=0)です。ここでの問題は、最初のループの後にiの値がarr.lengthになることです。毎回ArrayIndexOutOfBoundsExceptionが発生します。

iをその行のjに置き換えることができます。これは意図したとおりです。それとも、のようなあなたのループを書き込むことによってのみ、ループにビットと範囲iを「クリーンアップ」することができます

for(int i = 0; i < arr.length; i++) { ... } 

の代わりに、あなたは `行に配列の外側をインデックスしている

int i; 
for(i = 0; i < arr.length; i++) { ... } 
関連する問題