2014-10-30 2 views
-1

error: java.lang.NullPointerException, В чем причина?Как выполнить инструкцию SQL?

Мое имя класса; DP.java

public static TPreparedStatement Fill(SessionStruct ss, 
     String seq) throws SQLException { 
    TPreparedStatement tp = null; 

    try { 

     String sql = "Select name,surname from NAMES where seq=? "; 

     tp = new TPreparedStatement(ss, sql); 
     tp.setString(1, seq); 
     tp.executeQuery(); 
     tp.close(); 
    } catch (SQLException ex) { 
     tp.close(); 
     ss.rollbackNoException(); 
     ex.printStackTrace(); 
     throw ex; 
    } 
    return tp; 

} 

Другой класс; DLP.java

public void Load() throws HException { 
    TPreparedStatement tp = null; 
    try { 
     tp = DP.Fill(rc.ss, rc.getRequest() 
       .getParameter("PK")); 

     txtName.setValue(tp.getString("NAME"));  
     txtSurname.setValue(tp.getString("SURNAME")); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
     rc.ss.rollbackNoException(); 
    } 
} 

При запуске в режиме отладки он пропускается;

txtName.setValue(tp.getString("NAME"));  
txtSurname.setValue(tp.getString("SURNAME")); 
+3

Это не программа pl-sql. – NewUser

+1

Я думаю, что исключение nullpointer произошло с номером строки, на котором оно произошло? Знание того, в какой строке произошел NPE, поможет нам помочь вам. – fvu

+0

Это TPreparedStatement WSO2? Если это так, вы не используете его правильно - executeQuery возвращает ResultSet. Время, чтобы выкопать документацию, я думаю ... – fvu

ответ

1

Просто дикая догадка, поскольку мы, очевидно, не располагаем некоторыми сведениями здесь. Во всяком случае:

Вы добросовестно закрыли свой TPreparedStatment перед возвратом с Fill. Затем, в вызывающем, вы вызываете методы на этом закрытом заявлении:

public static TPreparedStatement Fill(SessionStruct ss, 
     String seq) throws SQLException { 
    TPreparedStatement tp = null; 

    try { 
     ... 
     tp.close(); // <-------------- 
    } catch (SQLException ex) { 
     tp.close(); // <-------------- 
     ... 
    } 
    return tp; 
} 
tp = DP.Fill(rc.ss, rc.getRequest() 
      .getParameter("PK")); 

    txtName.setValue(tp.getString("NAME")); 
    //    ^^ 
    //   closed ! 

Я не могу гарантировать это вызвать ваш NullPointerException. Но обычно не рекомендуется вызывать любой метод на закрытом объекте, так как согласно usual semantic, вызов close на объект должен отбрасывать любые основные ресурсы.

0

Я бы использовал блок finally для закрытия вашего ресурса tp. Также может быть полезно увидеть полный стек, чтобы исследовать нулевой указатель.

try { 
    String sql = "Select name,surname from NAMES where seq=? "; 

    tp = new TPreparedStatement(ss, sql); 
    tp.setString(1, seq); 
    tp.executeQuery(); 
} catch (SQLException ex) { 
    ss.rollbackNoException(); 
    ex.printStackTrace(); 
    throw ex; 
} finally { 
    tp.close(); 
} 
0

Спасибо всем ..

Правильные Я забыл о -> tp.close(); утверждение такое;

try { ... tp.close(); // < -------------- } catch (SQLException ex) { tp.close(); // < -------------- ... } return tp;

Смежные вопросы