Java循环和If-else语句未完成

Java循环和If-else语句未完成,java,if-statement,for-loop,Java,If Statement,For Loop,嘿,伙计们,我有这个代码,我正在为一个班级工作,我不知道我搞砸了什么。我相信这很简单,所以如果你能看一下,我会帮我纠正我的错误 背景:这是为了检查一个单词,以确保它包含标点字符、大写字母和小写字母,以及前8位数字 当我在netbeans中单步执行它时,for循环将只转到第二个if语句,然后返回顶部并再次迭代。它不会输入关于numFlag或upperFlag和lowerFlag的if语句 我让那些if语句检查标志是否为真,这样如果我已经检测到相应的字符类型,它就不会输入并继续 它确实可以编译和运行

嘿,伙计们,我有这个代码,我正在为一个班级工作,我不知道我搞砸了什么。我相信这很简单,所以如果你能看一下,我会帮我纠正我的错误

背景:这是为了检查一个单词,以确保它包含标点字符、大写字母和小写字母,以及前8位数字

当我在netbeans中单步执行它时,for循环将只转到第二个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();