Java 连接为空,但为什么

Java 连接为空,但为什么,java,jdbc,Java,Jdbc,在方法readAll()中,我在我的连接上得到了一个NullPointerException,但是为什么,我如何才能改变它 如果我用main类测试它,一切都很好,但是如果我在服务器(Webserver-local)上做同样的测试,它会抛出一个NullPointerException 这是我的ConnectionManager课程: public class ConnectionManager { private volatile static ConnectionManager con

在方法
readAll()
中,我在我的
连接上得到了一个
NullPointerException
,但是为什么,我如何才能改变它

如果我用main类测试它,一切都很好,但是如果我在服务器(Webserver-local)上做同样的测试,它会抛出一个
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;
}

您很可能有一个只需登录的
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;
}

我很少使用普通的JDBC,但您可能必须向DriverManager注册驱动程序-您只是创建驱动程序的一个新实例,但根本不使用该实例(除非驱动程序有一些我不知道的自注册代码)。我进一步假设您在发布之前没有收到任何异常,并且您调试了代码以验证一切是否按预期运行。为什么某些代码后面有两个分号。?示例
String-nachname=result.getString(“nachname”)使用调试器,还要特别检查此行
connection=DriverManager.getConnection(url、user、passwort)
并查看它是否真的得到了连接。除了这个例外,你没有其他例外吗?我猜你是这样做的……你捕获并记录异常,然后继续,就好像什么也没发生一样,留下初始化为
null
…在这里根本不捕获异常可能更好。让它传播到调用方。它是基于观点的,但请参阅以获得合理的参数。这不是SQL例外,这是一个完全不同的事情我的ConnectionChanger只适用于本地操作,我将其用于Web应用程序。
} catch (SQLException ex) {
    Logger.getLogger(ConnectionManager.class.getName()).log(Level.SEVERE, null, ex);
    throw ex;
}