我正在学习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”)。为什么会这样?
答案 0 :(得分:1)
这是递归的一部分。当您第一次进行递归调用时,它将使当前执行过程为" pending"所以当所有的递归完成时(当有一个特殊的字符时),它会检查输入的最后一个字,然后是第(n-1)个,依此类推,直到它检查你的第一个字。
无论如何,如果您只想检查有效性,这是一种可怕的方法,因为您在每个输入处堆叠执行堆。它不仅很难看,而且可以创建一个OutOfMemory异常
无论如何,这里应该有用的东西:
while (!StringUtils.isAlpha((input = readString())));
StringUtils.isAlpha(myString)返回true,该字符串仅由ascii字母组成。 我想readString()是你的读函数。在这里,程序会询问您输入是否正确。
答案 1 :(得分:1)
您的本地变量ChaineSaisi
和text
是readMot
每次调用的本地变量。也就是说,每次调用readMot
并初始化这些变量时,您实际上都会获得这些变量的新实例。
要执行您想要的操作,您需要将text
值设置为内部调用readMot
返回的值。如果您将内的行更改为<{1}}分支
if
然后您的程序应该执行您想要的操作,因为您将每个text = Pendu.readMot();
变量设置为稍后调用text
的值。