java.lang.NullPointerException - ResultSet - PullRequest
       26

java.lang.NullPointerException - ResultSet

0 голосов
/ 11 ноября 2011

Я получаю следующую ошибку:

java.lang.NullPointerException
    at oracle.jdbc.driver.ScrollableResultSet.cacheRowAt(ScrollableResultSet.java:2086)
    at oracle.jdbc.driver.ScrollableResultSet.isValidRow(ScrollableResultSet.java:2060)
    at oracle.jdbc.driver.ScrollableResultSet.next(ScrollableResultSet.java:347)
    at website.web.InboxReader.getkeywordImportance(InboxReader.java:832)
    at website.web.InboxReader.main(InboxReader.java:54)

В таблице Mail есть 53 строк, а в таблице keyword - 1 строк.При отладке, как только строка выполняется kstmt.executeUpdate("UPDATE KEYWORD SET IMPORTANCE = IMPORTANCE + 1.0 WHERE SKEYWORD = '" + s2 + "'");, она снова возвращается к keyword set.next() и выдает исключение.

Вот код:

Connection connection = connectToDatabase();
        Statement mstmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        String s1,s2;
        ResultSet mailset = mstmt.executeQuery("SELECT * from MAIL");
        System.out.println("hello in getImportance beg"); 
        //mailset.beforeFirst();
        while(mailset.next())
        {               
            System.out.println("hello in first while"); 
            Statement kstmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
            ResultSet keywordset = kstmt.executeQuery("SELECT * FROM KEYWORD");
            while(keywordset.next())
            {
                s1=mailset.getString("SUBJECT");
                System.out.println("Subject: "+s1);
                s2=keywordset.getString("SKEYWORD");
                System.out.println("Keyword: "+s2);
                if(s1.contains(s2))
                {
                    System.out.println("hello in if");  
                    kstmt.executeUpdate("UPDATE KEYWORD SET IMPORTANCE = IMPORTANCE + 1.0 WHERE SKEYWORD = '" + s2 + "'");  

                }
            }
            keywordset.close();
        }
        mailset.close();
        connection.close();

Спасибо!

Ответы [ 4 ]

3 голосов
/ 11 ноября 2011

, если вы посмотрите на эту строку, которая кажется проблематичной:

kstmt.executeUpdate("UPDATE KEYWORD SET IMPORTANCE ='" + (keywordset.getFloat("IMPORTANCE") + 1.0) + "'");

Вы должны дважды проверить вызов

keywordset.getFloat("IMPORTANCE")

Это наиболее вероятно из-за того, что значение столбца пусто для записи или что столбец может не существовать. Просто для отладки попробуйте с

keywordset.getFloat(0);

или какой идентификатор столбца, о котором вы знаете, существует, чтобы проверить, работает ли вызов.

Вы пытались удалить оператор COMMIT? Потому что обычно, если вы не укажете иначе, данные автоматически фиксируются, поэтому нет необходимости вызывать коммит после вашего оператора, и если вы указали auto_commit для false, то для фиксации вы должны выполнить con.commit(), а не вызывать его через оператор обновления

2 голосов
/ 11 ноября 2011

Пожалуйста, смотрите документацию здесь http://download.oracle.com/javase/tutorial/jdbc/basics/retrieving.html

Нет необходимости звонить до того, как вы начнете себя вести.

public static void viewTable(Connection con) throws SQLException {
    Statement stmt = null;
    String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from " + dbName + ".COFFEES";
    try {
      stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery(query);
      while (rs.next()) {
        String coffeeName = rs.getString("COF_NAME");
        int supplierID = rs.getInt("SUP_ID");
        float price = rs.getFloat("PRICE");
        int sales = rs.getInt("SALES");
        int total = rs.getInt("TOTAL");
        System.out.println(coffeeName + "\t" + supplierID + "\t" + price + "\t" + sales + "\t" + total);
      }
    } catch (SQLException e ) {
      JDBCTutorialUtilities.printSQLException(e);
    } finally {
      if (stmt != null) { stmt.close(); }
    }
  }
1 голос
/ 11 ноября 2011

Вы пытались запустить его без ключевого слова set.beforeFirst () и mailset.beforeFirst ()?Это не обязательно, и это может создать проблему в ResultSet.

0 голосов
/ 03 апреля 2012
kstmt.executeUpdate("UPDATE KEYWORD SET IMPORTANCE = IMPORTANCE + 1.0 WHERE SKEYWORD = '" + s2 + "'");  

Когда эта строка выполняется в вашем коде, ваш набор ключевых слов ResultSet изменится, потому что все методы выполнения будут влиять на ResultSet.Все методы выполнения в интерфейсе Statement неявно закрывают текущий объект ResultSet статута, если существует открытый.Вам нужно создать отдельный объект оператора для выполнения этого запроса, чтобы набор ключевых слов ResultSet не был затронут ... ...:)

...