java - 将 System.out.print 方法中的数据存储到字符串中(Java)?

标签 java input

我正在制作密码生成器和管理器。我通过 for 循环一次生成一个字符来创建密码。在每次 for 循环迭代结束时,它会打印出所选的随机字符。我一直在尝试将密码逐字符存储到与 for 循环中 i 的值相关的数组的索引中。那不是它只是打印而我无法做任何事情。因此我有两个问题,我的主要问题是:是否可以捕获我打印的字符然后将它们存储在一个字符串中?或者,就像下面的代码一样,我能否避免运行时出现的空指针异常(通过我的数组)?当我尝试在索引 i 处为我的 passwordString 分配一个字符串时,会发生空指针异常。我的代码可能会更好地解释它。 感谢您的帮助:)

package pass.gen;


public class PassGen {


    public static void main(String[] args) {
        PassGen passGen = new PassGen();
        passGen.generate();
    }

    String lAlpha = "abcdefghijklmnopqrstuvwxyz"; //used to generate lowercase pass chars
    String uAlpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //used to generate uppercase pass chars
    int minNum = 0; //the mininum number that a integer value can be in the password
    int maxNum = 9; //the max number "" ...........................................""
    int randomNumber; 
    int minString = 0;
    int maxString = 25;
    int randomLNum;
    int randomUNum;
    int low1 = 1;
    int high3 = 3;
    int ran3;
    char randomLChar;
    char randomUChar;
    char randomNumChar;
    String randomLString;
    String randomUString;
    String randomNumString;
    String passString []; //should this be an array of chars? 
    boolean case1; //if the case is true (case1 is for random numbers) then a random number is added to the passString
    boolean case2; //if the case is true (case2 is for random lowercase letters) then a random lowercase letter is added to the passString
    boolean case3; //if the case is true (case3 is for random uppercase letters) then a random uppercase letter is added to the passString

    void generate(){
        for(int i = 0; i < 4; i++){
            ran3 = low1 + (int)(Math.random() * ((high3 - low1) + 1));
            switch(ran3){
            case 1:genNumber(0,9);
            break;
            case 2:genLAlpha();
            break;
            case 3:genUAlpha();
            break;
            default:System.out.println("Unable to Generate a Password.");
            }
            if(case1 == true){
                passString[i] = randomNumString;

            }if(case2 == true){
                passString[i] = randomLString;

            }if(case3 == true){
                passString[i] = randomUString;
            }
        }
        System.out.println(passString);
    }

    void genNumber(int min, int max){
        randomNumber = min + (int)(Math.random() * ((max - min) + 1));
        randomNumChar = Character.forDigit(randomNumber,5);
        case1 = true;
    }

    void genLAlpha(){
        randomLNum = minString + (int)(Math.random() * ((maxString - minString) + 1));
        randomLChar = lAlpha.charAt(randomLNum);
        randomLString = Character.toString(randomLChar);
        case2 = true;
    }

    void genUAlpha(){
        randomUNum = minString + (int)(Math.random() * ((maxString - minString) + 1));
        randomUChar = uAlpha.charAt(randomUNum);
        randomUString = Character.toString(randomUChar);
        case3 = true;
    }


}

最佳答案

  • passString 未初始化,因此是您的 NullPointerException
  • 的原因
  • genNumber 不设置 randomNumString 的值,因此它将始终为 null

您的“生成”方法应该返回它们生成的值。这将消除对成员变量的依赖,减少可能出现问题的区域数量。这也意味着您可以添加新的生成方法而无需更改大量代码...

即使您选择不这样做,您也应该有一个变量来保存每个计算的结果...

试试这个...

public class PassGen {

    public static void main(String[] args) {
        PassGen passGen = new PassGen();

        String generate = passGen.generate();
        System.out.println(generate);

    }
    String lAlpha = "abcdefghijklmnopqrstuvwxyz"; //used to generate lowercase pass chars
    String uAlpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //used to generate uppercase pass chars
    int minNum = 0; //the mininum number that a integer value can be in the password
    int maxNum = 9; //the max number "" ...........................................""
    int minString = 0;
    int maxString = 25;
    int low1 = 1;
    int high3 = 3;

    public String generate() {
        StringBuilder sb = new StringBuilder(4);

        for (int i = 0; i < 4; i++) {
            sb.append(generateCharacter());
        }
        return sb.toString();
    }

    protected char generateCharacter() {
        char result = '-';
        int ran3 = low1 + (int) (Math.random() * ((high3 - low1)));
        switch (ran3) {
            case 0:
                result = genNumber(0, 9);
                break;
            case 1:
                result = genLAlpha();
                break;
            case 2:
                result = genUAlpha();
                break;
        }

        return result;

    }

    protected char genNumber(int min, int max) {
        int randomNumber = min + (int) (Math.random() * ((max - min) + 1));
        char randomNumChar = Character.forDigit(randomNumber, 5);
        return randomNumChar;
    }

    protected char genLAlpha() {
        int randomLNum = minString + (int) (Math.random() * ((maxString - minString) + 1));
        char randomLChar = lAlpha.charAt(randomLNum);
        return randomLChar;
    }

    protected char genUAlpha() {
        int randomUNum = minString + (int) (Math.random() * ((maxString - minString) + 1));
        char randomUChar = uAlpha.charAt(randomUNum);
        return randomUChar;
    }
}

此外,我强烈建议您抽出一些时间来学习如何使用 IDE 的调试器。如果您不使用 IDE,我强烈建议您开始。我花了 30 秒来添加断点并找到你的 NullPointerException

关于java - 将 System.out.print 方法中的数据存储到字符串中(Java)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12240406/

相关文章:

java - JNI getObjectClass 使 VM 崩溃

c++ - cin.get() 错误

javascript - 根据输入类型隐藏/显示=文件值

检查输入是否为字符串(仅限 4 个字符),如果不是则返回再次输入

java - 使用 Spring 的密码加密/解密

java - 中心摆窗

java - 同一服务器上的多个 java webapp

javascript - 设置输入文本的固定长度

jquery - 实现:自动完成输入将内容向下移动

java - 使用Java将十六进制转储的字符串表示形式转换为字节数组?