这是我的代码
import java.io.*;
import java.util.*;
public class weightOnOtherPlanets {
public static void main(String[] args) {
Scanner kbReader = new Scanner(System.in);
System.out.println("Enter your weight");
double weight = kbReader.nextDouble();
System.out.println("choose a planet by entering the corresponging letter\n");
System.out.println("A. Voltar");
System.out.println("B. Krypton");
System.out.println("C. Fertos");
System.out.println("D Servantos");
String choice = kbReader.nextLine( );
char p = choice.charAt(0);
String answerPhrase = "Your weight is " + " " ;
switch(p){
case 'A':
case 'a':
System.out.println(answerPhrase +(.091*weight));
break;
case 'B':
case 'b':
System.out.println(answerPhrase + (.720*weight));
break;
case 'C':
case 'c':
System.out.println(answerPhrase + (.865*weight));
break;
case 'D':
case 'd':
System.out.println(answerPhrase + (4.612*weight));
break;
default:
System.out.println("Please enter either A,B,C,or D");
break;
}
}
}
我已经使用了几乎完全相同的代码用于另一个类似的练习项目,它工作得很好。当我运行程序时,它会转到要求输入重量的位置,然后显示选项列表,但在“main”中显示错误消息异常:
java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:686)
at weightOnOtherPlanets.main(weightOnOtherPlanets.java:14)
我不知道为什么在允许键盘输入进行String选择之前它会给出这个错误。
答案 0 :(得分:0)
这是因为Scanner
扫描线的方式。
输入双倍(重量)后,按返回。这告诉System.in
获取您输入的所有字符并将其传递给扫描仪。然后扫描仪读取感兴趣的部分 - 双号 - 但是让其他所有部分等待下一次操作。
这意味着您按下的 Return - 行尾 - 仍然存在。现在,接下来就是nextLine()
。扫描仪看到它,它会读取它拥有的所有字符,直到它找到一个行尾。但正如我们所说,终点就在那里。所以它会读取它,并为它提供它在它之前找到的所有字符。这根本不存在,因为在双号和行尾之间没有其他字符。
这意味着你得到一个空字符串。并且空字符串在0
位置没有字符,因为这意味着它不是空的。
所以你应该做的是,在收到双倍后,你应该添加一个kbReader.nextLine();
- 就像这样,而不是把值放在任何地方。这将跳过您为双人输入的行尾,然后您将正确地获得下一行。
但是,当您进行菜单阅读时,您应该在致电charAt(0)
之前检查字符串是否为空。毕竟,用户可以决定按 Return 而不是做出有效选择。所以你的系统要么忽略它,要么告诉他它不是合法的输入,而不是因为例外而失败。
答案 1 :(得分:0)
您致电nextDouble();
,之后致电nextLine()
以获取您的回答短语。但是对nextLine();
的调用只会消耗您输入double的行的其余部分,而且它将为空,因此choice.charAt(0);
将抛出异常。
尝试做这样的事情来消耗剩余的一行,然后调用nextLine()
来获得答案短语。
System.out.println("Enter your weight");
double weight = kbReader.nextDouble();
kbReader.nextLine(); // Consume the rest of the line
// ...
String choice = kbReader.nextLine(); // Get the actual input
char p = choice.charAt(0);
答案 2 :(得分:0)
试试这个:
public static void main(String[] args) {
Scanner kbReader = new Scanner(System.in);
System.out.println("Enter your weight");
double weight = kbReader.nextDouble();
System.out.println("choose a planet by entering the corresponging letter\n");
System.out.println("A. Voltar");
System.out.println("B. Krypton");
System.out.println("C. Fertos");
System.out.println("D Servantos");
String choice = kbReader.nextLine();
if (choice.isEmpty()) {
choice = kbReader.nextLine();
}
char p = choice.charAt(0);
String answerPhrase = "Your weight is " + " ";
switch (p) {
case 'A':
case 'a':
System.out.println(answerPhrase + (.091 * weight));
break;
case 'B':
case 'b':
System.out.println(answerPhrase + (.720 * weight));
break;
case 'C':
case 'c':
System.out.println(answerPhrase + (.865 * weight));
break;
case 'D':
case 'd':
System.out.println(answerPhrase + (4.612 * weight));
break;
default:
System.out.println("Please enter either A,B,C,or D");
break;
}
}
答案 3 :(得分:0)
您需要以不同方式阅读输入内容。这就是你抛出异常的原因。
char p = choice.charAt(0); // why not just do a string comparison instead?
是出现错误的地方。这是因为choice为null /没有charAt(0)。
无论如何,我会使用类似的东西
char p = ''
while(in.hasNext()) {
String input = in.nextLine();
if (p.length()>0){
p = choice.charAt(0);
}
//do whatever you wanted to with p
这应该可以为您提供所需的行为。
不要忘记考虑改变双输入工作大致相同。