Java登录方法:如果详细信息正确,则运行,如果不正确,则运行NullPointerException

Java登录方法:如果详细信息正确,则运行,如果不正确,则运行NullPointerException,java,android,nullpointerexception,Java,Android,Nullpointerexception,我已经编写了一个方法,用一个包含所有用户名和密码的文本文件来检查输入的用户名和密码。有趣的问题是,如果详细信息正确,那么应用程序将继续运行,但如果详细信息不正确,则返回NullPointerException。我的代码如下: // Checks whether the inputed details are correct public boolean isCorrect(String u, String p) { boolean check = false; String li

我已经编写了一个方法,用一个包含所有用户名和密码的文本文件来检查输入的用户名和密码。有趣的问题是,如果详细信息正确,那么应用程序将继续运行,但如果详细信息不正确,则返回NullPointerException。我的代码如下:

// Checks whether the inputed details are correct
public boolean isCorrect(String u, String p) {
    boolean check = false;
    String line = null;
    try {
        do {
            line = br.readLine();
            // System.out.println("Checking profile : " + line);
            String[] info = line.split("\t");
            // nested if-statement to improve efficiency over &&
            if (info[0].equals(u)) {
                System.out.println("username found!");
                if (info[1].equals(p)) {
                    System.out.println("password correct!");
                    check = true;
                } else System.out.println("password incorrect!");
            } else System.out.println("username not found!");
        } while (line != null && check == false);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return check;
}
返回的布尔值输入到主活动中的以下代码中:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.loginpanel); 
    Button button = (Button) findViewById(R.id.btnLogin);
            Correct = false;



    lm = new LoginModel(this);

    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            EditText textUsername = (EditText) findViewById(R.id.textUsername);
            EditText textPassword = (EditText) findViewById(R.id.textPassword);

            // Collect the login details entered by the user
            String username = textUsername.getText().toString();
            String password = textPassword.getText().toString();

            // Check the application is registering the correct details
            System.out.println(username + "\n" + password);

            Correct = lm.isCorrect(username, password);

            if (Correct) { // if details are correct then start main program
                Intent intent = new Intent (LoginView.this, MenuListView.class);
                startActivity(intent);
            }
            else System.out.println("Login is incorrect...");
        }
    });
}

我不明白的是,为什么如果Correct=true,那么它运行没有问题,但是如果Correct=false,它会使程序崩溃,产生一个致命的异常:main,然后是一个NullPointerException-它不应该简单地输出System.out.println。

当您到达文件末尾时,
null

因此,不能在嵌套行中调用
split()
(双关语)


但是,不要使用此代码。这是非常错误的,一旦发布,密码就会泄漏。

当您到达文件末尾时,

因此,不能在嵌套行中调用
split()
(双关语)


但是,不要使用此代码。这是非常错误的,一旦发布,密码就会泄漏。

不要以纯文本形式存储密码。尤其是在客户端上,您没有显示NullPointerException实际发生的位置-堆栈跟踪显示了什么?
//嵌套if语句以提高效率,而不是&
错误<代码>&&是短路。能否包括stacktrace及其指向的行?如何提供格式化的stacktrace?当我复制它时,它会丢失它的结构…不要将密码存储在纯文本中。尤其是在客户端上,您没有显示NullPointerException实际发生的位置-堆栈跟踪显示了什么?
//嵌套if语句以提高效率,而不是&
错误<代码>&&是短路。能否包括stacktrace及其指向的行?如何提供格式化的stacktrace?当我复制它时,它会失去它的结构…感谢你指出错误的地方-我将重写代码,记住每个人都说过的话!取而代之的是,在一个安全的私有服务器上使用salted hash。感谢您指出错误所在-我将重写代码,记住每个人都说过的话!相反,在安全的私有服务器上使用salted哈希。