Как исправить это исключение NullPointerException при выполнении запроса?

У меня есть исключение NullPointerException при выполнении запроса моего простого оператора sql; Я думаю, что проблема связана с подключением к sqlite, но я не могу понять это...

Мой метод Java:

    public Connection connect() throws SQLException {
    Connection conn = null;
    try {
        try {
            Class.forName("org.sqlite.JDBC");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        String url = "jdbc:sqlite:sakila.db.sqlite3";
        conn = DriverManager.getConnection(url);
        System.out.println("Connection to SQLite has been established.");
    } catch (SQLException e) {  
        System.out.println(e.getMessage());  
    }

    Statement stmt = conn.createStatement();        
    String sql = "SELECT * FROM FILM LIMIT 10";
    stmt.executeQuery(sql);
    return conn;
}

А это результат из консоли

Connection to SQLite has been established.
Exception in thread "main" java.lang.NullPointerException
at org.sqlite.Stmt.executeQuery(Stmt.java:121)
at Connect.connect(Connect.java:33)
at Main.main(Main.java:10)

заранее спасибо

Хм... Пробовали отлаживать? В большинстве случаев ошибки такого типа люди находят при отладке. Кстати, похоже, что вы не обрабатываете исключение NullPointerException в своем блоке catch. Добавьте для него блок catch там, где это необходимо.

Sometowngeek 27.05.2019 18:05

@Sometowngeek Как правило, вы не должны ловить NullPointerException, так как обычно это указывает на ошибки в вашем коде.

Mark Rotteveel 28.05.2019 14:04

@MarkRotteveel Я думал, что Исключение д — это то, чего вам следует избегать.

Sometowngeek 02.06.2019 15:54

@Sometowngeek Исключения NullPointerException обычно являются признаком ошибок, которые необходимо исправить, их обнаружение означает игнорирование этих проблем, и их следует избегать. Не перехватывайте исключение NullPointerException, а исправьте основную причину.

Mark Rotteveel 02.06.2019 16:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
4
550
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

похоже, вы закрываете соединение прямо перед его использованием. Попробуйте переместить оператор + executeQuery внутри try-catch

Кажется, это ошибка в реализации оператора sqlite. Такая ситуация должна вызывать SQLException сообщение «соединение закрыто» (или statement is closed или подобное).

Mark Rotteveel 28.05.2019 14:06

Ваш блок finally закрывает соединение, поэтому, когда оператор

Statement stmt = conn.createStatement(); 

будет достигнуто, будет выдано исключение NullPointerException. Чтобы решить эту проблему, ваш код должен выглядеть так:

public Connection connect() throws SQLException {

        Connection conn = null;
        try {
            try {
                Class.forName("org.sqlite.JDBC");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            String url = "jdbc:sqlite:sakila.db.sqlite3";
            conn = DriverManager.getConnection(url);
            System.out.println("Connection to SQLite has been established.");
            Statement stmt = conn.createStatement();        
            String sql = "SELECT * FROM FILM LIMIT 10";
            stmt.executeQuery(sql);
            return conn;
        } catch (SQLException e) {  
            System.out.println(e.getMessage());  
        } finally {  
            try {  
                if (conn != null) {  
                    conn.close();  
                }  
            } catch (SQLException ex) {  
                System.out.println(ex.getMessage());  
            }  
        }
    }

Другие вопросы по теме