我正在尝试 Java 登录方法。有人可以向我解释为什么我会得到 NullPointerException 。 。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Remote implements ActionListener {
Action action;
Gui gui;
String output;
Boolean result;
public Remote(Gui g, Action a) {
action = a;
gui = g;
actionListenerMeth(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
try {
String a = gui.username_tf.getText();
char[] c = gui.password_tf.getPassword();
String b = new String(c);
result = action.login(a, b);
} catch (Exception ee) {
ee.printStackTrace();
}
if (result == true) { //<--this is where Eclipse shows me the error ...
output = "You are Successfuly Loged In!";
} else {
output = "Username or Password is Wrong!";
}
gui.result_lb.setText(output);
}
public void actionListenerMeth(ActionListener ae) {
gui.login_bt.addActionListener(ae);
}
}
这是控制台日志:
线程中的异常&#34; AWT-EventQueue-0&#34;显示java.lang.NullPointerException 在nova.Remote.actionPerformed(Remote.java:29)at javax.swing.AbstractButton.fireActionPerformed(未知来源)at javax.swing.AbstractButton $ Handler.actionPerformed(Unknown Source)at javax.swing.DefaultButtonModel.fireActionPerformed(未知来源)at javax.swing.DefaultButtonModel.setPressed(未知来源)at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知 来自)java.awt.Component.processMouseEvent(未知来源)at
中的javax.swing.JComponent.processMouseEvent(未知来源)........等
以下是操作类中的登录方法:
import java.sql.*;
public class Action {
String url = "jdbc:mysql://localhost/";
String dbName = "test";
String driver = "com.mysql.jdbc.Driver";
String username = "root";
String password = "password";
Boolean result;
///
public Boolean login(String x, String y)
{
String user_var = x;
String pass_var = y;
///
try {
Class.forName(driver).newInstance();
Connection conn = DriverManager.getConnection(url + dbName, username, password);
Statement st = conn.createStatement();
ResultSet res = st.executeQuery("SELECT * FROM java where username='"+user_var+"' and password='"+pass_var+"' ");
while(res.next())
{
String user = res.getString("username");
String pass = res.getString("password");
if((user_var.equals(user)) && (pass_var.equals(pass))){
result = true;
}else{
result = false;
}
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return (result);
}
}
答案 0 :(得分:1)
看起来action.login(a, b);
会返回null
。
因此,在您的情况下,应将布尔对象null
与基元false
进行比较。
因此null
将使用boolean
转换为原始Boolean.booleanValue()
,并提供NullPointerException
。
所以你必须改变:
if (result == true)
到
if (result != null && result == true)
答案 1 :(得分:1)
您将result
声明为Boolean
对象,而不是boolean
原语。执行if (result == true)
时,VM会尝试使用result
上的方法调用将result
转换为布尔基元,该方法调用为空。
解决方案:使result
成为布尔值。这将隐式初始化为false
。
顺便说一句,您不需要说if (result == true)
,您只需说if (result)
。
答案 2 :(得分:1)
在使用框类型Boolean
之前,您需要了解Autoboxing and Unboxing。错误来自框类型Boolean
等于unbox类型布尔值true或false。如果使用框类型,则代码应为
Boolean result;
if (result != null)
或者如果您使用unbox类型,则代码应为
boolean result;
if (result == true) {//TODO}
实际上ubox boolean不需要==
。你可以声明喜欢这个
if (result){//DO SOMETHING}