Ler XML com o ParserSAX

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á. :slight_smile:

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! :smiley: