java Login抛出NullPointerException

时间:2015-04-24 07:52:59

标签: java eclipse nullpointerexception

我正在尝试 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);
}

}

3 个答案:

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