我已经编写了一种方法,用一个包含所有用户名和密码的文本文件来检查输入的用户名和密码。有趣的问题是,如果细节是正确的,那么应用程序会进行,但如果细节不正确,则会返回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它会导致程序产生FATAL EXCEPTION:main,然后是NullPointerException - 它不应该简单地输出的System.out.println。
答案 0 :(得分:5)
当您到达文件末尾时,line
为null
因此,您无法在嵌套行中调用split()
(双关语)。
但是,不要使用此代码。这是非常错误的,一旦发布就会轻易泄露密码。