具有递归性的Java中的奇怪行为

时间:2014-03-02 20:18:28

标签: java

我正在学习Java。这是我简单的java测试。

import java.io.Console;
import java.util.regex.Pattern;


public class Pendu {

    private static final int MAX_ERRORS_ALLOWED = 10;
    private static final int MAX_WORDL_LENGHT = 10;

    public static void main(String[] args) {
        String motSaisi = Pendu.readMot();
        System.out.println("Le mot saisi est "+motSaisi);
    }

    public static boolean hasSpecialChar (String s) {
        Pattern p = Pattern.compile("[^a-zA-Z]");
        return (p.matcher(s).find());
    }

    public static String readMot(){
        char[] ChaineSaisi = System.console().readPassword("Joueur 1 : Veuillez saisir un mot sans chiffres ni lettres accentuées: ");
        String text = String.copyValueOf(ChaineSaisi);
        System.out.println("mot a testé "+text);

        if(Pendu.hasSpecialChar(text)) {
            Pendu.readMot();
        }
        System.out.println("mot correct "+text);
        return text;
    }
}

这样做的目的是输入一个单词女巫只有字符(a-Z A-Z)而且只有这个。当我用这样的例子运行时:

 Joueur 1 : Veuillez saisir un mot sans chiffres ni lettres accentu?es: 
    mot a test? )))
    Joueur 1 : Veuillez saisir un mot sans chiffres ni lettres accentu?es: 
    mot a test? """
    Joueur 1 : Veuillez saisir un mot sans chiffres ni lettres accentu?es: 
    mot a test? po
    mot correct po
    mot correct """
    mot correct )))
   Le mot saisi est )))

“)))”(这不是我所说的最后一个词,最后一个是“po”)。为什么会这样?

2 个答案:

答案 0 :(得分:1)

这是递归的一部分。当您第一次进行递归调用时,它将使当前执行过程为" pending"所以当所有的递归完成时(当有一个特殊的字符时),它会检查输入的最后一个字,然后是第(n-1)个,依此类推,直到它检查你的第一个字。

无论如何,如果您只想检查有效性,这是一种可怕的方法,因为您在每个输入处堆叠执行堆。它不仅很难看,而且可以创建一个OutOfMemory异常

无论如何,这里应该有用的东西:

while (!StringUtils.isAlpha((input = readString())));

StringUtils.isAlpha(myString)返回true,该字符串仅由ascii字母组成。 我想readString()是你的读函数。在这里,程序会询问您输入是否正确。

答案 1 :(得分:1)

您的本地变量ChaineSaisitextreadMot每次调用的本地变量。也就是说,每次调用readMot并初始化这些变量时,您实际上都会获得这些变量的新实例。

要执行您想要的操作,您需要将text值设置为内部调用readMot返回的值。如果您将内的行更改为<{1}}分支

if

然后您的程序应该执行您想要的操作,因为您将每个text = Pendu.readMot(); 变量设置为稍后调用text的值。