当我运行我的程序时,我得到错误java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0

时间:2014-11-21 23:43:04

标签: java

这是我的代码

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选择之前它会给出这个错误。

4 个答案:

答案 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

这应该可以为您提供所需的行为。

不要忘记考虑改变双输入工作大致相同。