Исключение нулевого указателя при попытке создать таблицу в базе данных sqlite с Java - PullRequest
0 голосов
/ 22 июня 2019

У меня есть простая программа на Java, которая подключается к пустой базе данных sqlite.Я пытаюсь создать таблицу, но получаю исключение нулевого указателя при попытке выполнить запрос.

  • Я убедился, что все необходимые банки есть.
  • Я использовалотладчик для поиска проблемной строки кода.Это строка 51 моего кода ниже.Другая важная строка кода - это строка 113 класса Statement, которую я могу опубликовать для справки, если необходимо.
  • Я убедился, что мое утверждение правильно инициализировано
import java.sql.*;

public class SqliteConnection
{
    public static Connection connect()
    {
        Connection conn = null;
        try
        {
            // db parameters
            String url = "jdbc:sqlite:/database.db";
            // create a connection to the database
            conn = DriverManager.getConnection(url);

            System.out.println("Connection to SQLite has been established.");

        } 
        catch (SQLException e) 
        {
            System.out.println(e.getMessage());
        } 
        finally 
        {
            try
            {
                if (conn != null) 
                {
                    conn.close();
                }
            } 
            catch (SQLException ex) 
            {
                System.out.println(ex.getMessage());
            }
        }

        return conn;
    }

    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        Connection c = connect();

        try
        {
            //create the table
            Statement stmt = null;
            stmt = c.createStatement();
            String sql = "CREATE TABLE Car (CarID INT NOT NULL, Manufacturer TEXT, Type TEXT, FuelEfficiency REAL, PRIMARY KEY(CarID));";
            stmt.execute(sql);
            stmt.close();
            c.close();
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}

Трассировка стека:

java.lang.NullPointerException
    at org.sqlite.Stmt.execute(Stmt.java:113)
    at SqliteConnection.main(SqliteConnection.java:52)

1 Ответ

1 голос
/ 22 июня 2019

Ваш метод connect создает объект подключения, который затем ... немедленно закрывается.Это не то, как вы используете try / finally.(наконец, означает: делайте это в тот момент, когда выполнение пытается выйти из связанного блока try. Это НЕ означает: если отсюда и далее происходит исключение где-либо во всей кодовой базе, делайте этот блок).

СОВЕТ: Исключениясодержит 5 полезных вещей: тип, сообщение, трассировка стека и причинная цепочка.Печать всего, что трудно сделать;так что не пытайся.Если вы не знаете, как обрабатывать исключение, либо бросьте его вперед (просто укажите throws Exception в вашем основном методе здесь), либо если вы не можете или не хотите этого, throw new RuntimeException(e); - намного лучший способпо сравнению с e.printStackTrace().

Пример лучшей реализации:

import java.sql.*;

public class SqliteConnection {
    public static Connection connect() throws SQLException
    {
        Connection conn = DriverManager.getConnection(url);
        System.out.println("Connection to SQLite has been established.");
        return conn;
    }

    public static void main(String[] args) throws SQLException
    {
        try (Connection c = connect(); Statement stmt = c.createStatement();) {
            String sql = "CREATE TABLE Car (CarID INT NOT NULL, Manufacturer TEXT, Type TEXT, FuelEfficiency REAL, PRIMARY KEY(CarID));";
            stmt.execute(sql);
        }
    }
}

Обратите внимание, как в приведенном выше примере:

  1. Использует 'ARM'Конструкция (Automatic Resource Management) для создания объектов соединений и операторов, гарантирующих, что они всегда закрываются при выходе из блока независимо от того, как он выходит.

  2. Код намного короче и легче для чтения.

  3. Исключения SQLE, которые происходят, будут печатать всю необходимую информацию сейчас, а не только биты и кусочки.Кроме того, в случае возникновения исключения путь кода, который вызвал его, будет прерван, а не продолжен в недопустимом состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...