Java ArrayIndexOutOfBoundsException错误

Java ArrayIndexOutOfBoundsException错误,java,arrays,Java,Arrays,当我运行以下程序时,第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]

当我运行以下程序时,第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);
}

}
要将此结果作为输出,请执行以下操作: 170英里 180英里 90英里

但是当我运行代码时,我得到了以下错误

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

您以错误的方式读取变量对,然后将其拆分并分配给无法自动获取索引的选项卡,因为变量对出现问题

*nextLine():读取当前行的剩余部分,即使该行为空

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

您以错误的方式读取变量对,然后将其拆分并分配给无法自动获取索引的选项卡,因为变量对出现问题

*nextLine():读取当前行的剩余部分,即使该行为空

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

String pair=keyboard.next()
这只读取一个由
分隔的令牌,因此当您通过
拆分
对时。它只有一个元素,即字符串本身。因此,您需要读取整行,然后按分隔符
将其拆分


另一个错误是,当您使用
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();
}
while(输入!=-1){
int last=0;

对于(int i=0;i
String pair=keyboard.next();
这只读取一个由
分隔的标记,因此当您按
拆分
对时,它将只有一个元素,即字符串本身。因此您需要读取整行,然后按分隔符
拆分它


另一个错误是,当您使用
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();
}
while(输入!=-1){
int last=0;

对于(int i=0;iKeyboard.next()将只读取输入直到空格,所以pair和数组将只有一个数字,所以tab[1]会导致arrayOutOfBound异常。使用方法nextLine()读取输入直到空格。

Keyboard.next()将只读取输入直到空格,所以pair和数组将只有一个数字,所以tab[1] 导致arrayOutOfBound异常。使用方法nextLine()读取带空格的输入。

您可以尝试对代码进行以下更改:

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);
}
publicstaticvoidmain(字符串[]args){
扫描仪键盘=新扫描仪(System.in);
int input=Integer.parseInt(keyboard.nextLine());
字符串[]选项卡=新字符串[2];
字符串输出=”;
int速度=0;
while(输入!=-1){
int last=0;

对于(int i=0;i,您可以在代码中尝试以下更改:

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);
}
publicstaticvoidmain(字符串[]args){
扫描仪键盘=新扫描仪(System.in);
int input=Integer.parseInt(keyboard.nextLine());
字符串[]选项卡=新字符串[2];
字符串输出=”;
int速度=0;
while(输入!=-1){
int last=0;

对于(int i=0;i我并不真正理解您是如何提供输入的。但是,如果“3”恰好是您的第一行,那么split(“”)将返回长度为1的数组。因此,tab[0]将返回3,而tab[1]将给您一个nullPointerException

在执行第20行之前,尝试添加选项卡长度检查

这应该可以做到:

if(tab.length() > 1){

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

} 

我不太明白您是如何提供输入的。但是,如果“3”恰好是您的第一行,那么split(“”)将返回长度为1的数组。因此,tab[0]将返回3,tab[1]将给您一个nullPointerException

在执行第20行之前,尝试添加选项卡长度检查

这应该可以做到:

if(tab.length() > 1){

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

} 

String pair=keyboard.nextLine();
String pair=keyboard.next();
the
.next()
返回“来自此扫描仪的下一个完整令牌”我认为@SanketMakani暗示它可能只返回第一个单词而不是整行。如果用建议的行替换该行,它将获取整行。
String pair=keyboard.nextLine();
String pair=keyboard.next();
行中的
String pair=keyboard.next();
返回“来自此扫描仪的下一个完整标记。”我认为@SanketMakani暗示它可能只返回第一个单词而不是整行。如果用建议的行替换该行,它将获取整行。但是当我尝试下一行()而不是下一行()时,我得到了以下错误:
线程“main”java.lang.NumberFormatException中的异常:对于java.lang.NumberFormatException.forInputString(未知源)处的输入字符串:“”(未知源代码)在J1.SpeedLimit.main(SpeedLimit.java:20)的java.lang.Integer.parseInt(未知源代码)中当您开始循环使用enter键时,您应该执行keyboard.nextLine();但是当我尝试nextLine()而不是next()时,我得到了以下错误:
线程“main”java.lang.NumberFormatException中的异常:对于java.lang.NumberFormatException.forInputString(未知源)处的输入字符串:“”(未知源代码)在J1.SpeedLimit.main(SpeedLimit.java:20)的java.lang.Integer.parseInt(未知源代码)处
Ah您应该执行keyboard.nextLine();当您开始循环吃回车键时。当我在执行`4`中键入4并在线程“main”java中给出此错误
异常时,会遇到相同的问题。