程序不会看到我想要的问题

时间:2014-09-04 01:54:20

标签: java string for-loop boolean charat

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

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之类的内容不会激活它。

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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 = 0name.charAt(i) = 'N'good == true
  • i = 1name.charAt(i) = '1'good == false
  • i = 2name.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。显然,这排除了_之类的内容,但您可以扩展这个想法以满足更多要求......