0

这是我拥有的基本程序的一部分。我正在努力防止错误或错误信息通过。所以在这部分代码中,我将它设置在用户输入他们的名字的地方,但如果它包含数字或符号,它应该返回一个错误,直到输入适当的内容。但是,这只有时有效。我无法弄清楚它何时会或不会起作用的任何模式。我唯一注意到的是,时间越长,通过的可能性就越大。

import java.util.Scanner;

public class Challenge1Easy
{
    public static void main(String[] args)
    {
        Scanner reader = new Scanner(System.in);
        String name, username;
        int age;
        boolean good = false;

        System.out.print("What's your name? ");
        name = reader.nextLine();

        String[] name1 = name.split("");

        do
        {
            System.out.print("Sorry, your \"name\" has characters that aren't letters in it. Please enter a real name. ");
            name = reader.nextLine();

            String[] name2 = name.split("");

            for (int i = 0; i < name.length(); i++)
            {
                if(!Character.isLetter(name.charAt(i)))
                {
                    good = false;
                }

                else
                {
                    good = true;
                }
            }
        }

        while(good != true);

我在这里查看了一些不同的问题,并从这些问题/答案中提取了一些信息,并尝试在我的程序中实现它,但显然有些东西不起作用。我做错了什么,有时它会抓住它,但有时它不会?输入类似Man99的内容将导致提示输入新名称。但是,输入类似的khewriuhweiuf8489358934589734985345hiewf内容不会激活它。

请忽略任何未使用的变量。它们稍后在程序中使用,但不影响我发布的内容。

4

2 回答 2

0

尝试这个

boolean good = true;
do
{

    for (int i = 0; i < name.length(); i++)
    {
        if(!Character.isLetter(name.charAt(i)))
        {
            good = false;
            break;
        }

        else
        {
            continue;
        }
    }

    if (!good) {
        System.out.print("Sorry, your \"name\" has characters that aren't letters in it. Please enter a real name. ");
        name = reader.nextLine();
    }
}

while(good != true);
于 2014-09-04T02:02:24.967 回答
0

花点时间阅读你的for-loop,如果你必须阅读它,请阅读它。

for (int i = 0; i < name.length(); i++)
{
    if(!Character.isLetter(name.charAt(i)))
    {
        good = false;
    }

    else
    {
        good = true;
    }
}

假设这name看起来像N1NANA......

  • i = 0, name.charAt(i) = 'N',good == true
  • i = 1, name.charAt(i) = '1',good == false
  • i = 2, name.charAt(i) = 'N',good == true

...好吧有一个问题...如果名称中的最后一个字符是有效的,good将永远是true

相反,当您遇到无效字符时,您应该将good标志设置为false并停止处理其余文本,例如...

good = true;
for (int i = 0; i < name.length(); i++)
{
    if(!Character.isLetter(name.charAt(i)))
    {
        good = false;
        break;
    }
}

现在,如果你想做一些非常简单的事情,你可以使用类似...

good = text.matches("[a-zA-Z]");

true仅当在任何一种情况下都name包含介于两者之间的字符时,才会返回a-z。显然,这排除了类似的事情_,但您可以扩展这个想法以满足更多要求......

于 2014-09-04T02:02:37.293 回答