/ / Java-ArrayIndexOutOfBoundsException Errore - java, array

Java-ArrayIndexOutOfBoundsException Errore - java, array

Quando eseguo il seguente programma ottengo un errore alla riga 20, e questo è il mio codice:

package J1;
import java.util.Scanner;

public class SpeedLimit {

public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
int input = keyboard.nextInt();

String[] tab = new String[2];
String output="";
int speed = 0;
while(input!=-1){
int last =0;
for (int i=0; i<input ; i++){

String pair = keyboard.next();

tab = pair.split(" ");
speed = speed + Integer.parseInt(tab[0])*(Integer.parseInt(tab[1])-last);
last = Integer.parseInt(tab[1]);
}
output = output +speed + "miles" + "n";
speed =0;
input = Integer.parseInt(keyboard.nextLine());
}
System.out.println(output);
}

}

quando eseguo il codice, inserisco il seguente input dalla tastiera:

 3
20 2
30 6
10 7
2
60 1
30 5
4
15 1
25 2
30 3
10 5
-1

per ottenere questo risultato come output: 170 miglia 180 miglia 90 miglia

ma ottengo il seguente errore quando eseguo il codice

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at J1.SpeedLimit.main(SpeedLimit.java:20)

risposte:

2 per risposta № 1

String pair = keyboard.next(); Questo legge solo un token che sono separati da " " così quando dividi pair di " ". Avrà solo un elemento, The String stesso. Quindi è necessario leggere l'intera riga e quindi dividerla delimitata " ".

Un altro errore è che quando si cambia quella linea con String pair = keyboard.nextLine(); , Otterrai comunque un errore perché il sistema considera Enter chiave come input di .nextLine() metodo. Quindi devi scartare quell'input extra inutile.

while(input!=-1){
int last =0;
for (int i=0; i<input ; i++){

int ip1=keyboard.nextInt();
int ip2=keyboard.nextInt();

speed = speed + ip1*(ip2-last);
last = ip2;
}
output = output +speed + "miles" + "n";
speed =0;
input = keyboard.nextInt();
}

0 per risposta № 2

Stai leggendo la coppia di variabili nel modo sbagliato e poi la dividi e la assegni in una scheda che non riesce a recuperare automaticamente la variabile di coppia causa indice ha un problema.

* nextLine (): legge il resto della riga corrente anche se è vuota.

        keyboard.nextLine(); //To avoid the exception you commented
String pair = keyboard.nextLine(); //here is solved
tab = pair.split(" ");

0 per risposta № 3

Tastiera.next () legge solo l'input fino allo spazio, quindi pair e l'array avranno un solo numero, quindi tab [1] restituisce l'eccezione arrayOutOfBound. Usa il metodo nextLine () per leggere gli input con lo spazio.


0 per risposta № 4

Puoi provare qui sotto le modifiche nel tuo codice:

public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
int input = Integer.parseInt(keyboard.nextLine());

String[] tab = new String[2];
String output="";
int speed = 0;
while(input!=-1){
int last =0;
for (int i=0; i<input ; i++){
String pair = keyboard.nextLine();
tab = pair.split(" ");
speed = speed + Integer.parseInt(tab[0].trim())*(Integer.parseInt(tab[1].trim())-last);
last = Integer.parseInt(tab[1]);
}
output = output +speed + " miles " + "n";
speed =0;
input = Integer.parseInt(keyboard.nextLine());
}
System.out.println(output);
}

0 per risposta № 5

ho davvero capito come stai fornendogli input. ma, se "3" sembra essere la tua prima linea allora split ("") restituirebbe una matrice di lunghezza 1. quindi, tab [0] restituirà 3 e tab [1] ti darà una nullPointerException.

prova ad aggiungere un controllo per la lunghezza della scheda prima di eseguire la linea 20.

questo dovrebbe fare il trucco:

if(tab.length() > 1){

speed = speed + Integer.parseInt(tab[0])*(Integer.parseInt(tab[1])-last);

}