【问题标题】:Loop from a specific point to another point in Java?在Java中从一个特定点循环到另一个点?
【发布时间】:2015-12-23 10:04:57
【问题描述】:

我正在开发一个类似于数字时间机器的 Java 项目,它基本上保存在特定状态下发生的事情,将其归档到特定文件中,并将其存储在某个目录中以便安全保存.现在我正在研究密码功能。我已经掌握了检查它是否正确的基础知识,但是当我输入错误的答案时,课程会在说出“无效密码”后结束。 有没有办法让它从else 语句的结尾循环到main 的开头,这样我就不必每次都重新执行该类?

import java.util.Scanner;
import java.util.*;

public class Adam {

    public static void main(String args[]) {

        String passwrd = "password";
        String inputPassword;

        System.out.print("Please Input Password ");
        Scanner sc = new Scanner(System.in);
        inputPassword = sc.nextLine();

        if (inputPassword.equals(passwrd)) {
            System.out.println("Password Accepted, Loading Archive...");
        } else {
            System.out.println("Invalid Password");
        }
    }
}

【问题讨论】:

  • 听起来你想要一个 do/while 循环...
  • 将接受密码的代码移至 do-while 循环。密码必须有效才能退出循环。
  • 密码应该是散列的,而不是硬编码为“密码”

标签: java loops while-loop


【解决方案1】:

您可以使用 do while 循环,如果用户输入无效则继续循环,否则不继续。

import java.util.Scanner;
import java.util.*;

public class Adam {

    public static void main(String args[]) {
        String passwrd = "password";

        String inputPassword;
        boolean b = true;
        Scanner sc = new Scanner(System.in);
        do {

            System.out.print("Please Input Password ");

            inputPassword = sc.nextLine();

            if (inputPassword.equals(passwrd)) {

                System.out.println("Password Accepted, Loading Archive...");
                b = false;
            } else {

                System.out.println("Invalid Password");
                b = true;

            }

        } while (b);

    }
}

DEMO

【讨论】:

  • 非常感谢,帮了大忙!
【解决方案2】:

当你想运行一些代码时,检查结果,然后在必要时重复,最明显的结构是do while

类似于以下内容:

String inputPassword = null;
do {
    if (inputPassword != null)
        System.out.println("Invalid password");
     System.out.println("Enter password");
     inputPassword = sc.nextLine();
} while (!inputPassword.equals(password));

【讨论】:

    【解决方案3】:
        public static void main(String args[]) {
           String password = "password";
           String inputPassword;
    
            while(inputPassword == null || !inputPassword.equals(password)){
               System.out.print("Please Input Password ");
               Scanner sc = new Scanner(System.in);
               inputPassword = sc.nextLine();
    
               if (!inputPassword.equals(password)) {
                   System.out.println("Invalid Password");
               } 
           }
           System.out.println("Password Accepted, Loading Archive...");
        }
    

    【讨论】:

      【解决方案4】:

      最好限制输入密码的次数。例如,要尝试三次输入密码,您将拥有以下代码:

      Scanner sc = new Scanner(System.in);
      for (i = 0; i < 4; ++i) {
          System.out.print("Please Input Password ");
          inputPassword = sc.nextLine();
      
          if (inputPassword.equals(passwrd)) {
              System.out.println("Password Accepted, Loading Archive...");
              break;
          } 
          else {
              System.out.println("Invalid Password");
          }
      }
      

      【讨论】:

        【解决方案5】:

        只需将整个代码放入 while(true) 循环中,如果密码为 walid,您将中断该循环

        public static void main(String args[]) 
        {
            String passwrd = "password";
            String inputPassword;
        
            while(true)
            {    
                System.out.print("Please Input Password ");
                Scanner sc = new Scanner(System.in);
                inputPassword = sc.nextLine();
        
                if (inputPassword.equals(passwrd)) 
                {
                    System.out.println("Password Accepted, Loading Archive...");
                    break; //here you are getting out of loop
                } 
                else 
                {
                    System.out.println("Invalid Password");
                    //you are not breaking loop so the program will return to the beggining
                }
            }
        }
        

        【讨论】:

        • while(true) 循环看起来很丑,我宁愿使用标志以防密码无效。 while(!passwordCorrect) { ... if (inputPassword.equals(passwrd)) { passwordCorrect = true; ... }
        • @tbrown 一个标志也很丑,这就是do/while循环存在的原因。
        【解决方案6】:

        我在您的程序中添加了一个 while 循环和一个标志。请看:

        public static void main(String[] args) {
                String passwrd = "password";
        
                boolean wrongPassword = true;
        
                while(wrongPassword){
        
                    String inputPassword;
        
                    System.out.print("Please Input Password ");
                    Scanner sc = new Scanner(System.in);
                    inputPassword = sc.nextLine();
        
                    if (inputPassword.equals(passwrd)) {
        
                        System.out.println("Password Accepted, Loading Archive...");
                        wrongPassword = false;
        
                    } 
                    else {
                        System.out.println("Invalid Password");
                    }
                }
        
            }
        

        【讨论】:

          【解决方案7】:

          使用 do-while 循环:

          String passwrd = "password";
          String inputPassword ="";
          Scanner sc = new Scanner(System.in);
          
           do{
              System.out.print("Please Input Password ");
             // get the password from user
              inputPassword = sc.nextLine();
          
              // if password matches print success and break out of loop
              if (inputPassword.equals(passwrd)) {
                 System.out.println("Password Accepted, Loading Archive...");
                 break;
              } 
              else{
                 System.out.println("Invalid Password");
               }
          
             }while(true);
          

          【讨论】:

          • 为什么不在这里while (true)
          【解决方案8】:

          使用 do-while 循环。此外,您的代码存在一些安全问题:

          1. 不要使用 System.in 作为密码。请改用控制台。 (但是,如果您从 IDE 运行程序,您可能没有控制台。在这种情况下,请改用 GUI 方法。)

          2. 输入密码后立即对其进行散列。

          3. 输入后尽快清除密码缓冲区(即覆盖它)。请参阅Console 文档。

            Console con = System.console();
            if (con == null)
                throw new IOException("This JVM has no console");
            
            boolean pwdCorrect;
            do {
                char[] inputPassword = con.readPassword("Please input password: ");
                String hashedInputPassword = hashPassword(inputPassword);  // search Internet for how to hash a password
                for (int i = 0; i < inputPassword.length; i++)
                    inputPassword[i] = '\0';
                pwdCorrect = isValidPassword(hashedInputPassword);  // e.g. by looking it up in a password file
                if (pwdCorrect)
                    System.out.println("Password accepted. Loading archive...");
                else
                    System.out.println("Invalid password.");
            } while (!pwdCorrect);
            

          【讨论】:

            猜你喜欢
            • 2015-05-22
            • 1970-01-01
            • 2010-12-23
            • 1970-01-01
            • 2014-12-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多