我正在制作密码生成器和管理器。我通过 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/