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 № 1String 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);
}