【问题标题】:Newbie looking for help on a password code新手寻求密码帮助
【发布时间】:2014-12-15 21:11:16
【问题描述】:

我正在为我正在进行的项目寻求帮助。我对java比较陌生,正在努力制作一个生成密码的函数。这可能有很多错误,或者这可能是完全错误的,所以请对新手好点>.

import java.util.Random;

public class StillTesting {

    public static void main(String[] args) {
        System.out.println("Your new password is: " + generateValidPassword());
    }

    static private String generateValidPassword() {
        String numcase = "";
        String lowcase = "";
        String upcase = "";
        String halfpass = numcase.concat(upcase);
        String returnString = halfpass.concat(lowcase);

        System.out.print(returnString);

        Random r = new Random();

        String loweralphabet = "abcdefghijklmnopqrstuvwxyz";
        int n = loweralphabet.length();

        String upperalphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int N = upperalphabet.length();

        int num = 0;
        for (int i = 0; i < 3; i++) {
            num = r.nextInt(9);

            numcase = String.valueOf(num = r.nextInt(9));
            return numcase;
        }
        for (int i = 0; i < 3; i++) {
            lowcase = String.valueOf(loweralphabet.charAt(r.nextInt(n)));
            return lowcase;
        }
        for (int i = 0; i < 3; i++) {
            upcase = String.valueOf(upperalphabet.charAt(r.nextInt(N)));
            return upcase;
        }
        return returnString;
    }
}

【问题讨论】:

  • 这段代码不起作用吗?你有什么问题?
  • 当我运行代码时它只吐出 1 个数字。就是这样。
  • 预期的输出应该是什么?
  • 问题是你在你的 for 循环中返回。它将返回第一次迭代并且只返回一个值。
  • 您在第一个循环内的函数中returning,因此此时将放弃任何进一步的执行。

标签: java passwords generator


【解决方案1】:

好吧,看起来有几个人在我工作时发现了这些错误,但在我整理完所有内容后,您可能想看看这个工作版本,它解决了原始版本中的大部分问题:

import java.util.Random;

public class StillTesting {

    public static void main( String[] args )
    {
        System.out.println("Your new password is: " + generateValidPassword());
    }

    static private String generateValidPassword()
    {
        StringBuilder password = new StringBuilder();

        Random r = new Random();

        final String loweralphabet = "abcdefghijklmnopqrstuvwxyz";
        final String upperalphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        for(int i=0;i<3;i++)
        {
            password.append(String.valueOf(r.nextInt(10)));
        }
        for(int i=0;i<3;i++)
        {
            password.append(loweralphabet.charAt(r.nextInt(loweralphabet.length())));
        }
        for(int i=0;i<3;i++)
        {
            password.append(upperalphabet.charAt(r.nextInt(upperalphabet.length())));
        }

        return password.toString();
    }
}

【讨论】:

    【解决方案2】:

    好吧,确实有一些错误:

    1. 在分配 numcase、upcase 和 lowcase 的值之前,您正在设置 halfpass 和 returnString 值

    2. 您在每个 for 循环的第一次迭代中返回一个值,第一个 return 语句将返回第一个 numcase 值。有关 return 语句如何工作的更多信息here

    最后,returnString 语句永远不会到达。

    试试这样的:

     static private String generateValidPassword() 
     { 
         String numcase = "";
         String lowcase = "";
         String upcase = "";
    
    
         Random r = new Random();
    
         String loweralphabet = "abcdefghijklmnopqrstuvwxyz";
        int n = loweralphabet.length();
    
        String upperalphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int N = upperalphabet.length();
    
        int num = 0;
        for(int i=0;i<3;i++)
        {
            num=r.nextInt(9);
            numcase += String.valueOf( num = r.nextInt(9));
    
        }
        for(int i=0;i<3;i++)
        {
            lowcase += String.valueOf(loweralphabet.charAt(r.nextInt(n)));
        }
        for(int i=0;i<3;i++)
        {
            upcase += String.valueOf(upperalphabet.charAt(r.nextInt(N)));
        }
         String halfpass = numcase.concat(upcase);
         String returnString = halfpass.concat(lowcase);
    
        System.out.print(returnString);
        return returnString;
    }
    }
    

    【讨论】:

      【解决方案3】:

      您可能想尝试删除循环中的 return 语句,如下所示:

      static private String generateValidPassword() 
      { 
          String numcase = "";
          String lowcase = "";
          String upcase = "";
          String halfpass = "";
          String returnString = "";
      
          System.out.print(returnString);
      
          Random r = new Random();
      
          String loweralphabet = "abcdefghijklmnopqrstuvwxyz";
         int n = loweralphabet.length();
      
         String upperalphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
         int N = upperalphabet.length();
      
         int num = 0;
         for(int i=0;i<3;i++)
         {
             num=r.nextInt(9);
      
             numcase = String.valueOf(num);
             returnString += numcase;
         }
         for(int i=0;i<3;i++)
         {
             lowcase = String.valueOf(loweralphabet.charAt(r.nextInt(n)));
             returnString += lowcase;
         }
         for(int i=0;i<3;i++)
         {
             upcase = String.valueOf(upperalphabet.charAt(r.nextInt(N)));
             returnString += upcase;
         }
         return returnString;
       }
      

      这将为您提供类似 637xiqHMR 的输出。您将从每个循环生成的字母组合成一个字符串,然后在最后返回整个字符串,而不是在第一个循环的第一次迭代时返回。

      【讨论】:

      • 这解决了我的问题。非常感谢您的帮助!
      • @OMNONOM999 欢迎您。很高兴我能帮助你!你能把它标记为正确吗?
      【解决方案4】:

      这就是你要找的吗?以下程序的输出类似于433raeWPV675croJWV

      public static void main(String[] args) {
          System.out.println("Your new password is: " + generateValidPassword());
      }
      
      static private String generateValidPassword() {
      
          String pswd = "";
      
          Random r = new Random();
      
          String loweralphabet = "abcdefghijklmnopqrstuvwxyz";
          int n = loweralphabet.length();
      
          String upperalphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
          int N = upperalphabet.length();
      
          int num = 0;
          for (int i = 0; i < 3; i++) {
              num = r.nextInt(9);
      
              pswd += String.valueOf(num = r.nextInt(9));
          }
          for (int i = 0; i < 3; i++) {
              pswd += String.valueOf(loweralphabet.charAt(r.nextInt(n)));
      
          }
          for (int i = 0; i < 3; i++) {
              pswd += String.valueOf(upperalphabet.charAt(r.nextInt(N)));
      
          }
          return pswd;
      }
      

      【讨论】: