我不断越界错误我如何解决这个问题?

时间:2014-11-04 15:46:31

标签: java

Scanner scan = new Scanner(System.in);
System.out.println("Enter a word");
String line = scan.nextLine();
String pig = "";
int a = line.length();

int x = 0;
int y = 0;

while (y < a) {
    int b = line.indexOf(" ");

    if (line.substring(x, x + 1).equals("a") || 
            line.substring(x, x + 1).equals("e") || 
            line.substring(x, x + 1).equals("i") || 
            line.substring(x, x + 1).equals("o") || 
            line.substring(x, x + 1).equals("u"))
    {
        pig = line.substring(x, b - 1);
    }

    else {
        pig = line.substring(b - 1, x + 2) + line.charAt(x);
    }

    line = line.substring(b + 1);
    y++;
}

System.out.println(pig);

我想把任何一个句子中的单词转换为猪拉丁语如果单词以元音开头只是在末尾加上方式,如果它以辅音开头将第一个字母带到后面并添加方式

堆栈跟踪:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at
java.lang.String.substring(Unknown Source) at pig_latin.main(Firstname_Lastname.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at
java.lang.reflect.Method.invoke(Unknown Source) at
edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:27‌​2

3 个答案:

答案 0 :(得分:2)

用于跟踪行中单词的方法是一个问题,使用String.split(" ")将行分成一系列单词然后你的while循环可以

String[] words = line.split(" ");
for(String word:words) {
   // do pig latin on word
}

我怀疑它是line上的子字符串失败,因为当你处理完所有单词时你没有正确终止,因为变量y是基于字符的,你的算法是分块的。

答案 1 :(得分:1)

你的问题是

int b = line.indexOf(" ");

如果您阅读java docs。如果找不到字符串,它将返回-1。 因此,如果b变为-1,那么这些行将被评估为:

pig = line.substring(x, -2);

pig = line.substring(-2, x + 2) + line.charAt(x);

答案 2 :(得分:1)

当你调用pig = line.substring(x, b - 1);时,你假设b用一个正整数初始化,只有当你评估int b = line.indexOf(" ");时,字符串中才有一个空格。如果没有,b的值将为-1,当您从中减去额外的1时,您尝试使用不在其中的值调用subString字符串的界限。