2012-04-20 2 views
0

Я разрабатываю систему регистрации с помощью jsp и сервлета, а когда я настраиваю локально, я не получаю исключение NullPointerException. Но когда я развертываю его на удаленном сервере, я получаю это исключение NullPointerException.Java NullPointException on Tomcat

Есть ли ошибки в моем коде.

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"); 
    } 

} 

} 

StackTrace:

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

Вы можете напечатать, что в строке 79 RegisterServlet.java –

ответ

2

Во всех вероятно капот класс драйвер не найден, а это означает, что вызов Class.forName() бросает ClassNotFoundException. Вы отправляете перенаправление (кстати, без регистрации исключения, которое не является хорошей идеей, вы уже можете видеть, что вам трудно найти ошибку), но вы не возвращаетесь с вашего вызова. Оставляя соединение null и вызывая NPE позже в коде при попытке позвонить prepareStatement).

Добавить return ; после отправки перенаправления, чтобы остановить ваш вызов.

Конечно, вы должны найти тот или иной способ, чтобы этот драйвер был доступен на вашем Tomcat.

+0

Вы считаете ошибку в Connection connection = null ;? Но если это null, почему я получаю сообщение об ошибке при выполнении SQL? – Isuru

+1

нет, вам нужно инициализировать соединение. Но проблема в том, что при вызове класса Class.forName() он фактически генерирует исключение ClassNotFoundException, поэтому вы переходите прямо в блок catch, отправляете перенаправление и затем продолжаете обрабатывать вызов. Когда вы дойдете до объекта readyStatement, соединение по-прежнему будет недействительным. –

+0

ОК, для чего это решение? Все в порядке, если я удаляю инициализацию соединения и использую Connection connection = DriverManager.GetConnection ( \t \t \t \t \t "JDBC: MySQL: // локальный: 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"); 

Извините, если это не правильный ответ, который я не являюсь экспертом как и все люди старше