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.