繁体   English   中英

Null 指针异常。 我的连接 object 如何指向 null

[英]Null pointer exception. How my connection object is pointing to null

堆栈跟踪

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

    

}



我有一家 class商店 我在 init 中连接 jdbc。 我使用 insertuser 方法在usertable中插入值。 我的连接 object 指向 null。我的用户表在名为Register的数据库中有五个 varchar 值。 为什么我的连接 object 指向 null。我有 jdbc jar 连接到我的类路径。

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

那可以解释你所看到的。 但是我们不能在没有看到(完整的)堆栈跟踪的情况下告诉您您正在捕获的异常的原因。 对这种事情的典型解释包括:

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

您可以解决的问题:

  • 正如评论者指出的那样,构造函数中的异常处理被破坏了。 如果在建立连接时遇到异常,构造函数应该以异常终止。 调用者需要处理它,或者允许它传播。
  • 如果您使用DriverManager.getConnection ,则不需要使用Class.forName来加载 JDBC 驱动程序。 DriverManager基础结构将根据 jdbc URL 的内容为自己找到驱动程序。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM