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