【问题标题】:Connection is null but Why连接为空,但为什么
【发布时间】:2019-04-09 01:16:45
【问题描述】:

readAll() 方法中,我的Connection 上有一个NullPointerException,但是为什么,我该如何改变它?

如果我使用主类对其进行测试,一切正常,但如果我在服务器(Web 服务器 - 本地)上执行相同操作,则会抛出 NullPointerException

这是我的ConnectionManager 课程:

public class ConnectionManager {

    private volatile static ConnectionManager connectionManager = null;
    private Connection connection = null;

    private ConnectionManager() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        DBProperties properties = DBProperties.getInstance();

        String url = properties.getStringProperty("databaseURL") + properties.getStringProperty("pathToDB") + properties.getStringProperty("urlSettings");
        String user = properties.getStringProperty("user");
        String passwort = properties.getStringProperty("password");

        try { // load driver
            Class.forName(properties.getStringProperty("dbDriver")).newInstance();
            connection = DriverManager.getConnection(url, user, passwort);
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public synchronized static ConnectionManager getInstance() throws SQLException {
        if (connectionManager == null) {
            try {
                connectionManager = new ConnectionManager();
            } catch (Exception ex) {
                Logger.getLogger(ConnectionManager.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return connectionManager;
    }

    public Connection getConnection() {
        return connection;
    }

    public static void closeConnection() {
        //close the connection only if there is a instance
        //--> closeConnection() can always be called. 
        //(e.g. if non JDBC-Dao's are used  --> ConnectionManager is not instantiated)
        if (connectionManager != null) {
            try {
                connectionManager.connection.close();
            } catch (SQLException ex) {
                Logger.getLogger(ConnectionManager.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

}

这是我抛出异常的 JDBC 类:

@Override
public List<User> readAll() {

    List<User> userList = new LinkedList<>();

    try (Statement statement = ConnectionManager.getInstance().getConnection().createStatement()){

        ResultSet result = statement.executeQuery("select * from Users");

        while(result.next()){
            int userID = Integer.valueOf( result.getString("UserID") );
            String firmenname = result.getString("Firmenname");
            boolean firma = Boolean.getBoolean( result.getString("Firma") );
            String vorname = result.getString("Vorname");
            String nachname = result.getString("Nachname");;
            int rollenID = Integer.valueOf( result.getString("RollenID") );
            String email = result.getString("Email");;
            String passwort = result.getString("Passwort");;
            String telefonnummer = result.getString("Telefonnummer");;
            String adresse = result.getString("Adresse");;
            int plz = Integer.valueOf( result.getString("PLZ") );
            String ort = result.getString("Ort");;

            userList.add( new User(userID, firmenname, firma, vorname, nachname, new Rolle(rollenID, "???", false, false, false, false, false, false), email, passwort, telefonnummer, adresse, plz, ort) );

        }
    } catch (SQLException ex) {
        Logger.getLogger(UserJDBCDAO.class.getName()).log(Level.SEVERE, null, ex);
    }

    return userList;
}

这里是例外

java.lang.NullPointerException
at at.htlpinkafeld.langoscharly.dao.jdcb.UserJDBCDAO.readAll(UserJDBCDAO.java:68)
at at.htlpinkafeld.langoscharly.dao.factory.DAOFactory.readAllUser(DAOFactory.java:123)
at at.htlpinkafeld.langoscharly.service.LangosCharlyService.getUsers(LangosCharlyService.java:30)
at at.htlpinkafeld.langoscharly.gui.UserBean.getUsers(UserBean.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:97)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
at javax.faces.component.UIData.getValue(UIData.java:732)
at org.primefaces.component.datatable.DataTable.getValue(DataTable.java:1002)
at org.primefaces.component.api.UIData.getDataModel(UIData.java:629)
at javax.faces.component.UIData.getRowCount(UIData.java:356)
at org.primefaces.component.datatable.DataTableRenderer.encodeTbody(DataTableRenderer.java:762)
at org.primefaces.component.datatable.DataTableRenderer.encodeTbody(DataTableRenderer.java:744)
at org.primefaces.component.datatable.DataTableRenderer.encodeRegularTable(DataTableRenderer.java:258)
at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:220)
at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:84)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:456)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

  • 我很少使用普通的 JDBC,但您可能必须向 DriverManager 注册驱动程序 - 您只是在创建驱动程序的一个新实例,但根本不使用该实例(除非驱动程序有一些我不知道的自我注册代码)。我进一步假设您在发布之前没有遇到任何异常,并且您调试了代码以验证一切都按预期运行。
  • 为什么有些代码后面有两个分号?示例String nachname = result.getString("Nachname");;
  • 使用调试器,还要专门检查connection = DriverManager.getConnection(url, user, passwort);这一行,看看它是否真的得到了连接。
  • 除此之外,您没有其他例外吗?我猜你会...
  • 您捕获并记录异常,然后像什么都没发生一样继续,留下用null初始化的字段...

标签: java jdbc


【解决方案1】:

您很可能有一个SQLException,您只能登录:

try { // load driver
    Class.forName(properties.getStringProperty("dbDriver")).newInstance();
    connection = DriverManager.getConnection(url, user, passwort);
} catch (SQLException ex) {
    Logger.getLogger(ConnectionManager.class.getName()).log(Level.SEVERE, null, ex);
}

这里没有理由处理SQLException。您没有在ConnectionManager 的任何地方实现重新连接逻辑,如果您没有有效的连接,您的应用程序将无法工作。您应该重新抛出它并让您的应用程序退出:

} catch (SQLException ex) {
    Logger.getLogger(ConnectionManager.class.getName()).log(Level.SEVERE, null, ex);
    throw ex;
}

【讨论】:

  • 最好不要在这里捕获异常。让它传播给调用者。它是基于意见的,但请参阅 stackoverflow.com/a/6640029/638028 以获得合理的论点。
  • 这不是 SQL 异常,这是完全不同的事情,我的 ConnectionMangert 仅适用于本地操作,而我将其用于 Web 应用程序。
猜你喜欢
  • 2017-06-15
  • 2014-11-23
  • 1970-01-01
  • 2019-10-08
  • 2022-10-23
  • 2018-03-12
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多