Java-ArrayIndexOutOfBoundsException错误

时间:2017-05-05 17:14:02

标签: 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];
    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)

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

* nextLine():读取当前行的剩余部分,即使它是空的。

def read_temp_raw(i):
    base_dir = '/sys/bus/w1/devices/'
    device_folder = glob.glob(base_dir + '28*')[i]
    device_file = device_folder + '/w1_slave'
    with open(device_file, 'r') as f:
        return f.readlines()

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以在代码中尝试以下更改:

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

答案 4 :(得分:0)

我确实理解你是如何提供输入的。但是,如果&#34; 3&#34;碰巧是你的第一行然后拆分(&#34;&#34;)将返回一个长度为1的数组。因此,tab [0]将返回3,tab [1]将给你一个nullPointerException。

在执行第20行之前,尝试添加对标签长度的检查。

这应该可以解决问题:

if(tab.length() > 1){

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

}