/ / Помилка Java-ArrayIndexOutOfBoundsException - java, масиви

Java-ArrayIndexOutOfBoundsException Помилка - java, масиви

Коли я запускаю наступну програму, я отримую помилку в рядку 20, і це мій код:

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

}

коли я запускаю код, я ввожу наступний вхід з клавіатури:

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

щоб отримати цей результат як результат: 170 миль 180 миль 90 миль

але я отримую таку помилку, коли запускаю код

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

Відповіді:

2 для відповіді № 1

String pair = keyboard.next(); Це читає лише один маркер, який розділений між собою " " тому коли ви розколитесь pair по " ". Він матиме лише один елемент - саму струну. Тож вам потрібно прочитати весь рядок, а потім розділити його на розмежування " ".

Ще одна помилка полягає в тому, що при зміні цього рядка на String pair = keyboard.nextLine(); , Ви все одно отримаєте помилку, оскільки система вважає Enter ключ як вхід .nextLine() метод. Тож вам потрібно відмовитися від зайвих непотрібних даних.

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 для відповіді № 2

Ви неправильно читаєте пару змінних, а потім розділяєте її та присвоюєте їй вкладку, яка не вдається автоматично отримати індекс, тому що пара змінної пари отримала проблему.

* nextLine (): читає залишок поточного рядка, навіть якщо він порожній.

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

0 для відповіді № 3

Клавіатураnext () зчитує лише вхід до пробілу, тому пара і масив матимуть лише одне число, тому вкладка [1] призводить до винятку arrayOutOfBound. Використовуйте метод nextLine () для читання входів з пробілом.


0 для відповіді № 4

Ви можете спробувати нижче зміни в коді:

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 для відповіді № 5

я дійсно не розумію, як ти надаєшвходи. але, якщо "3" стане вашим першим рядком, тоді split ("") поверне масив довжиною 1. Таким чином, вкладка [0] поверне 3, а вкладка [1] надасть вам nullPointerException.

спробуйте додати чек на довжину вкладки перед виконанням рядка 20.

це повинно зробити трюк:

if(tab.length() > 1){

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

}