Исключение Nullpointer (Дерби, JDBC) - PullRequest
0 голосов
/ 14 марта 2011

Hy !!

Мой код ошибки:

Exception in thread "main" java.lang.NullPointerException
        at lesebank.Konto.getKontofromID(Konto.java:39)
        at lesebank.Main.main(Main.java:18)
SQL EXCEPTIONJava Result: 1
BUILD SUCCESSFUL (total time: 1 second)

Метод:

Konto konto = new Konto ();
        Statement s = dbconn.getSt();
        try
        { //in the next line the error occurs
           s.execute("select id,inhaberin,ktostd,habenzinsen,notiz from Konto where id = " +id);
           ResultSet set = s.getResultSet();
           if (set.next())
           {
               konto.setId(set.getInt(1));
               konto.setId_inhaberin(set.getInt(2));
               konto.setKtostd(set.getDouble(3));
               konto.setHabenzinsen(set.getDouble(4));
               konto.setNotiz(set.getString(5));
               return konto;
           }
        }
        catch (SQLException ex)
        {
            System.out.print(ex.getMessage());
        }


        return null;

DBConn:

public class DBConnection {

   private String url = "jdbc:derby://localhost:1527/Bank";
   private Connection conn;
   private Statement st;

    public DBConnection() {
        try
        {
            conn = DriverManager.getConnection(this.url, "test", "test");
            st = conn.createStatement();

        }
        catch (SQLException ex)
        {
           System.out.print("SQL EXCEPTION");
        }
    }

    public Statement getSt() {
        return st;
    }

База данных: Database

Пожалуйста, помогите

Ответы [ 3 ]

2 голосов
/ 14 марта 2011

Это очень плохо (тм):

public DBConnection() {
    try
    {
        conn = DriverManager.getConnection(this.url, "test", "test");
        st = conn.createStatement();

    }
    catch (SQLException ex)
    {
       System.out.print("SQL EXCEPTION");
    }
}

Не не ловить и игнорировать подобные исключения.Есть очень веская причина.В этом случае, если ваш конструктор потерпит неудачу из-за исключения, весь объект DbConnection будет считаться бесполезным, так как поле st будет нулевым.Тем не менее, поскольку код, который создает экземпляр DbConnection, не знает, что это произошло, вы продолжаете его использовать и в итоге получаете исключение нулевого указателя.

Если конструктор DbConnection вызывает исключение,вам нужно выбросить это исключение из конструктора, чтобы ваш код обработал исключение:

public class DBConnection {

   private static final String URL = "jdbc:derby://localhost:1527/Bank";
   private final  Connection conn;
   private final Statement st;

    public DBConnection() throws SQLException {
        conn = DriverManager.getConnection(URL, "test", "test");
        st = conn.createStatement();
    }

    public Statement getSt() {
        return st;
    }
}

Обратите также внимание на поля final.Это дает вам гарантию времени компиляции, что что-то будет присвоено этим полям.

0 голосов
/ 14 марта 2011

Сейчас не совсем в состоянии протестировать, но я бы посоветовал вам сделать так, чтобы ваш метод DBConnection.getSt() возвращал совершенно новый объект Statement, вместо того, чтобы многократно использовать один и тот же объект.Будет что-то вроде:

public Statement getSt() {
    return conn.createStatement();
}

Не забудьте закрыть свое заявление после его использования.

0 голосов
/ 14 марта 2011

Убедитесь, что dbconn.getSt() не возвращается null. Что такое getSt(), в любом случае;что-нибудь вроде createStatement()? Теперь, когда я вижу ваше редактирование, вполне вероятно, что ваш класс DBConn не удастся в своем вызове createStatement().

...