2017-05-24 2 views
-3

je besoin de conseils sur la façon dont je peux éviter java.lang.NullPointerException lorsqu'ils traitent avec JDBC jeu de résultats que je mets sur des composants Swing tels que JTablePrévention erreur NullPointerException sur le jeu de résultats vide retourné dans JDBC

J'ai écrit une méthode qui obtient le résultat set encapsulé dans un objet à partir d'une implémentation DAO que je place dans un DefaultTableModel. Le problème est que l'objet renvoyé par le service d'implémentation dao peut avoir ou non des données/jeu de résultats si la table de base de données n'a pas encore d'enregistrement.

Il en résulte un NullPointerException

public DefaultTableModel getMiscellaneous(int gradeLevelId){ 
     DefaultTableModel defaultTableModel = new DefaultTableModel(); 
     String[] columns = {"Name","Amount"}; 
     MiscellaneousFees miscellaneousFees = schoolFeesDaoImpl.getMiscellaneous(gradeLevelId); 
     List<Fee> feeList = miscellaneousFees.getFees(); 
     for(Fee fee: feeList){ 
      Object[] rowData = {fee.getName(),fee.getAmount()}; 
      defaultTableModel.addRow(rowData); 
     } 
     defaultTableModel.setColumnIdentifiers(columns); 
     return defaultTableModel; 
    } 

public MiscellaneousFees getMiscellaneous(int gradeLevelId) { 
     MiscellaneousFees miscellaneousFees = new MiscellaneousFees(); 
     List<Fee> feeList = new ArrayList<>(); 

     String SQL = "{CALL getMiscellaneousFeesByGradeLevelId(?)}"; 
     try (Connection con = DBUtil.getConnection(DBType.MYSQL); 
       CallableStatement cs = con.prepareCall(SQL);){ 
      cs.setInt(1, gradeLevelId); 
      try(ResultSet rs = cs.executeQuery();){ 
       while(rs.next()){ 
        SchoolYear schoolYear = new SchoolYear(); 
        schoolYear.setSchoolYearId(rs.getInt("schoolyear_id")); 
        schoolYear.setYearFrom(rs.getInt("yearFrom")); 
        schoolYear.setYearTo(rs.getInt("yearTo")); 
        schoolYear.setIsActive(rs.getBoolean("isActive")); 
        schoolYear.setStart_date(rs.getDate("start_date")); 
        schoolYear.setEnd_date(rs.getDate("end_date")); 
        schoolYear.setIsCurrentSchoolYear(rs.getBoolean("isCurrentSchoolYear")); 

        GradeLevel gradeLevel = new GradeLevel(); 
        gradeLevel.setId(rs.getInt("gradelevel_id")); 
        gradeLevel.setLevel(rs.getInt("grade_level")); 
        gradeLevel.setIsActive(rs.getBoolean("isActive")); 

        FeeCategory feeCategory = new FeeCategory(); 
        feeCategory.setCategory(rs.getString("fee_category")); 
        feeCategory.setId(rs.getInt("fee_category_id")); 

        Fee fee = new Fee(); 
        fee.setId(rs.getInt("fee_id")); 
        fee.setName(rs.getString("fee_name")); 
        fee.setDescription(rs.getString("fee_description")); 
        fee.setAmount(rs.getDouble("fee_amount")); 
        fee.setFeeCategory(feeCategory); 
        fee.setGradeLevel(gradeLevel); 
        fee.setSchoolYear(schoolYear); 
        feeList.add(fee); 
       } 
       miscellaneousFees.setFees(feeList); 
      } 
     } catch (SQLException e) { 
      JOptionPane.showMessageDialog(null,e.getMessage()); 
     } 
     return miscellaneousFees; 
    } 

Toute suggestion ou des conseils de la façon dont je peux empêcher l'NullPointerException lorsque le jeu de résultats contenu dans l'objet miscellaneous est vide?

Je reçois l'erreur NullPointerException dans cette ligne de code

MiscellaneousFees miscellaneousFees = schoolFeesDaoImpl.getMiscellaneous(gradeLevelId); 

Merci.

+2

divers n'est pas nul, c'est schoolFeesDaoImpl qui est null. La question sera bientôt fermée en tant que doublon par un observateur NPE: p – Nathan

+0

Vous ne récupérerez pas null s'il n'y a pas de résultats; vous obtenez toujours au moins un Resultset vide. –

+0

J'ai oublié d'inclure privé SchoolFeesDaoImpl schoolFeesDaoImpl; dans mon code ci-dessus mais j'ai le schoolFeeDaoImpl. Je reçois l'erreur null lorsque la méthode est appelée par l'écouteur d'actions. Je vais lire le lien inclus par @SergiyMedvynskyy. Désolé pour le doublon. Merci. – p3ace

Répondre

0

schoolFeesDaoImpl est null. Vous ne l'avez pas créé.

1

Ne pas définir des listes, c'est une mauvaise pratique et entraîne ce genre de problèmes. Dans votre MiscellaneousFees vous pouvez avoir une liste initialisée comme ArrayList vide et au lieu de faire miscellaneousFees.setFees (feeList) avec une liste nouvellement créée, pour chaque élément que vous appelez miscellaneousFees.addFee (fee) (qui ajoutera l'élément à la liste interne). De cette façon, si vous n'avez aucun frais, la liste sera vide et non nulle, ce qui est plus logique. Éviter aussi d'exposer l'état interne (la liste) de votre objet empêche les gens de faire du code méchant qui change le comportement de votre objet d'une manière que vous n'aviez pas prévue.