嘿伙计们,我有这个代码我正在上课,我无法弄清楚我搞砸了什么。我确定它很简单,所以如果你能看到它我会帮助我解决我的错误。
背景:这应该检查一个单词以确保它包含标点字符,大写字母和小写字母,以及前8位数字。
当我在netbeans中逐步执行它时,for循环将仅返回到第二个if语句,然后返回到顶部并再次迭代。它不会输入有关numFlag
或upperFlag
和lowerFlag
我有那些if语句检查标志是否为真,所以如果我已经检测到相应的字符类型,它就不会进入并继续。
它确实编译,并且运行我已经包含了我用来测试的主要方法,如果你想编译和测试它以方便
欢迎任何其他建议。如果我没有提供足够的信息,请告诉我您的需求。
有问题的代码:
public final class Checker {
private Checker() {}
public static boolean checkLegality(String _pass) {
boolean puncFlag = false;
boolean numFlag = false;
boolean upperFlag = false;
boolean lowerFlag = false;
char[] pass = _pass.toCharArray();
if (pass.length < 8) {
return false;
}
for (int i = 0; i < 9; i++) {
if (!puncFlag) {//enters check for puncuation only if it hasint detected any yet
int ascii = (int) pass[i];//converts to ascii
if (32 < ascii && ascii < 47) {
puncFlag = true;
}
} else if (!numFlag) {//enters check for numbers only if it hasint detected any yet
if (Character.isDigit(pass[i])) {
numFlag = true;
}
} else if (!upperFlag || !lowerFlag) {//enters check for letters only if it hasint detected both upper and lower yet
if (Character.isLetter(pass[i])) {
if (Character.isUpperCase(pass[i])) {//checks if upper case
upperFlag = true;
} else if (Character.isLowerCase(pass[i])) {
lowerFlag = true;
}
}
}
}
if (puncFlag
&& numFlag
&& upperFlag) {
return true;
} else {
return false;
}
}
}
我用来测试的主要方法
public class PasswordCheckermMain {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
//TO DO CODE HERE
Scanner in = new Scanner(System.in);
String pass;
boolean flag = false;
while (flag == false) {
System.out.println("Enter password: ");
pass = in.next();
if(Checker.checkLegality(pass)){
flag = true;
}
System.out.println("The password meets criteria: " + flag);
}
}
}
答案 0 :(得分:4)
您不应该在else-if
中进行测试,因为除非之前完成,否则不会进行所有检查。
E.g。
if (!puncFlag) {//enters check for puncuation only if it hasint detected any yet
...
}
if (!numFlag) {//enters check for numbers only if it hasint detected any yet
...
}
if (...)
旁注,你不必做
if (32 < ascii && ascii < 47) {
这将有效
if (' ' < pass[i] && pass[i] < '/') {
答案 1 :(得分:2)
numFlag仅在您看到数字时才会生效,否则它将保持为假。如果它是假的,你进入if语句,不做任何其他事情。因此,如果您只传递一个只有字母的密码,那么您永远不会将numFlag设置为true,也不会检查字母。
我认为你根本不应该阅读旗帜。你应该阅读每个字符并检查它是否是标点符号(设置标志)一个数字(设置标志)或字母(设置适当的标志)。
答案 2 :(得分:1)
为什么你甚至检查是否已经设置了标志?只是&#34;或在一起&#34;结果。此外,如果您使用String
缩短substring
,则可以使用&#34; foreach&#34;环。并且您不必为了将其值与int进行比较而转换为char:
public static boolean checkLegality(String _pass) {
boolean puncFlag = false;
boolean numFlag = false;
boolean upperFlag = false;
boolean lowerFlag = false;
if (_pass.length() < 8) {
return false;
}
char[] pass = _pass.substring(0,8).toCharArray();
for(char c : pass) {
puncFlag = puncFlag || (32 < c && c < 47);
upperFlag = upperFlag || (Character.isLetter(c) && Character.isUpperCase(c));
lowerFlag = lowerFlag || (Character.isLetter(c) && Character.isLowerCase(c));
numFlag = numFlag || Character.isDigit(c);
}
return puncFlag && upperFlag && lowerFlag && numFlag;
}
答案 3 :(得分:0)
从我看到的情况来看,如果您的密码长度为8个字符,则会因为您检查第一个 9 字符而崩溃。
你的循环应该是:
for (int i = 0; i < 8; i++) {
...
因为8个元素数组的最后一个索引是7(因为第一个索引是0)。
<强>更新强>
正如其他答案中所提到的,如果你想允许在标点符号或数字之前插入字母,那么你不应该使用else if
但是要分开if
语句......
我还建议您使用regular expression来检查这一点,demo可以用更少的行完成同样的工作。
答案 4 :(得分:0)
基本上我做的是更改else if(if(!numFlag)for just,为任何不同的输出添加try {} catch(例外e){}。同样在主类中,我更改了扫描器客栈和附近的客栈。 PasswordCheckermMain类
import java.util.Scanner; public class PasswordCheckermMain { public static void main(String[] args) { //TO DO CODE HERE Scanner inn = new Scanner(System.in); String pass; boolean flag = false; while (flag == false) { System.out.println("Enter password: "); pass = inn.next(); if(Checker.checkLegality(pass)){ flag = true; } System.out.println("The password meets criteria: " + flag); } inn.close(); } }
检查员课程
public class Checker {private Checker() {} public static boolean checkLegality(String _pass) { boolean puncFlag = false; boolean numFlag = false; boolean upperFlag = false; boolean lowerFlag = false; int ascii =0; char[] pass = _pass.toCharArray();
//adding try{ }catch{} for better programing
try{if (pass.length < 8) { return false; } for (int i = 0; i < 8; i++) { if (!puncFlag) { //if 1 enters check for puncuation only if it hasint detected any yet ascii = (int) pass[i];//converts to ascii if (32 < ascii && ascii < 47) {//if2 puncFlag = true; }//end if2 }//end if 1 //Note change else if for if if (!numFlag) { //enters check for numbers only if it hasint detected any yet if (Character.isDigit(pass[i])) { numFlag = true; } } else if (!upperFlag || !lowerFlag) {//enters check for letters only if it hasint detected both upper and lower yet if (Character.isLetter(pass[i])) { if (Character.isUpperCase(pass[i])) {//checks if upper case upperFlag = true; } else if (Character.isLowerCase(pass[i])) { lowerFlag = true; } } } }//end for if (puncFlag && numFlag && upperFlag && lowerFlag ) { return true; } else { return false; } }catch(Exception e){ return false; } }//end checklega
输出 输入密码: 12 @ Abxyz 密码符合条件:false 输入密码: 12.Abxyz 密码符合条件:true