NullPointerException ao manipular bytes.[resolvido]

Boa tarde,

Estou tendo problemas há uns dias que nao consigo resolver… não entendi o porque do null pointer! Pesquisei bastante mas não encontrei uma solução:

Minha situação é o seguinte:
Eu tenho um banco com um campo em rtf, preciso converter os dados para HTML. Os metodos para a conversão já funcionam não é esse o problema, testei abastecendo os metodos com um arquivo rtf salvo no disco, converti em html e salvei em disco novamente, foi ok.

Então fui tentar dar um select no banco, pegar os registros com rtf, guardar todos num array de objetos. Fecho a transação com o banco, percorro o array de objetos convertendo os rtfs em html e dando update no banco depois de convertido.

São 8176 registros, o problema não está na transação com o banco, pois ele completa o select de todos e guarda e mesmo comentando a parte do update ele não funciona, acredito que o erro está na manipulação dos bytes. Ele converte até o registro 347 e para e eu recebo o erro de NullPointerException…

java.lang.NullPointerException
at java.io.ByteArrayInputStream.(ByteArrayInputStream.java:106)
at dbclasses.converters.Rtf.convertTextRTF2HTML(Rtf.java:34) // linha referente ao Bin = new ByteArrayInputStream(text); da classe Rtf
at dbclasses.dao.daoblob.buscarTodos(daoblob.java:58) // linha referente ao Bcoment = rtf.convertTextRTF2HTML(b);
at dbclasses.DbClasses.main(DbClasses.java:29) //linha do main onde chamo o método buscarTodos() da classe daoblob.


//...todos os imports...

public class daoblob {
    
   private Connection con;  
   private Statement comando;
   private PreparedStatement cmd;
   
      public void buscarTodos() throws FileNotFoundException,IOException,NullPointerException{  
      conectar(ConFactory.Sqlite); 
      ArrayList<Question> result = new ArrayList<>();
      ResultSet rs; 
      Rtf rtf = new Rtf();
      byte[] Bcoment;
      byte[] Bpergun; 
      int i =1;
   
      try {  
         rs = comando.executeQuery("select DS_PERGUN,DS_COMENT FROM pol012");  
         while(rs.next()){
             Question temp = new Question();       //guardo cada linha retornada num array de objetos
             temp.setDs_pergun(rs.getBytes("DS_PERGUN"));    
             temp.setDs_coment(rs.getBytes("DS_COMENT"));
             result.add(temp);}
             comando.close();
                    
         for(int j = 0;j < result.size();j++){  //percorro o array de objetos para converter
                                                            //em html e guardar novamente no banco
                
           byte[] a = (result.get(j).getDs_pergun());
           byte[] b = (result.get(j).getDs_coment());   //Pega os bytes do rtf no banco e converte em String.
             System.out.println("valor de i "+i);
             System.out.println("valor de j "+j);        
            
             Bpergun = rtf.convertTextRTF2HTML(a);       
             Bcoment = rtf.convertTextRTF2HTML(b);        
                                                   
          /*String sql = "UPDATE POL012 SET DS_COMENT =? WHERE rowid =?";   Está comentado pois independente disso da o erro.
             cmd = con.prepareStatement(sql);  
             cmd.setBytes(1, Bcoment);
             cmd.setInt(2, i);
             cmd.execute();
             cmd.close();
          */   
             i++;
         }
                                
      } catch (SQLException e) {  
         imprimeErro("Erro ao buscar pessoas", e.getMessage());  
         
       } catch (NullPointerException f){
           f.printStackTrace();
           System.out.println(f+"no daoblob");
       } 
     }  

E esta é a classe que converte:

public class Rtf {
   
    public byte[] convertTextRTF2HTML(byte[] text) throws IOException{  
   
         ByteArrayInputStream Bin;     
         Bin = new ByteArrayInputStream(text);
         ByteArrayOutputStream bout = new ByteArrayOutputStream();
         
        try{
        if (text == null) {  
        return null;  
    }  
         
    RTFEditorKit rtfEditorKit = new RTFEditorKit();  
    HTMLEditorKit htmlEditorKit = new HTMLEditorKit();  
    Document doc = rtfEditorKit.createDefaultDocument();  
    
        rtfEditorKit.read(Bin, doc, 0);  
        htmlEditorKit.write(bout, doc, 0, doc.getLength());  
                
    } catch (IOException ex) {  
        //Logger.error("Erro na conversão de RTF2HTML.", ex);  
    } catch (BadLocationException ex) {  
        //logger.error("Erro na conversão de RTF2HTML.", ex);  
    }  catch (Exception e){
        e.printStackTrace();
        System.out.println(e+"no RTF");
    }
      
    byte[] b = bout.toByteArray();
     bout.close();
     Bin.close();
            return b;
             
}  

Pesquisei muito, mas não encontrei respostas… ai resolvi recorrer a vcs! … Se alguém puder dar uma luz, ficarei muito grato.

Esse byte[] deve estar null na BD para esse registo.

boa noite…

Então pmlm… obrigado pela força, mas eu não entendi oque voce quiz dizer

byte[] a = (result.get(j).getDs_pergun());  
byte[] b = (result.get(j).getDs_coment());   //Pega os bytes do rtf no banco e converte em String.  
System.out.println("valor de i "+i);  
System.out.println("valor de j "+j);    

Aqui, se fizeres também println de a e b vais ver que antes do erro um deles deverá ser null.

Obrigado pmlm, esse erro me passou desapercebido, porém preciso que o dado fosse gravado no banco como null mesmo, então fiz o seguinte :


//o metodo que recebia os bytes para converter estava assim:

public byte[] convertTextRTF2HTML(byte[] text) throws IOException{    
     
         ByteArrayInputStream Bin;       
         Bin = new ByteArrayInputStream(text);  
         ByteArrayOutputStream bout = new ByteArrayOutputStream();  
           
        try{  
        if (text == null) {    
        return null;  
 
... e por ai vai

E eu alterei para isto e deu certo! agora ele não da o erro de nullpointer! :

public byte[] convertTextRTF2HTML(byte[] text) throws IOException{  
   
        if (text == null) {  
            System.out.println(" considerado nulo");
        return null;  
    }
        
        ByteArrayInputStream Bin;     
         Bin = new ByteArrayInputStream(text);
         ByteArrayOutputStream bout = new ByteArrayOutputStream();

Obrigado!