在下面的代码中原想让验证登陆3次失败就不能在验证了。
可是下面的循环却在每一次验证后都还有2次的机会,也就是提示我还有2次机会 
这个应该就是for循环的错误了吧 ,,大侠们帮忙找找错误在哪里出现 ,,又应如何解决呢?                  f=true;
 Scanner scanner = new Scanner(System.in);
ac: do{
System.out.print("\n"+"验证用户信息!"+"\n"+"输入用户名:");
 sc5 = scanner.next();
System.out.print("输入用户密码:");
 sc6 = scanner.next();
username = sc5;
password = sc6;
dd: for(int i=3;i>=1;i--){
if(i==0){
System.out.println("对不起你输入3次机会已过,登陆失败,请退出!");
break;
}
else{
if(user.getUsername().equals(username) && user.getPassword().equals(password)){
        System.out.println("恭喜你登陆成功!");
f = false;
break ac;

}else{
System.out.println("用户名或密码错误!验证失败!你还有"+(i-1)+"次机会");

f = false;
i=i-1;
break dd; }
}
}
 }while(f==false);

解决方案 »

  1.   

    改改写代码的习惯,各个职能分开成不同的方法不就容易多了public class TestCheck {
      // 模拟用户名密码
      private int seed = 0;  public String getMsg(int times, boolean result) {
        if (result == true && times <= 3) {
          return "成功!";
        }
        else if (times > 3) {
          return "超过3次验证失败!";
        }
        else {
          return "失败!";
        }
      }  public boolean check(String acc, String pwd) {
        boolean isok = false;
        // 校验逻辑
        return isok;
      }  public String[] getAccPwd() {
        String[] arrAccPwds = new String[] {
            String.valueOf(this.seed), String.valueOf(this.seed)
        };
        this.seed++;
        return arrAccPwds;
      }  public static void main(String[] args) {
        boolean loginstate = false;
        TestCheck check = new TestCheck();
        for (int i = 0; loginstate;) {
          String[] arrAccPwds = check.getAccPwd();
          loginstate = check.check(arrAccPwds[0], arrAccPwds[1]);
          check.getMsg(i, loginstate);
        }
      }}
      

  2.   

    漏了行跳出循环public class TestCheck {
      // 模拟用户名密码
      private int seed = 0;  public String getMsg(int times, boolean result) {
        if (result == true && times <= 3) {
          return "成功!";
        }
        else if (times > 3) {
          return "超过3次验证失败!";
        }
        else {
          return "失败!";
        }
      }  public boolean check(String acc, String pwd) {
        boolean isok = false;
        // 校验逻辑
        return isok;
      }  public String[] getAccPwd() {
        String[] arrAccPwds = new String[] {
            String.valueOf(this.seed), String.valueOf(this.seed)
        };
        this.seed++;
        return arrAccPwds;
      }  public static void main(String[] args) {
        boolean loginstate = false;
        TestCheck check = new TestCheck();
        for (int i = 0; loginstate;) {
          String[] arrAccPwds = check.getAccPwd();
          loginstate = check.check(arrAccPwds[0], arrAccPwds[1]);
          check.getMsg(i, loginstate);
          if (loginstate) break;
        }
      }
    }
      

  3.   

    代码还得调啊 ,调了一下,可以直接试着运行了public class TestCheck {
      // 模拟用户名密码
      private int seed = 1;  public String getMsg(int times, boolean result) {
        if (result == true && times < 3) {
          return "成功!";
        }
        else if (times >= 2) {
          return "超过3次验证失败!";
        }
        else {
          return "失败!你还有" + String.valueOf(2-times) + "次机会!";
        }
      }  public boolean check(String acc, String pwd) {
        boolean isok = false;
        // 校验逻辑
        return isok;
      }  public String[] getAccPwd() {
        String[] arrAccPwds = new String[] {
            String.valueOf(this.seed), String.valueOf(this.seed)
        };
        this.seed++;
        return arrAccPwds;
      }  public static void main(String[] args) {
        boolean loginstate = false;
        TestCheck check = new TestCheck();
        for (int i = 0; !loginstate;) {
          String[] arrAccPwds = check.getAccPwd();
          loginstate = check.check(arrAccPwds[0], arrAccPwds[1]);
          String msg = check.getMsg(i++, loginstate);
          System.out.println(msg);
          if (loginstate) break;
        }
      }
    }
      

  4.   


    boolean flag = false;
    for(int i=0;i<10;i++){
     for(int j=0;j<10;j++){
       if(j>i){
        flag = true;
    break;
    }
    if(flag){
    flag = false;
     break;
    }}
    }
      

  5.   

    方法一:标号中转(就是在外层for循环定义标号,break直接break到标号,有多少层跳多少层)(不推荐)方法二:标志判断(第一层前定义个boolean变量,如果内层要跳出就设置一下,外层每次要判断这个变量,看是不是内层要跳出去)
      

  6.   

    break label 和 continue label
      

  7.   

    lable:for(;;){
    for(;;){
    break lable;
    }
    }