for循环后的代码不执行(Java)

时间:2017-09-21 17:12:10

标签: java loops for-loop login dialog

我有一小段代码,应该根据文本文件中存储的内容检查输入的代号和密码。如果有比赛,它将开始比赛,一切都很好。但是如果没有匹配,则会弹出一个对话框,询问用户是否要再次尝试登录。

int input=0; //yes

do {
    codename=JOptionPane.showInputDialog(null,"Enter Codename: ");
    String password=JOptionPane.showInputDialog(null, "Enter Password: ");

    for(int i=0;i<users.length;i++){
        if((codename.equals(users[i].getCodeName())) && (password.equals(users[i].getPassword()))){
            System.out.println("\n\nCorrect");
            new Game();
        } else {
            System.out.println("\n\nIncorrect");
        }   
    }
    input = JOptionPane.showConfirmDialog(null, "Incorrect User name/Password\nWould you like to try again?");          
} while(input==0); //run while input is yes

问题:for循环后的代码没有执行。如果我针对用户[ i ]检查变量,则for循环后的代码不会运行,但如果我检查用户[ 2 ],那么它工作正常

不确定这是否重要,但我总是收到此错误:

Exception in thread "main" java.lang.NullPointerException
    at com.ramtin.Game.logOn(Game.java:505)
    at com.ramtin.Game.main(Game.java:397)

即使密码和代号匹配且程序运行良好,我也能得到它。

以上代码的完整代码:

    public static void logOn(){
        //ASK FOR CODENAME & PASSWORD FROM TEXTFILE BEFORE GAME BEGINS
        //read from text file

        UserData[]users=new UserData[20];
        int countU=0;

        try{
            BufferedReader readU = new BufferedReader(new FileReader("userdata.txt"));

            String line;

            while((line=readU.readLine())!=null){
                String []parts=line.split("#");

                String codeName = parts[0];
                String password=parts[1];

                //              System.out.println(parts[0]);
                //              System.out.println(parts[1]);
                users[countU]=new UserData(codeName, password);
                countU++;
            }
            readU.close();
        }
        catch(FileNotFoundException e){

        }
        catch(IOException e){

        }

        //PASSWORD & CODENAME

        int input=0; //yes

        do{
            codename=JOptionPane.showInputDialog(null,"Enter Codename: ");
            String password=JOptionPane.showInputDialog(null, "Enter Password: ");

            for(int i=0;i<users.length;i++){
                if((codename.equals(users[i].getCodeName()))&&(password.equals(users[i].getPassword()))){
                    System.out.println("\n\nCorrect");
                    new Game();
                }
                else{
                    System.out.println("\n\nIncorrect");
                }   
            }

            input = JOptionPane.showConfirmDialog(null, "Incorrect Username/Password\nWould you like to try again?");           
        }
        while(input==0); //run while input is yes
    }
}

UserData的完整代码:

public class UserData {

    private String codename;
    private String password;

    UserData (String codeName, String password)
    {
        this.codename = codeName;
        this.password= password;
    }


    String getCodeName()
    {
        return codename;
    }


    String getPassword()
    {
        return password;
    }


    public String toString ()
    {
        String temp = "\nCode name: "+codename+"\nPassword: " + password;
        return temp;
    }
    }

2 个答案:

答案 0 :(得分:0)

不要for(int i=0;i<users.length;i++){

for(int i=0;i<countU;i++){

countU之后的每个数组元素都会在users[i].getCodeName()

之类的空元素上调用方法时导致NPE

答案 1 :(得分:0)

您可以使用ArrayList,而不是使用长度为20的数组,因为它将动态扩展:

List<UserData> users = new ArrayList<>();

然后将每个用户数据添加到列表

users.add(new UserData(codeName, password));

并以

进行迭代
for(int i=0 ;i<users.size(); i++) {

这将阻止NullPointer,因为您只拥有与用户一样多的条目(并且还会根据您拥有的用户数量动态增长/缩小)。