空指针异常我的连接对象如何指向空

问题描述

堆栈跟踪

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

    

}



我有一个 store 类。我在初始化中连接jdbc。我在方法 insertuser 中的usertable中插入值。我的连接对象指向null。我的用户表在名为 Register 数据库中有五个varchar值。为什么我的连接对象指向null。我将jdbc jar连接到我的类路径。

解决方法

如果Store构造函数遇到任何异常,它将打印堆栈跟踪并在Store字段中返回带有null的部分构造的connection对象。

这将解释您所看到的。但是,如果不查看(完整的)堆栈跟踪,就无法告诉您所捕获的异常的原因。这类事情的典型解释包括:

  • 数据库驱动程序JAR不是类路径(正确)
  • 错误的数据库驱动程序JAR
  • 错误的数据库凭据
  • 错误的数据库主机或端口信息
  • 网络问题

您可以解决的问题:

  • 正如评论者所指出的,构造函数中的异常处理已中断。如果在建立连接时遇到异常,则构造函数应以异常终止。呼叫者需要处理它,或允许它传播。
  • 如果使用DriverManager.getConnection,则无需使用Class.forName来加载JDBC驱动程序。 DriverManager基础结构将根据jdbc URL的说明自行找到驱动程序。
,

您需要将包含类com.microsoft.sqlserver.jdbc.SQLServerDriver的jar文件添加到war文件的WEB-INF / lib文件夹中。