Java循环和If-else语句未完成
嘿,伙计们,我有这个代码,我正在为一个班级工作,我不知道我搞砸了什么。我相信这很简单,所以如果你能看一下,我会帮我纠正我的错误 背景:这是为了检查一个单词,以确保它包含标点字符、大写字母和小写字母,以及前8位数字 当我在netbeans中单步执行它时,for循环将只转到第二个if语句,然后返回顶部并再次迭代。它不会输入关于Java循环和If-else语句未完成,java,if-statement,for-loop,Java,If Statement,For Loop,嘿,伙计们,我有这个代码,我正在为一个班级工作,我不知道我搞砸了什么。我相信这很简单,所以如果你能看一下,我会帮我纠正我的错误 背景:这是为了检查一个单词,以确保它包含标点字符、大写字母和小写字母,以及前8位数字 当我在netbeans中单步执行它时,for循环将只转到第二个if语句,然后返回顶部并再次迭代。它不会输入关于numFlag或upperFlag和lowerFlag的if语句 我让那些if语句检查标志是否为真,这样如果我已经检测到相应的字符类型,它就不会输入并继续 它确实可以编译和运行
numFlag
或upperFlag
和lowerFlag
的if语句
我让那些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;
}
}
}
如果,则不应在
中执行测试,因为如果不执行前一项,则不会执行所有检查。
例如
旁注,你不必这么做
if (32 < ascii && ascii < 47) {
if(32
这会奏效的
if (' ' < pass[i] && pass[i] < '/') {
if(“”
numFlag只有在看到数字时才会为真,否则它将保持为假。如果为假,则进入if语句,而不执行其他操作。因此,如果只传递字母密码,则永远不会将numFlag设置为真,也不会检查字母
我认为你根本不应该阅读这些标志。你应该阅读每个字符,然后检查它是标点符号(设置标志)、数字(设置标志)还是字母(设置适当的标志)。据我所见,如果你的密码是8个字符,它将崩溃,因为你检查了前9个字符
您的循环应该是:
for (int i = 0; i < 8; i++) {
...
for(int i=0;i<8;i++){
...
因为8元素数组的最后一个索引是7(因为第一个索引是0)
更新
如其他答案中所述,如果您希望在标点符号或数字之前有字母等,则不应使用else if
,而应使用单独的if
语句
我还建议您使用a来检查这一点,它应该在更少的行中完成相同的工作。为什么您甚至要检查是否已经设置了标志?只是“或一起”检查结果。此外,如果您使用子字符串缩短字符串,您可以使用“foreach”循环。您不必强制转换字符来比较其值与int:
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;
}
公共静态布尔校验合法性(字符串\u传递){
布尔puncFlag=false;
布尔numFlag=false;
布尔upperFlag=false;
布尔lowerFlag=false;
如果(_pass.length()<8){
返回false;
}
char[]pass=_pass.substring(0,8).toCharArray();
for(字符c:通过){
puncFlag=puncFlag | |(32
基本上,我所做的是将else if(if(!numFlag)更改为just if,为任何不同的输出添加try{}catch(excepction e){}。同样在主类中,我为inn更改了Scanner in并正确关闭inn。
PasswordCheckerMain类
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();
//添加try{}catch{}以更好地编程
试一试{
if(通过长度<8){
返回false;
}
对于(int i=0;i<8;i++){
如果(!puncFlag){
//if 1仅在未检测到任何漏洞时才进入puncuation检查
ascii=(int)传递[i];//转换为ascii
如果(32
输出:
输入密码:
12@Abxyz
密码符合条件:false
输入密码:
12.Abxyz
密码符合标准:true你给它的密码是什么?老实说,它与我给它的任何东西都不起作用。如果你不给它标点符号,那么它将永远不会到达numFlag、upperFlag或lowerFlag分支。如果密码更长呢?我们所知道的是它必须至少有8个字符长。它真的应该是(int i=0;i
。此外,这并不能解决OP的问题。问题在于if
/else if
logic@Tgsmith61591不,它应该在前8位检查密码。(但可以更长)@Tgsmith61591你是对的,但我通过阅读问题认为只需考虑前8个字符。“以及前8位数字中的数字”,我的错误。最初没有考虑到。但后一点仍然有效。有一个检查
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();