2013-12-15 119 views
0
import java.util.Scanner; 

public class WordShuffle 
{ 
    static Scanner in = new Scanner(System.in); 

    private static String getText() 
    { 
     log("in getText"); 
     String t; 
     log("Enter only alphabets"); 
     t = in.next(); 
     log("returned t= " + t); 
     return t; 
    } 

    private static void shuffleText(final String txt) 
    { 
     log("in shuffle= " + txt); 
     final int textLenght = txt.length(); 
     final char textArray[] = new char[textLenght]; 
     for (int i = 0; i < textLenght; i++) 
     { 
      textArray[i] = txt.charAt(i); 
     } 
     for (int i = 0; i < textLenght; i++) 
     { 
     } 
    } 

    public static void log(final String l) 
    { 
     System.out.println(l); 
    } 

    private static String validateText() 
    { 
     final String text = getText(); 
     log("in validate= " + text + ""); 
     final char[] tc = text.toCharArray(); 

     for (final char t : tc) 
     { 
      if (Character.isLetter(t)) 
      { 
       log("character = " + t); 
      } 
      else 
      { 
       System.out.println("Error occured, non alphabet found in text"); 
       log("error = " + t); 
       validateText(); 
      } 
     } 
     log("validate returned " + text); 
     return text; 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(final String[] args) 
    { 
     // TODO code application logic here 
     shuffleText(validateText()); 
    } 
} 

,它运行良好, 与smaple文本“ABC3”指出了错误3和复发的validate()方法 的请求再次输入时,如果输入了示例文本“abc”,它将一个接一个地返回文本“abc”和“abc3”。return语句执行两次无环

控制台输出低于

run: 
in getText 
Enter only alphabets 
abc3 
returned t= abc3 
in validate= abc3 
character = a 
character = b 
character = c 
Error occured, non alphabet found in text 
error = 3 
in getText 
Enter only alphabets 
abc 
returned t= abc 
in validate= abc 
character = a 
character = b 
character = c 
validate returned abc 
validate returned abc3 
in shuffle= abc3 
BUILD SUCCESSFUL (total time: 8 seconds) 
+0

是的,的确如此。因为'validateText()'自己调用。你的问题到底是什么? –

回答

1

我的建议,这里是在其他的只好回到最后正确的文本新validateText()方法

private static String validateText() { 
    String text = getText(); 
    log("in validate= " + text + ""); 
    char[] tc = text.toCharArray(); 

    for (char t : tc) { 
     if (Character.isLetter(t)) { 
      log("character = " + t); 
     } 
     else { 
      System.out.println("Error occured, non alphabet found in text"); 
      log("error = " + t); 
      log("validate returned " + text); 
      return validateText(); 
     } 
    } 
    return text; 
} 

我回到validateText()。

1

的问题是在你的else块,你在哪里打电话validateText()递归,并忽略返回值。这种情况下的方法将以任何方式返回用户输入的第一个值。您应该将else块更改为:

else { 
     System.out.println("Error occured, non alphabet found in text"); 
     log("error = " + t); 
     return validateText(); // Return the result 
    } 
0

vaidateText()被递归调用。因此,在第二个“正确”输入之后,第一个“不正确”输入将在第一个方法调用完成时返回。

+0

非常感谢你 –

1

这是因为您没有在出现故障时中断执行。错误是在validateText递归中,代码应该是:

return validateText(); 
+0

感谢您的回复 –

0

上面的答案是正确的。同时递归地调用函数可能会导致溢出,所以也许你应该重新考虑你的设计。为什么不使用简单的正则表达式呢? Google:正则表达式,正则表达式java 这是每个人都使用的。

+0

谢谢,将这样做 –