StringIndexOutOFBoundsException:0

时间:2015-07-22 21:25:22

标签: java

我是Java的初学者,我遇到了用户控制的do-while循环的问题,该循环接受用户输入重复。这是循环结束时的代码。

System.out.print("Do you wish to continue? (Y for yes " +
                            "/ N for no)");
        input = keyboard.nextLine();
        input.length();
        repeat = input.charAt(0);

        }while (repeat == 'Y' | repeat == 'y');

我知道它因为价值而抛出异常,但无法弄清楚要做些什么来修复它,因为我确信它相对简单。谢谢你的帮助。

编辑1: 堆栈跟踪:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: 
String index out of range: 0 
at java.lang.String.charAt(Unknown Source) 
at FractionTest.main(FractionTest.java:59)

2 个答案:

答案 0 :(得分:1)

看起来你读的空行返回空字符串""所以那里没有字符(甚至不是第0个)。

通常在您使用nextLine之后立即使用nextABC方法,例如nextInt,因为此类方法不会使用行分隔符,而nextLine会读取文本直到下一行分隔符(或流的结尾)。

在这种情况下,您可以在nextLine之后添加nextInt以消费行分隔符。

无论如何为了避免从空字符串和异常中读取字符,您可以使用类似

的内容
} while (input.toLowerCase().startsWith("y"));

而不是

    input.length();//this actually doesn't change anything, you can remove it
    repeat = input.charAt(0);

} while (repeat == 'Y' | repeat == 'y');

答案 1 :(得分:1)

正如@Phesmo所提到的,你可能会得到0长线。这是一个不起眼的问题。在致电 public $defaultAction = 'manage_timesheet'; 之前,您是否曾在扫描仪上致电class A { public: bool operator<(const A& rhs) const {return true;} }; set<A> s; int main() { s.insert(A()); set<A>::iterator pos; pos = s.begin(); (A)*pos; // why temporary created here? return 0; } nextInt()nextLong()nextShort()nextByte()

试试这个

nextBoolean()

来自documentation

  

nextLine()
  查找并返回此扫描程序中的下一个完整令牌。完整的标记之前和之后是与分隔符模式匹配的输入。

或者这个

System.out.print("Do you wish to continue? (Y for yes / N for no)");

char ans;
do {
   ans = keyboard.next().charAt(0);
   // filter input
} while (ans == 'Y' || ans == 'y' || ans == 'N' || ans == 'n');

repeat = ans;

} while (repeat == 'Y' | repeat == 'y');

来自documentation

  

String Scanner#next()
  如果它匹配从指定字符串构造的模式,则返回下一个标记。

System.out.print("Do you wish to continue? (Y for yes / N for no)"); repeat = keyboard.next("[YyNn]").charAt(0); } while (repeat == 'Y' | repeat == 'y'); 是一个字符类模式,它意味着匹配集合中的任何字符。