2014-11-04 42 views
-1
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 
+2

请在提问时发布完整的错误消息/堆栈跟踪 – Martin 2014-11-04 15:54:10

+0

string有startwith()方法 – 2014-11-04 15:55:29

+0

@akwasiagyeman请更新问题! – StackFlowed 2014-11-04 15:55:51

回答

2

您在跟踪行字的方法是有问题的使用String.split(" ")打破行成一系列的单词和再while循环可以

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

我怀疑这是line上的子字符串,因为在处理所有单词时没有正确终止,因为变量y基于字符,而您的算法是分块单词。

1

您的问题是

int b = line.indexOf(" "); 

如果你读了java docs。如果找不到字符串,它将返回-1。 所以,如果b换成-1,那么这些行会是怎样评价:

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

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

当你调用pig = line.substring(x, b - 1);你假设B是一个积极的INT初始化,这只是如果您在评估int b = line.indexOf(" ");时确实存在字符串中的空格,则为true。如果没有,b的值将为-1,并且当您从中减去另一个1时,您试图使用超出字符串范围的值调用subString