Java ArrayIndexOutOfBoundsException错误
当我运行以下程序时,第20行出现错误,这是我的代码: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]
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;iString 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中给出此错误异常时,会遇到相同的问题。