2013-09-21 6 views
0

У меня возникли проблемы при запуске кода ниже. Этот код используется, когда нажата кнопка на экране gui. В основном функция этой кнопки состоит в том, чтобы прочитать текст, введенный в 2 текстовых поля, получить третье значение из 2 и сохранить все 3 строки в таблице на экране графического интерфейса пользователя, используя 2-мерный массив.2D-объект, дающий nullpointerexception?

Однако, я получаю исключение NullPointerException при выполнении его в 5-й строке внутри метода addItem(). saleData - это 2D-массив с данными, которые находятся в таблице. Я создал экземпляр temp [] [] объекта с 1 строкой больше, чем объект saleData, потому что мне нужно добавить строку в таблицу, а затем я сделаю saleData = temp. Этот код работал так, как он есть в классе Gui, прежде чем я попытался использовать ООП для создания отдельного класса для работы графического интерфейса. Исключение nullpointer относится к временному объекту, я знаю это, потому что я распечатал значение temp, и это было null.

У кого-нибудь есть идеи? благодарит заранее.

public void addItem() { 
    int len = saleData.length + 1; 
    Object[][] temp = new Object[len][3]; 
    for (int k = 0; k < saleData.length; k++) { 
     for (int i = 0; i < 3; i++) { 
      temp[k][i] = ((DefaultTableModel) table.getModel()).getValueAt(k, i); 
     } 
    } 
    tblContainer.removeComponent(table); 
    try { 
     int qty = Integer.parseInt(txtQty.getText()); 
     String item = (String) items.getSelectedItem(); 
     String sql = "Select Sell_price from stockInfo where parts like '" + item + "'"; 
     double total = 0; 
     if (saleData.length != 1) { 
      for (int i = 0; i < saleData.length; i++) { 
       String sql2 = "Select sell_price from stockinfo where parts like '" + temp[i][1].toString() + "'"; 
       try { 
        System.out.println("Check 0"); 
        pst = conn.prepareStatement(sql2); 
        System.out.println("Check 1"); 
        rs = pst.executeQuery(); 
        System.out.println("Check 2"); 
        while (rs.next()) { 
         System.out.println("Check 3"); 
         String qt = temp[i][0].toString(); 
         temp[i][2] = Double.parseDouble(rs.getString("sell_price")) * Integer.parseInt(qt); 
         System.out.println("Check 4"); 
        } 
       } catch (Exception e) { 
        Dialog.show("Error", "Error 1: " + e, "OK", null); 
       } 
      } 
     } 
     try { 
      pst = conn.prepareStatement(sql); 
      rs = pst.executeQuery(); 
      while (rs.next()) { 
       double price = Double.parseDouble(rs.getString("Sell_Price")); 
       total = qty * price; 
       try { 
        for (int m = 0; m < saleData.length; m++) { 
         for (int n = 0; n < 3; n++) { 
          ((DefaultTableModel) table.getModel()).setValueAt(m, n, temp[m][n]); 
         } 
        } 
        temp[saleData.length][0] = qty; 
        temp[saleData.length][1] = item; 
        temp[saleData.length][2] = total; 
        saleData = temp; 
        table = new Table(new DefaultTableModel(saleColumns, saleData, true)); 
        tblContainer.addComponent(table); 
        ((TableLayout) table.getLayout()).setGrowHorizontally(true); 
        saleForm.revalidate(); 

       } catch (NullPointerException e) { 
       } 
      } 
     } catch (SQLException e) { 
      Dialog.show("Error", "SQL Error Record Sale", "OK", null); 
     } 
    } catch (NumberFormatException nfe) { 
     Dialog.show("Error", "Please enter a valid quantity", "OK", null); 
    } 
} 

ответ

1

Временной массив не может быть пустым. Вы только что создали его.

temp[k][i]может быть нулевым (и должно быть, кстати), но это не имеет значения - ему присваивается значение.

Если размер temp не будет достаточно большим, вы получаете ArrayIndexOutOfBoundsException

Так что это оставляет две вещи, которые могут получить, чтобы быть пустым (если ошибка происходит от этой линии, а не, например, с внутренней стороны getValueAt(k,i)):

  • table
  • table.getModel()

Используйте отладчик, и это облегчит вашу жизнь ...

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