2012-03-24 4 views
-1

Als ich diesen Code getestet habe, gab es mir java.lang.ArrayIndexOutOfBoundsException: 2 Der Code ist noch nicht fertig, aber das ist, was ich versuche zu tun: Ein Programm, das den Benutzer nach zwei Zahlen fragt. Drucken Sie alle Zahlen von der kleineren Nummer zu der größeren Zahl (einschließlich) in zufälliger Reihenfolge. Mit dieser Reihenfolge finden Sie die größte Summe von 2 nebeneinander liegenden Zahlen. Könnten mich einige bitte darauf hinweisen, was behoben werden muss und wie man es beheben kann? Vielen Dank.Wie überwinde ich java.lang.ArrayIndexOutOfBoundsException: 2 in diesem Code?

boolean isNum = false; 
    int in1 = 0; 
    int in2 = 0; 
    int size = 0; 
    int largestsum = 0; 
    while (!isNum) { 
     try { 
      System.out.print("Enter a number: "); 
      in1 = Integer.parseInt(in.readLine()); 
      boolean isSame = false; 
      while (!isSame) { 
       System.out.print("Enter a number: "); 
       try { 
        in2 = Integer.parseInt(in.readLine()); 
        if (in1 != in2) { 
         isSame = true; 
        } else { 
         System.out.println("Same number."); 
        } 
       } catch (NumberFormatException nfe) { 
        System.out.println("Not a number."); 
       } 
      } 
      isNum = true; 
     } catch (NumberFormatException nfe) { //catches error 
      System.out.println("Not a number."); //informs user of the error 
     } 
    } 
    if (in1 > in2) { 
     size = in1 - in2 + 1; 
     int[] num = new int[size]; 
     for (int i = 0; i < size; i++) { 
      num[i] = in2 + i; 
     } 
     int[] order = new int[size]; 
     boolean[] used = new boolean[size]; 
     for (int i = 0; i < size; i++) { 
      int r = (int) ((size) * (Math.random())); 
      while (used[r]) { 
       r = (int) ((size) * Math.random()); 
      } 
      order[i] = r; //fill array 
      used[r] = true; //r is now used 
     } 
     for (int i = 0; i < size; i++) { 
      if (num[order[i]] + num[order[i + 1]] > largestsum) { 
       largestsum = num[order[i]] + num[order[i + 1]]; 
      } 
     } 

Antwort

1

Die letzte für Schleife überlaufen wird, wenn i = size-1

In Ihrer Frage, können Sie die Summe zwischen zwei benachbarten Zahlen erhalten möchten. Ihre Logik in der letzten für Schleife besagt, dass Sie die Summe durch Hinzufügen der Nummer i zu i + 1 berechnen. Das letzte Element in Ihrem Array befindet sich an Position size-1. Wenn Sie dann versuchen, dieses zur nächsten benachbarten Nummer hinzuzufügen, wird das Array über die (size-1) +1 übergelaufen.

das Problem zu beheben, sollen Sie Ihre letzte for-Schleife nur bis weiterhin i < size-1, wie so ...

for (int i = 0; i < size-1; i++) { 
     if (num[order[i]] + num[order[i + 1]] > largestsum) { 
      largestsum = num[order[i]] + num[order[i + 1]]; 
     } 
    } 

Mit dieser festen Logik, das größte Element in den für Schleife ist size-2, und wenn Sie 1 hinzufügen (für die nächste benachbarte Nummer), wird es Artikel (size-2) +1 wählen, die das letzte Element in der Anordnung ist, anstatt das Überlaufen der Array.

1

Meine Vermutung ist das Problem ist in Ihrem allerletzten for-Schleife. Da order Werte von 0 bis size enthalten kann, ist num[order[i]] immer gültig, aber für den Fall, dass order[i]==size, num[order[i+1]] außerhalb der Grenzen liegt.

Verwandte Themen