2012-04-20 11 views
0

jspとサーブレットを使用して登録システムを開発しています。ローカルで調整すると、NullPointerExceptionが発生しません。しかし、リモートサーバーに展開すると、このNullPointerExceptionが発生します。TomcatのJava NullPointException

私のコードに間違いがありますか?

package com.app.base; 

//imported necessary packages. removes for readability. 

public class RegisterServlet extends HttpServlet { 

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 

    PrintWriter out = null; 
    // Connection connection = null; 
    // Statement statement; 
    // ResultSet rs; 

    resp.setContentType("text/html"); 
    out = resp.getWriter(); 

    String fname = req.getParameter("fname"); 
    String lname = req.getParameter("lname"); 
    String email = req.getParameter("email"); 
    String password = req.getParameter("password"); 
    String city = req.getParameter("city"); 
    String country = req.getParameter("country"); 

    Connection connection = null; 
    try { 
     // Load the JDBC driver 
     Class.forName("com.mysql.jdbc.Driver"); 

     // Create a connection to the database 
     connection = DriverManager.getConnection(
       "jdbc:mysql://localhost:3306,/main", 
       "root", "root"); 

    } catch (SQLException ex) { 
     resp.sendRedirect("index.jsp?error=SQLError"); 
    } catch (ClassNotFoundException e) { 
     resp.sendRedirect("index.jsp?error=Class Not Found"); 
    } 

    PreparedStatement statement; 
    try { 
     statement = connection 
       .prepareStatement("INSERT INTO main.users(first_name, last_name, email, password, " 
         + "city, country, registered_time)VALUES(?,?,?,?,?,?, NOW())"); 
     statement.setString(1, fname); 
     statement.setString(2, lname); 
     statement.setString(3, email); 
     statement.setString(4, password); 
     statement.setString(5, city); 
     statement.setString(6, country); 

     int rs = statement.executeUpdate(); 

     if (rs == 1) { 
      resp.sendRedirect("index.jsp?registered=true"); 
      // String destination = "index.jsp?registered=true"; 
      // RequestDispatcher rd = 
      // getServletContext().getRequestDispatcher(destination); 
      // rd.forward(req, resp); 
     } 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 

     resp.sendRedirect("index.jsp?registered=false"); 
    } 

} 

} 

スタックトレース:すべての可能性の高いフードで

SEVERE: Servlet.service() for servlet [Register] in context with path [] threw exception 
    java.lang.NullPointerException 
at com.app.base.RegisterServlet.doPost(RegisterServlet.java:79) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399) 
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:306) 
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:322) 
at org.apache.tomcat.util.net.AprEndpoint$SocketWithOptionsProcessor.run(AprEndpoint.java:1688) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
at java.lang.Thread.run(Thread.java:722) 
+0

あなたのデータベースはlocalhoで動作していますか? st:3306をリモートサーバーに展開するとどうなりますか? –

+2

スタックトレースの最初の行を見てください: at com.app.base.RegisterServlet.doPost(RegisterServlet.java:79) '。 79行目には何がありますか? –

+0

は何RegisterServlet.java –

答えて

2

ドライバクラスはClass.forName()への呼び出しがClassNotFoundExceptionをスローすることを意味し、見つかりませんでした。あなたはリダイレクトを送信します(btw、良い考えではない例外をログに記録することなく、あなたはすでにエラーを見つけるのに苦労していることが分かります)。接続をnullにして、後でprepareStatementに電話をかけようとするとコード内にNPEが発生する)。

リダイレクトを送信してコールを停止した後に、return ;を追加します。

もちろん、あなたはTomcatでそのドライバを利用できる方法を見つける必要があります。

+0

あなたはConnection connection = null;でエラーが発生したと思いますか?しかし、それがnullの場合、SQLを実行するとエラーが発生するのはなぜですか? – Isuru

+1

いいえ、接続を初期化する必要があります。しかし、問題は、Class.forName()を呼び出すと実際にClassNotFoundExceptionがスローされ、catchブロックに移動してリダイレクトを送信してから、呼び出しを処理し続けるということです。 prepareStatementに到達すると、接続はまだnullです。 –

+0

これはどうしたのですか?接続の初期化を解除し、Connection connection = DriverManagerを使用すると問題はありません。getConnection( \t \t \t \t \t "JDBC:MySQLの:// localhostを:3306、/メイン"、 \t \t \t \t \t "ルート"、 "ルート")。 tryブロック内に? – Isuru

0

あなたは間違って

connection = DriverManager.getConnection(
      "jdbc:mysql://localhost:3306,/main", 
      "root", "root"); 

予告,/main

ではなく、これが正しい答えではない場合、私は専門家ではないよ

connection = DriverManager.getConnection(
      "jdbc:mysql://localhost:3306/main", 
      "root", "root"); 

申し訳ありませんがなければなりませんあなたの文字列で、余分入れ上記のすべての人のように

関連する問題