修复包含计数器的while循环

时间:2014-03-29 18:39:09

标签: java while-loop

我尝试使用while循环向我的程序添加一个计数器,但还没有能够使它工作。有人能告诉我我哪里出错了,我让它工作了一点但是如果我输入一个正确的值,那就错了"文本仍会出现,它不会突破循环。

public class Username {
    public static void main (String[]args) {    
        Scanner kb = new Scanner (System.in);
        String [] name = {"barry", "matty", "olly","joey"};
        int j = 0;

        while (j < 3) {
            System.out.println("Enter your name");
            String name1 = kb.nextLine();
            boolean b = true;
            for (int i = 0; i < name.length; i++) {
                if (name[i].equals(name1)) {
                    System.out.println("you are verified you may use the lift");
                    break; // To stop loop checking names
                }
            }
            System.out.println("wrong");
            j++;        
        }
    }
}

4 个答案:

答案 0 :(得分:5)

外部循环while用于允许的尝试。您需要一种额外的方式来指示它中断,因为break语句只会从for循环中断。一种方法是使用boolean idicator:

boolean found = false;
int attempts = 0;
while (!found && attempts < 3) {
    System.out.println("Enter your name");
    String name1 = kb.nextLine();

    for (int i = 0; i < name.length; i++) {
        if (name[i].equals(name1)) {
            System.out.println("you are verified you may use the lift");
            found = true;
            break;// to stop loop checking names
        }
    }
    if (!found) {
        System.out.println("wrong");
    }
    ++attempts;
}

答案 1 :(得分:2)

就像Carlo先生在评论中所说的那样,你建立循环的方式可以最快地解决将j = 3插入if语句的问题。 然而,正在发生的事情是,一旦它遇到break语句,它只会退出for循环,并且因为j在第一次运行时仍然是0,它会打印出文本,并继续运行。你只需要让程序认识到for循环找到了一个有效的名字,并告诉while循环它可以因为这个而退出。

编辑:在这种情况下,我可能会这样做:

while(j<3)//and all outside code being the same
{
    System.out.println("Enter your name");
    String name1 = kb.nextLine();
    boolean found = false;//renamed other-wise useless boolean
    for(int i = 0; i < name.length; i++)
    {
        if(name[i].equals(name1))
        {
            found = true;
            System.out.println("you are verified you may use the lift");
            break;
        }
    }
    if(found)
        break;
    System.out.println("wrong");
    j++;
 }

答案 2 :(得分:1)

您正在使用j作为“重试”计数器来重试失败的输入。问题是,您没有打破良好输入的重试循环。

break只会突破最内层的循环。我建议还有一个外循环可以检查的某种标志。例如:

int retries = 0;
boolean success = false;

do {
    ... get input;
    if (input is valid)
       success = true;
    else
       retries ++;
} while (retries < 3 && !success); 

if (success)
    all good;
else
    gave up after retries.

逻辑上,这与您的意图相呼应:继续重试,直到达到最大重试限制,或者我们已收到有效输入。

答案 3 :(得分:1)

对代码的最小更改是使用标签和break <label>; - 它会打破标记为标记的循环,而不是当前循环:

import java.util.Scanner;


 public class Username
{


public static void main (String[]args)


{   
    Scanner kb = new Scanner (System.in);
    // array containing usernames 
    String [] name = {"barry", "matty", "olly","joey"}; // elements in array

    int j = 0;
outerloop:  while (j < 3)
            {

                System.out.println("Enter your name");
                String name1 = kb.nextLine();
                boolean b = true;

                for (int i = 0; i < name.length; i++) {

                    if (name[i].equals(name1))
                    {

                        System.out.println("you are verified you may use the lift");
                        break outerloop;// to stop loop checking names

                    }



                }
                System.out.println("wrong");
                ;j++;

            }

}}

有关标记中断的详细信息,请参阅http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

相关问题