Saudações a todos,
Estou tentando fazer um programa que leia XML utilizando o ParserSax, porém ao final da compilação ele gera um erro:
Exception in thread “main” java.lang.NullPointerException
at parsers.ContablilidadeParserSax.parseXml(ContablilidadeParserSax.java:44)
at main.Main.main(Main.java:15)
Pelo que eu entendi o erro acusa um valor nulo sendo que o mesmo não está.
Segue o código:
[code]public class ContablilidadeParserSax extends DefaultHandler implements ContabilidadeParser
{
Double saldoFinal = 0.0;
@Override
public double parseXml(File arquivoXml)
{
try
{
FileReader arquivoXmlLeitor = new FileReader(arquivoXml);
InputSource arquivoEntrada = new InputSource(arquivoXmlLeitor);
XMLReader xr = XMLReaderFactory.createXMLReader();
xr.setContentHandler(this);
xr.setErrorHandler(this);
xr.parse(arquivoEntrada);
}
catch(IOException e)
{
System.out.println("Erro no acesso ao arquivo: "+arquivoXml);
e.printStackTrace();
}
catch(SAXException e)
{
System.out.println("Erro no parsing do arquivo: "+arquivoXml);
e.printStackTrace();
}
return saldoFinal;
}
public void startDocument ()
{
System.out.println("Start document");
saldoFinal = null;
}
public void endDocument ()
{
System.out.println("End document");
}
public void startElement (String uri, String name, String qName, Attributes atts)
{
System.out.println("Start element: " + qName);
}
public void endElement (String uri, String name, String qName)
{
System.out.println("End element: " + qName);
}
public void characters (char[] chars, int start, int length)
{
}
}
[/code]
O erro aponta para o return SaldoFinal; mas se ver acima o mesmo está declarado como Double saldoFinal = 0.0;
O Main.java está dessa forma:
package main;
import java.io.File;
import parsers.ContabilidadeParser;
import parsers.ContablilidadeParserSax;
public class Main
{
public static void main(String[] args)
{
ContabilidadeParser parser = new ContablilidadeParserSax();
File arquivoXml = new File("contabilidade.xml");
Double saldoFinal = parser.parseXml(arquivoXml);
System.out.println("O saldo final é: "+saldoFinal);
}
}
e o XML
<?xml version="1.0" encoding="ISO8859-1"?>
<extrato>
<movimentacao>
<valor>230,00</valor>
<fluxo>Entrada</fluxo>
</movimentacao>
<movimentacao>
<valor>110.00</valor>
<fluxo>Saída</fluxo>
</movimentacao>
<movimentacao>
<valor>1000.00</valor>
<fluxo>Entrada</fluxo>
</movimentacao>
</extrato>
O que está errado?
Obrigado desde já. 
Boa tarde, o problema é que você mesmo está setando para null o Double…
public void startDocument ()
{
System.out.println("Start document");
saldoFinal = null;
}
Boa tarde, fiz algo parecido com o seu de uma olhada para ver se te ajuda
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ContablilidadeParserSax extends DefaultHandler {
public String tagXml = "";
public Double saldoFinal = 0.0;
public double iniciaParser() {
SAXParser parser = null;
try {
parser = SAXParserFactory.newInstance().newSAXParser();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
File arquivoXml = new File("contabilidade.xml");
try {
parser.parse(arquivoXml, this);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return saldoFinal;
}
public void startDocument() throws SAXException {
System.out.println("INÍCIO DOCUMENTO");
}
public void startElement(String nameSpace, String localName,
String qualifiedName, Attributes attributes) throws SAXException {
System.out.println("INÍCIO ELEMENTO <" + qualifiedName + ">");
if (qualifiedName.equals("valor")) {
tagXml = "valor";
}
}
public void characters(char[] texto, int inicio, int tamanho)
throws SAXException {
if (tagXml.equals("valor")) {
saldoFinal += new Double(new String(texto, inicio, tamanho))
.doubleValue();
}
}
public void endElement(String nameSpace, String localName,
String qualifiedName) throws SAXException {
System.out.println("FIM ELEMENTO </" + qualifiedName + ">");
if (qualifiedName.equals("valor")) {
tagXml = "";
}
}
public void endDocument() throws SAXException {
System.out.println("FIM DOCUMENTO");
}
}
e o xml
<?xml version="1.0" encoding="UTF-8"?>
<extrato>
<movimentacao>
<valor>230.00</valor>
<fluxo>Entrada</fluxo>
</movimentacao>
<movimentacao>
<valor>110.00</valor>
<fluxo>Saída</fluxo>
</movimentacao>
<movimentacao>
<valor>1000.00</valor>
<fluxo>Entrada</fluxo>
</movimentacao>
</extrato>
e a classe main
public class Main {
public static void main(String[] args) {
ContablilidadeParserSax parser = new ContablilidadeParserSax();
Double saldoFinal = parser.iniciaParser();
System.out.println("O saldo final é: " + saldoFinal);
}
}
Lembrando que não sei se é a melhor forma, fiz correndo, pode ter coisas que estão fora de padrão…
[]'s
Quando a cabeça fica quente a gente começa a perder de vista pequenos detalhes. Realmente era o caso saldoFinal = null;
Agora eu preciso saber porque o resultado continua vindo 0.0 ao invés de somar os valores… Mas isso eu vou procurar resolver primeiro.
Muito obrigado Alberto!
[]´s
o que eu te passei já está somando, apenas alterei a forma que você fez, mas to usando o Sax normalmente, da uma rodada neste programa e veja que o resultado está saindo corretamente… somado…
[]'s
Deu certo! Muito, muito obrigado pela ajuda… mesmo! 