2016-10-12 18 views
1

いくつかのtxtsで情報を設定しようとしています。私のコードは、すべての列がいっぱいだが、列がnullのときは例外がスローされ、コードはtry catch内で実行されません。列の1つだけがNULLの場合、結果セットからデータを取得する方法

PhotoQという列は、ユーザーのオプションのデータ情報であるため、問題がNULL列であることがわかりました。したがって、解決策は、おそらくすべてのユーザーアカウントで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); 
      } 
     } 
    } 
} 
+0

なぜあなたのコードはtry/catch内で実行されませんか? –

答えて

0

あなたの質問とエラーがPhotoQためnull値および/またはOptionsid列を中心としているようです。それぞれの列に対してNULLを明示的にチェックする必要があります。列が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); 
     }   
    } 
} 
+0

は、より良いオプションであるnullpointer例外に対してtry/catchを使用しませんか? –

+0

@AmerQarabsa私はこれがどんな点でも良いとは思わない。 _one_ blanket例外を使用して_any_ columnがNULLであることを処理することを提案しています。私の方法では、開発者は各列のロジックを個別に処理できます。 –

+0

例外処理はヌル値をチェックするよりも遅いですが、ヌルをチェックするよりも読みやすくなります。ビルダーパターンを使って巨大なオブジェクトを構築していると想像してください。 1つの値がnullの場合はチェックが良いでしょうが、一般的にはNULLをチェックするのはとても醜いと思います –

-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オブジェクトで何でもしてください。

+0

は、より良いオプションであるnullpointer例外に対してtry/catchを使用しませんか? –

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); 
      } 

//このコードは一列のみの結果にクエリのために働きます。私は //先生の例があるので使っています。 WHE私は、システムがあなたが結果セットから引き出された最後の列の値をチェックするためてwasNull()を使用することができます正しい軌道に乗っていたコード

0

@StevenCanales、

を変更します終了します。ただし、追加の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 
    } 

結果ループを適切に処理するためのループが処理されます。あなたが最初のレコードに移動するために必要な特別なことはありません。

関連する問題