在servlet中发生空指针异常?

时间:2013-07-31 13:37:10

标签: java mysql

在一个简单的servlet代码中,我在查询准备好的语句时抛出 NULLPointerException

根据我的理解,当为对象定义null赋予一些新值时,抛出空指针异常。

但我不确定如何更改以下代码才能正常运行。

import java.sql.*;

public class DataLogic {
    static Connection con;
    static PreparedStatement ps;
    static ResultSet rs;

    DataLogic() {
            try{
                Class.forName("com.mysql.jdbc.Driver");
                con=DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root","");
            } catch(Exception e){
                e.printStackTrace();
            }
    }

    public static boolean login(String user, String pass)   {
        boolean b=false;
        try{
        /*Exception thrown in next line*/
            ps=con.prepareStatement("select * from login where uname=? and pass like ?");
            ps.setString(1, user);
            ps.setString(2, pass);
            rs=ps.executeQuery();
            //System.out.print(b=rs.next());
        } catch(Exception e){
            e.printStackTrace();
        }
        return b;
    }

}

PS:这是从servlet调用的
更新:

  

显示java.lang.NullPointerException       at data.DataLogic.login(DataLogic.java:22)       在serv.login.doPost(login.java:35)       在serv.login.doGet(login.java:26)       在javax.servlet.http.HttpServlet.service(HttpServlet.java:621)       在javax.servlet.http.HttpServlet.service(HttpServlet.java:728)       在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)       在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)       在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)       在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)       在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)       在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)       在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)       在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)       在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)       在org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)       at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:589)       at org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:312)       at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)       在java.lang.Thread.run(未知来源)   块引用

请帮助。事先提前。

4 个答案:

答案 0 :(得分:3)

听起来Class.forNameDriverManager.getConnection失败,因此永远不会为con分配非空值。

不仅仅是在那里打印堆栈跟踪,最好抛出异常 - 如果你想要的话可​​能是运行时异常(因为你无法真正“处理”这种情况)。然后,您可以尽快找到错误,而不是假装构造函数已成功正确。吞下像这样的总是这样的例外只会延迟问题而不是修复问题,这使得以后诊断变得更加困难。

答案 1 :(得分:0)

Null Pointer表示行;

ps=con.prepareStatement("select * from login where uname=? and pass like ?");

有些东西为空,只有con这一行才能为空。因此,我假设您在对象的实例构造得过于初始化con之前调用静态方法。

答案 2 :(得分:0)

您发布的代码无法使用。您正在对象的构造函数中初始化con变量。

访问该对象的方法是一个静态方法,它需要在之前调用任何对象的构造函数。

请不要以这种方式混淆静态和非静态方法。如果您要求登录方法是静态的,则在静态初始化程序中初始化连接。但是,我没有看到在该上下文中使用静态方法的原因。

答案 3 :(得分:0)

您将“登录”方法声明为静态! 这意味着它实例更少,或者换句话说,构造函数永远不会被称为bevor。你有没有通过调试器运行它?

您可以执行类似

的操作
public static boolean login(String user, String pass)   {
        DataLogic logic = new DataLogic();
        boolean b=false;
        try{
        /*Exception thrown in next line*/
            ps=logic.con.prepareStatement("select * from login where uname=? and pass like ?");
            ps.setString(1, user);
            ps.setString(2, pass);
            rs=ps.executeQuery();
            //System.out.print(b=rs.next());
        } catch(Exception e){
            e.printStackTrace();
        }
        return b;
    }

为此你的变量“con”需要公开,或者你必须提供一个getter方法。