0

単純なサーブレット コードでは、プリペアド ステートメントにクエリを渡すとき
NULLPointerExceptionがスローされます。

私が理解していることでは、null で定義されたオブジェクトに新しい値が与えられると、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: これはサーブレットから呼び出されます。

アップデート:

serv.login.doPost(login.java:35) の data.DataLogic.login(DataLogic.java:22) での java.lang.NullPointerException .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. org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve. java:123) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) で org.apache.catalina.core.StandardHostValve.org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) の invoke(StandardHostValve.java:171) 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) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) で org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) で java.util. java.util.concurrent.ThreadPoolExecutor$Worker.run(不明なソース) の java.lang.Thread で、concurrent.ThreadPoolExecutor.runWorker(不明なソース)。run(不明なソース) Blockquote

助けてください。よろしくお願いします。

4

4 に答える 4

3

Class.forNameいずれかまたはDriverManager.getConnection失敗したように聞こえるためcon、null 以外の値が割り当てられることはありませんでした。

そこにスタック トレースを出力するだけでなく、例外をスローする方がよいでしょう。必要に応じて実行時例外をスローすることもできます (この状況を実際に「処理」できないため)。これにより、コンストラクターが適切に成功したかのように装うのではなく、できるだけ早くエラーを見つけることができます。このような例外を飲み込むことは、ほとんどの場合、問題を修正するのではなく、問題を遅らせるだけであり、後で診断するのがはるかに難しくなります。

于 2013-07-31T13:40:31.017 に答える
0

Null Pointer は行内を意味します。

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

何かが null です。この行のみconが null になる可能性があります。したがって、オブジェクトのインスタンスが構築される前に静的メソッドを呼び出していると思われますcon

于 2013-07-31T13:40:38.503 に答える
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 に答える
0

投稿しているコードは機能しません。オブジェクトのコンストラクターで con 変数を初期化しています。

ただし、オブジェクトにアクセスするメソッドは、オブジェクトのコンストラクターを事前に呼び出す必要がある静的メソッドにあります。

そのように静的メソッドと非静的メソッドを混同しないでください。ログイン メソッドを静的にする必要がある場合は、静的初期化子で接続を初期化します。ただし、そのコンテキストで静的メソッドを使用する理由はわかりません。

于 2013-07-31T13:42:16.893 に答える