0

In a simple servlet code,
I get a NULLPointerException thrown while giving query to prepared statement.

By what i understand, null pointer exception is thrown when an object defined null is given some new value.

But am not sure how to change the following code to run properly.

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: This is invoked from a servlet.

Update:

java.lang.NullPointerException at data.DataLogic.login(DataLogic.java:22) at serv.login.doPost(login.java:35) at serv.login.doGet(login.java:26) at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at 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) at java.lang.Thread.run(Unknown Source) Blockquote

Pls help. Thnks in advance.

4

4 回答 4

3

听起来要么失败,Class.forName要么DriverManager.getConnection失败,因此con从未分配过非空值。

与其仅仅在那里打印堆栈跟踪,不如抛出一个异常——如果你愿意,可能是一个运行时异常(因为你不能真正“处理”这种情况)。然后可以尽快发现错误,而不是假装构造函数正确成功。吞下这样的异常几乎总是会延迟问题而不是解决问题,而且这使得以后诊断变得更加困难。

于 2013-07-31T13:40:31.017 回答
0

Null Pointer 表示在行中;

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

有些东西是空的,这一行只能con是空的。因此,我假设您在构造对象实例之前调用静态方法太 initialise con

于 2013-07-31T13:40:38.503 回答
0

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

然而,访问对象的方法是在静态方法中,它确实需要之前调用任何对象的构造函数。

请不要以这种方式混淆静态和非静态方法。如果您要求登录方法是静态的,则在静态初始化程序中初始化连接。但是,我看不出在这种情况下使用静态方法的理由。

于 2013-07-31T13:42:16.893 回答
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 方法。

于 2013-07-31T13:45:51.543 回答