Исключение нулевого указателя. Как мой объект подключения указывает на нуль

#java #servlets #jdbc

#java #сервлеты #jdbc

Вопрос:

Трассировка стека

 java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1952)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1795)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at Store.<init>(Store.java:12)
    at RegisterServlet.doGet(RegisterServlet.java:38)
    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:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:165)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:452)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1201)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:654)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:319)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Sep 01, 2020 9:06:08 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [RegisterServlet] in context with path [/Registration] threw exception
java.lang.NullPointerException
    at Store.insertuser(Store.java:31)
    at RegisterServlet.doGet(RegisterServlet.java:40)
    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:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:165)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:452)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1201)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:654)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:319)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
  
 import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;


public class Store {
    Connection connection;

    Store() {
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

            String username = "sa";
            String password = "123456abcd";
            String url = "jdbc:sqlserver://localhost;databaseName=Register";



            connection = DriverManager.getConnection(url, username, password);

        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    public boolean insertuser(String string1, String string2, String string3, String string4, String string5) throws SQLException{
        
        String sql = "insert into dbo.Usertable values(?,?,?,?,?)";
        
        PreparedStatement pstmt = connection.prepareStatement(sql);//this is the place where connection is null

        pstmt.setString(1, string1);
        pstmt.setString(2, string2);
        pstmt.setString(3, string3);
        pstmt.setString(4, string4);
        pstmt.setString(5, string5);
        int i = pstmt.executeUpdate();
        if (i > 0) {
            return true;
        }
        
        return false;
    
    
        
    }

    

}



  

у меня есть хранилище классов. Я подключаю jdbc в init. Я вставляю значения в usertable в метод insertuser. Мой объект подключения указывает на нуль. Моя пользовательская таблица имеет пять значений varchar в базе данных с именем Register. Почему мой объект подключения указывает на нуль.У меня есть jdbc jar, подключенный к моему пути к классу.

Комментарии:

1. Можете ли вы показать точную трассировку стека или отладочную информацию, которая конкретно показывает, какая строка вызывает исключение и где именно connection находится null ?

2. я отредактировал его. в моем методе insertuser

3. Измените e.printStackTrace() на throw new RuntimeException(e); . Когда вы получаете исключение, это означает, что ваша попытка инициализировать ваше соединение не увенчалась успехом, и не стоит продолжать, как если бы это было успешно. Если ваше соединение не было инициализировано, нет смысла разрешать создание экземпляра хранилища, поскольку он не может функционировать должным образом. (Еще лучший подход — полностью удалить try / catch, удалить Class.forName и добавить throws SQLException в подпись конструктора.)

4. Вас укусила ваша неправильная обработка исключений в вашем конструкторе.

Ответ №1:

Если Store конструктор обнаружит какое-либо исключение, он напечатает трассировку стека и вернет частично созданный Store объект с null в connection поле.

Это объяснило бы то, что вы видите. Но мы не можем сообщить вам причину исключения, которое вы улавливаете, не видя (полной) трассировки стека. Типичные объяснения для такого рода вещей включают:

  • Файл драйвера базы данных не указывает путь к классу (правильно)
  • Некорректный JAR драйвера базы данных
  • Неправильные учетные данные базы данных
  • Неверная информация о хосте базы данных или порту
  • Проблемы с сетью

Вещи, которые вы могли бы исправить:

  • Как отмечали комментаторы, обработка исключений в вашем конструкторе нарушена. Если вы получаете исключение при настройке соединения, конструктор должен завершиться с исключением. Вызывающий должен справиться с этим или разрешить ему распространяться.
  • Если вы используете, DriverManager.getConnection вам не нужно использовать Class.forName для загрузки драйвера JDBC. DriverManager Инфраструктура сама найдет драйвер на основе того, что указано в URL-адресе jdbc.

Ответ №2:

Вам необходимо добавить файл jar, содержащий класс com.microsoft.sqlserver.jdbc.SQLServerDriver, в папку WEB-INF / lib вашего war-файла.