Java密码生成器While循环条件为假仍不终止问题排查
问题分析与解决方案
你的while循环陷入持续运行的情况,主要有以下几种可能原因,对应解决方法如下:
1. 排除所有字符类型导致死循环
如果用户选择不包含全部4类字符(小写、大写、数字、特殊字符),naoColocar数组会被赋值为[1,2,3,4]。此时numAleatorio只能生成1-4的随机数,必然匹配数组中的某一个元素,while循环永远无法退出,直接导致密码无法生成。
解决方法:
在生成密码前添加校验逻辑,确保用户至少选择一种字符类型:
// 检查是否所有类型都被排除 boolean allExcluded = true; for (int num : naoColocar) { if (num == 0) { allExcluded = false; break; } } if (allExcluded) { System.out.println("请至少选择一种密码包含的字符类型"); return; }
2. naoColocar数组赋值错误
如果赋值逻辑出错,比如误将多个数组位置设为同一个有效排除值(如naoColocar[0]和naoColocar[1]都设为1),或者把默认的0改成了1-4中的某个数,会导致合法的字符类型被错误拦截,甚至陷入死循环。
解决方法:
检查赋值naoColocar的代码,确保只有当用户明确选择排除某类字符时,才将对应数字存入数组对应索引,未排除的位置保持默认值0。
3. 循环判断逻辑冗余且易出错
原代码用多个||连接数组元素的判断,不仅写法繁琐,还容易因数组修改出现遗漏。更高效可靠的方式是用集合存储需要排除的数字,简化判断逻辑。
优化后的代码示例:
// 提前将需要排除的数字存入Set(仅在初始化时执行一次即可) Set<Integer> excludeSet = new HashSet<>(); for (int num : naoColocar) { if (num != 0) { // 只加入有效排除值,忽略默认的0 excludeSet.add(num); } } // 生成密码的循环逻辑 for (int x = 0; x < tamanhoDaSenha; x++) { int numAleatorio; // 循环生成随机数,直到得到未被排除的类型 do { numAleatorio = random.nextInt(4) + 1; // 生成1-4的随机数 } while (excludeSet.contains(numAleatorio)); // 根据类型添加对应字符 switch (numAleatorio) { case 1: senha += letrasMin[random.nextInt(26)]; break; case 2: senha += letrasMai[random.nextInt(26)]; break; case 3: senha += numeros[random.nextInt(10)]; break; case 4: senha += charEspeciais[random.nextInt(11)]; break; } }
内容的提问来源于stack exchange,提问作者Poguinho
相关产品推荐
相关产品推荐

