JDBC

2017-05-24 4 views
-3

で返さ空の結果セットにNullPointerExceptionエラーの防止、私は結果を取得する方法を書かれている私は、このようなJTableJDBC

としてSwingコンポーネントに置くJDBC結果セットを扱うとき、私はjava.lang.NullPointerExceptionを避けることができる方法についてのアドバイスが必要私はDefaultTableModelの中に移入するDAO実装のオブジェクトにカプセル化されています。

問題は、データベーステーブルにまだレコードがない場合、DAO実装サービスによって返されるオブジェクトにはデータ/結果セットがある場合とない場合があります。

これは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; 
    } 

miscellaneousオブジェクトに含まれる結果セットが空の場合、私はNullPointerExceptionを防ぐことができる方法の任意の提案やアドバイスを結果?

私はコード

MiscellaneousFees miscellaneousFees = schoolFeesDaoImpl.getMiscellaneous(gradeLevelId); 

のこの行のNullPointerExceptionエラーはありがとうござい得ます。

+2

その他はnullではありません。それはnullですが、それはschoolFeesDaoImplです。質問はすぐにNPEウォッチャーによって複写としてクローズされます:p – Nathan

+0

結果がない場合、あなたはnullを返さないでしょう。あなたは常に少なくとも空のResultsetを取得します。 –

+0

私は個人的に静的なSchoolFeesDaoImpl schoolFeesDaoImplを含めるのを忘れました。上記の私のコードでは、私はschoolFeeDaoImplを持っています。メソッドがアクションリスナーによって呼び出されたときにnullエラーが発生します。 @SergiyMedvynskyyのリンクを読んでみましょう。重複して申し訳ありません。ありがとう。 – p3ace

答えて

0

schoolFeesDaoImplがnullです。あなたはそれを作成していません。

1

リストを設定しないでください。悪い習慣であり、そのような問題が発生します。あなたのMiscellaneousFeesでは、リストを空のArrayListとして初期化し、miscellaneousFees.addFee(fee)(これは要素を内部リストに追加するすべての要素に対して、新しく作成されたリストでmiscellaneousFees.setFees(feeList)を実行する代わりに、 )。

このようにすれば、料金がかからない場合、リストは空でなくヌルでなくなります。これは意味があります。また、オブジェクトの内部状態(リスト)を公開することを避けることで、予期しない方法でオブジェクトの動作を変更する不快なコードを人々が実行することを防ぐことができます。