Java循环和If else语句未完成

时间:2016-02-18 16:27:00

标签: java if-statement for-loop

嘿伙计们,我有这个代码我正在上课,我无法弄清楚我搞砸了什么。我确定它很简单,所以如果你能看到它我会帮助我解决我的错误。

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

当我在netbeans中逐步执行它时,for循环将仅返回到第二个if语句,然后返回到顶部并再次迭代。它不会输入有关numFlagupperFlaglowerFlag

的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;
    }
        }

   }

我用来测试的主要方法

  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);
    }

}
}

5 个答案:

答案 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