Java 防止JDBC中返回的空结果集出现NullPointerException错误

Java 防止JDBC中返回的空结果集出现NullPointerException错误,java,swing,nullpointerexception,jtable,defaulttablemodel,Java,Swing,Nullpointerexception,Jtable,Defaulttablemodel,我需要关于如何在处理JDBC结果集时避免java.lang.NullPointerException的建议,我将该结果集放在Swing组件(如JTable)上 我编写了一个方法,该方法从我在DefaultTableModel中填充的DAO实现中获取封装在对象中的结果集 问题是,如果数据库表还没有记录,dao实现服务返回的对象可能有数据/结果集,也可能没有 这将导致NullPointerException 多谢各位 schoolFeesDaoImpl为空。您还没有创建它。不要设置列表,这是一种不好

我需要关于如何在处理JDBC结果集时避免java.lang.NullPointerException的建议,我将该结果集放在Swing组件(如JTable)上

我编写了一个方法,该方法从我在DefaultTableModel中填充的DAO实现中获取封装在对象中的结果集

问题是,如果数据库表还没有记录,dao实现服务返回的对象可能有数据/结果集,也可能没有

这将导致NullPointerException


多谢各位

schoolFeesDaoImpl为空。您还没有创建它。

不要设置列表,这是一种不好的做法,会导致此类问题。在MiscellaneousFees中,您可以将列表初始化为空ArrayList,而不是使用新创建的列表来执行MiscellaneousFees.setFeesfeeList,对于调用MiscellaneousFees.addFeefee的每个元素,该元素将添加到内部列表中


这样,如果您没有任何费用,列表将为空且不为空,这更有意义。同时避免暴露对象的内部状态。对象列表可防止人们编写令人讨厌的代码,以您意想不到的方式更改对象的行为。

miscellaneous不是null,是schoolFeesDaoImpl为null。这个问题很快就会被NPE观察者以重复的形式解决:如果没有结果,pYou不会返回空值;你总是得到至少一个空的结果集;在我上面的代码中,但我有schoolfeedaimpl。当action listener调用该方法时,我得到空错误。我将阅读@SergiyMedvynskyy提供的链接。对不起,重复了。谢谢
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;
    }
MiscellaneousFees miscellaneousFees =  schoolFeesDaoImpl.getMiscellaneous(gradeLevelId);