2

私はJavaでJDBCを使用してデータベースでクエリを実行しています。何らかの理由で、このコード:

public static void checkAllFlights() {
    String SQLStatement = "SELECT Flight.FlightID,"
                            +"(CASE WHEN (SUM(NumSeats) > 0) THEN SUM(NumSeats) ELSE 0 END)"
                            +"AS Booked_Seats,"
                            +"(CASE WHEN (MaxCapacity-SUM(NumSeats) > 0) THEN MaxCapacity-SUM(NumSeats) ELSE MaxCapacity END) AS Available_Seats,"
                            +"MaxCapacity"
                            +"FROM Flight LEFT JOIN FlightBooking ON Flight.FlightID = FlightBooking.FlightID"
                            +"GROUP BY Flight.FlightID, Flight.MaxCapacity"
                            +"ORDER BY Flight.FlightID";

    try {
        dbAccess.getConnection();
        ResultSet resultSet = dbAccess.runSimpleQuery(SQLStatement);
        System.out.println("FlightID "+"Booked_Seats "+"Available_Seats "+"Max_Capacity");      
        while (resultSet.next()) {
            int ID = resultSet.getInt(1);
            System.out.println(ID);
        }
        DBAccess.disconnect();
    } catch (Exception e) {
        e.printStackTrace(System.err);
    } 
}

私にエラーを投げています:

java.lang.NullPointerException
        at databases2.Databases2.checkAllFlights(Databases2.java:245)
        at databases2.Databases2.main(Databases2.java:26)

(245行目はwhile(resultSet.next())を参照)

resultSet.next() および resultSet.close() 単独でも同じエラーが発生します。

結果セットを循環するために本質的に同じコードをさらに使用しましたが、正常に機能し、SQLを直接実行しましたが、正しい結果が返されるため、resultSet.next()がスローされる理由について混乱していますヌルポインタ例外?

runSimpleQuery メソッド:

public ResultSet runSimpleQuery(String sql)
        throws Exception {

    try {
        // Create a statement variable to be used for the sql query
        statement = connection.createStatement();

        // Perform the update
        return statement.executeQuery(sql);
    } catch (SQLException e) {
        // Problem encountered
        statement = null;
        return null;
    }

更新:それをステップ実行した後、runSimpleQueryがnullを返しているように見えますが、これはSQL例外がスローされない限り実行すべきではありません....

更新:解決しました。クエリは正しかったのですが、文字列の連結を台無しにして、必要な場所にスペースが含まれないようにし、実際の変数をプルするのではなく、コードからコピーして貼り付けることでクエリをテストしたため、テスト時に機能しました。デバッガの外....

4

3 に答える 3

3

私は同じ問題に遭遇し、他のスレッドが同じ接続を使用している場合、他のSQLが実行された後にResultSetがNullPointerExceptionをスローすることを発見しました。

sys.scheduler 06:28:00,017 [SchedulerReloader] ERROR - java.lang.NullPointerException
sys.scheduler 06:28:00,018 [SchedulerReloader] ERROR - com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7009)

私のプロセスは 20 万行の長時間実行されるプロセスです...これには特定の接続を使用し、プロセスが完了したら破棄します。

于 2013-09-19T10:40:22.377 に答える
1

runSimpleQuery メソッドをデバッグすると、null が返されます。これが、resultset.getNext() が NullPointerException をスローする理由です。

于 2013-03-30T19:13:11.097 に答える