如果只有一个列为null,如何从结果集中获取数据

时间:2016-10-12 15:28:34

标签: java nullpointerexception resultset

我试图在某些txts中设置信息。当所有列都已满时,我的代码很好,但是当列为null时,会出现抛出异常,代码不会在try catch中运行。

我知道问题是空列,因为列PhotoQ是用户的可选数据信息。所以一个解决方案,可能是在所有用户帐户中加载defaultPhoto,但会将存储花在数据库中。

请原谅我的英语我是新的XD。

示例代码:

try {
    PreparedStatement pstm = conn.prepareStatement(query);
    pstm.setInt(1, userid);
    pstm.setInt(2, quizzid);
    pstm.setInt(3, NumQuest);
    ResultSet rs =pstm.executeQuery();

    while (rs.next()) {
        fileBytes = rs.getBytes("PhotoQ");
        ImageIcon image = new ImageIcon(fileBytes);
        Image im = image.getImage();
        Image myImg = im.getScaledInstance(lblImage.getWidth(), lblImage.getHeight(), Image.SCALE_SMOOTH);
        ImageIcon newImage = new ImageIcon(myImg);

        if (rs.getString("Optionsid").endsWith("1")) {
            txtaA.setText(rs.getString("Options"));
            txtaQuestion.setText(rs.getString("Question"));
            if (rs.getInt("Valid")==1) {
                ckbA.setSelected(true);
            }
            else {
                ckbA.setSelected(false);
            }
        }
    }
}

4 个答案:

答案 0 :(得分:0)

您的问题和错误似乎以null和/或PhotoQ列的Optionsid值为中心。您应该对每列使用空值的显式检查。仅当列不是null时,才应尝试使用该值。

这些内容可以让您了解如何处理这个问题:

while (rs.next()) {
    fileBytes = rs.getBytes("PhotoQ");
    if (fileBytes != null) {            
        ImageIcon image = new ImageIcon(fileBytes);
        Image im = image.getImage();
        Image myImg = im.getScaledInstance(lblImage.getWidth(), lblImage.getHeight(), Image.SCALE_SMOOTH);
        ImageIcon newImage = new ImageIcon(myImg);
    }

    String optionsId = rs.getString("Optionsid");
    if (optionsId != null && optionsId.endsWith("1")) {
        txtaA.setText(rs.getString("Options"));
        txtaQuestion.setText(rs.getString("Question"));
        Integer valid = rs.getInt("Valid");
        if (valid != null && valid.intValue() == 1) {
            ckbA.setSelected(true);
        } else {
            ckbA.setSelected(false);
        }        
    }
}

答案 1 :(得分:0)

要在我的应用中解决此问题。 我使用了一个wasnull()但是这个尝试只是为了询问一个记录是否带有一个空字段,我不知道在一个尝试中尝试是否正确但是知道是有效的!

代码:

try {
        PreparedStatement pstm = conn.prepareStatement(query1);
        pstm.setInt(1, userid);
        pstm.setInt(2, quizzid);
        pstm.setInt(3, NumQuest);
        ResultSet rs =pstm.executeQuery();
        try {
            //move result set at first row
            rs.next();
             fileBytes = rs.getBytes("PhotoQ");
            //ask if result set contain null field
            if (rs.wasNull()) {
            // this variable is defined like globlal    
            nuller=1;
            }else {
                nuller=0;
            }
        } catch (Exception f) {

        }
         //reload resulset for begin again
        rs =pstm.executeQuery();

        while (rs.next()) {
              //here is thi – Tim Biegeleisen idea
            if (nuller==0) {
                fileBytes = rs.getBytes("PhotoQ");
                ImageIcon image = new ImageIcon(fileBytes);
                Image im = image.getImage();
                Image myImg = im.getScaledInstance(lblImage.getWidth(), lblImage.getHeight(), Image.SCALE_SMOOTH);
                ImageIcon newImage = new ImageIcon(myImg);
                lblImage.setIcon(newImage);
            }

//此代码仅适用于具有一行结果的查询。我用,因为我的 //老师的例子就是和。当我完成后,系统将更改代码

答案 2 :(得分:0)

@StevenCanales,

您在正确的轨道上可以使用wasNull()来检查从结果集中提取的最后一列的值。但是,您不需要额外的try / catch。你可以在while块中简化所有这些。

    try {
        PreparedStatement pstm = conn.prepareStatement(query1);
        pstm.setInt(1, userid);
        pstm.setInt(2, quizzid);
        pstm.setInt(3, NumQuest);
        ResultSet rs = pstm.executeQuery();

        while (rs.next()) {
            fileBytes = rs.getBytes("PhotoQ");
            // ask if result set contain null field
            if (rs.wasNull()) {
                // handle as you wish... throw an exception ?
            } else {
                ImageIcon image = new ImageIcon(fileBytes);
                Image im = image.getImage();
                Image myImg = im.getScaledInstance(lblImage.getWidth(), lblImage.getHeight(), Image.SCALE_SMOOTH);
                ImageIcon newImage = new ImageIcon(myImg);

                if (rs.getString("Optionsid").endsWith("1")) {
                    txtaA.setText(rs.getString("Options"));
                    txtaQuestion.setText(rs.getString("Question"));
                    if (rs.getInt("Valid") == 1) {
                        ckbA.setSelected(true);
                    } else {
                        ckbA.setSelected(false);
                    }
                }
            }

        }
    } catch (Exception e) {
       //handle exception
    }

while循环将处理适当的结果集。移动到第一条记录或后退或前进时,您无需做任何特别的事情。

答案 3 :(得分:-1)

你必须在fileBytes上检查null。

fileBytes = rs.getBytes("PhotoQ");  
if (fileBytes != null) {                
    ImageIcon image = new ImageIcon(fileBytes);
    Image im = image.getImage();
    Image myImg = im.getScaledInstance(lblImage.getWidth(), lblImage.getHeight(), Image.SCALE_SMOOTH);
    ImageIcon newImage = new ImageIcon(myImg);
}

那么你必须用你的newImage对象做任何你想做的事。