Implementando for para gráfico JFreeChart

Olá a todos. Eu quero fazer um programa que mostre o nome a quantidade de votosm que cada candidato recebeu, e mostre o percnetual dentro de um gráfico através do JFreeChart. So que eu não estou acertado passar o objeto instanciado pra o objeto gerador de gráfico da classe gráfico. Como isso se faz, fazendo como estou agora não aparece nenhum aviso de erro, mas quando compila aparece: Exception in thread “main” java.lang.NullPointerException. Qual será o erro?

Aqui o codigo:

public class Grafico extends JFrame implements Serializable{

	public DefaultPieDataset dados(Pretendentes p) throws IOException{

		DefaultPieDataset votos= new DefaultPieDataset ();
			for(int i=0;i<p.aspirantes.size();i++) {
			votos.setValue(p.aspirantes.get(i).nome, p.aspirantes.get(i).getNum());}
		return votos;
}
	

	public void salvar(JFreeChart molde) throws IOException {

		FileOutputStream registro = new FileOutputStream("result.jpg");
		ChartUtilities.writeChartAsPNG(registro, molde, 900, 700);
}
	
	
public ChartFrame painel(DefaultPieDataset votos) throws IOException {

		JFreeChart molde = ChartFactory.createPieChart("Resultado da eleição", votos);
		ChartFrame forma = new ChartFrame("", molde);
		salvar(molde);
		add(forma);
		
		return forma;
}

public Grafico() throws IOException {
	setSize(950,720);
	setTitle("GRÁFICO PIZZA");//Nome do gráfico
	
	painel(dados(null));
	setVisible(true);
}
	
	
	public Grafico retorno() throws IOException {
		return new Grafico();
	}
}
//===========>>>>>>>CLASSE PRINCIPAL==>>

public class Principal implements Serializable  {

	public static void main(String[] args) throws IOException {
		Scanner l = new Scanner(System.in);
		Pretendentes p = new Pretendentes();
		int m = 5;
		Grafico g = new Grafico();
		
	do {
			
Candidato c = new Candidato();

	System.out.println("1 - cadastrar candidato:"+ "2 - listar candidatos"+ "3 - mostrar grafico");
			m = l.nextInt();

switch(m) {
		case 1:  System.out.println("informe nome e numero de votos");
			c.setNome(l.next());
			c.setNum(l.nextInt());
			p.adicionar(c);
		break;
				
			case 2:try {
				p.listar();}catch(Exception e){
				System.out.println("não tem nenhum candidato");}
			break;
				
			case 3:   g.retorno();
			break;
							
			case 0:	try {s.incluir(p);
				System.out.println("Volte sempre que quiser!");
}catch(Exception e){System.out.println("nao deu pra salvar");}
			break;

				default:			System.out.println("opcao invalida veva menu: ");
			}
				
	}while(m != 0);
	 
}

Em qual linha acusa o null pointer?

Nas linhas onde tem:
Grafico g = new Grafico();
painel(dados(null));
for(int i=0;i<p.aspirantes.size();i++);

Esse for é o que mais me preocupa, porque parece que o parâmetro recebido é vazio, meu principal problema é pegar o objeto instanciado “p”, e coloca-lo na classe Gráfico, lembrando que Pretendentes é so um arrayList de Candidado, que tem nome e qtde de votos

Cara, a exception ocorre em apenas uma linha, qual delas?

em especial no painel (dados()); embora tbm precise de um parâmetro adaquado á classe Grafico

Se o erro é nesta linha, só pode ser causado por um problema na execução do método painel (que nome horrível para um método, parece-me maus um atributo).

E você mesmo é o causador deste problema, ao passar null como parâmetro para os dados.

Aqui você precisa passar o Dataset com os intervalos de dados.

Entendi, no lugar de ChartFrame o certo é ChartPanel, bem, quanto ao parametro de pretendentes, eu usei padrão Singleton na classe, e ficou quase certo, o único prblema é que o gráfico continua vazio:

public class Grafico extends JFrame implements Serializable{

Pretendentes p2 = Pretendentes.getInstancia();
		
public JFreeChart dados( ) throws IOException{
	
	DefaultPieDataset votos= new DefaultPieDataset ();
	
	String nome;
	int qtde;
	
for(int i=0;i<p2.aspirantes.size();i++) {
	nome = p2.aspirantes.get(i).nome;
	qtde = p2.aspirantes.get(i).num;
	votos.insertValue(i, nome, qtde);
}

JFreeChart molde = ChartFactory.createPieChart(“Resultado da eleição”, votos);
return molde;
}

public void salvar(JFreeChart molde) throws IOException {
	FileOutputStream registro = new FileOutputStream("Tabela_de_result.png");
	ChartUtilities.writeChartAsPNG(registro, molde, 900, 700);

}

public ChartPanel painel(JFreeChart molde) throws IOException {
	
ChartPanel coisa = new 	ChartPanel(molde);
salvar(molde);
getContentPane().add(coisa);

return coisa;

}

public Grafico() throws IOException {
	
setLocationRelativeTo(null);//Faz com que o gráfico, quando aberto, 
//apareça no meio, e não na parte superior, sem ele	
setSize(950,720);
setTitle("GRÁFICO PIZZA");
		
	painel(dados());
	setVisible(true);

}

public void mostrar() throws IOException {
	new Grafico();

}

}

Cara, esse trecho aqui

Está certo?

Eu costumo consolidade antes (visto que o insertValue vai sobrescrever o valor já existente pelo último inserido para aquela chave).

ok, eu tentei esses dois modelos de for um de cada vez, mas ambos mostram a mesma coisa:
String nome; int qtde;
for(Candidato c: p2.aspirantes) {
nome = c.getNome();
qtde = c.getNum();
votos.setValue(nome, qtde);
}

/*for(int i=0;i<p2.aspirantes.size();i++) {
	
	nome = p2.aspirantes.get(i).nome;
	qtde = p2.aspirantes.get(i).num;
	votos.setValue(nome, qtde);
	}*/

Deixa eu entender o que chega até esse ponto do código.
Para apresentar o gráfico de pizza, você precisa ter os dados já consolidados, por exemplo, você tem 4 candidados:

João - 200 votos
José - 140 votos
Anna - 210 votos
Maria - 50 votos
Total: 500 votos

Para cada candidato, os totais de votos já estão contados. É isso que acontece nesse ponto?

Tentou fazer com algo hardcoded?

votos.insertValue(0, "João", 200);
votos.insertValue(1, "Augusto", 200);

E ver o que acontece?

mostra os respectivos dados perfeitamente, aí é que tá, que tipo de biblioteca é essa que não mostra dados oriundos de polimorfismo? Como vou aplicar isso num sistema? Será que POSSO fazer isso?

O objetivo era eu fazer um array de nomes e qtde de votos e exibir um grafico desse array

Coimo assim

Se os dados forem passados corretamente, funciona, caso haja erro, não vai funcionar mesmo.
E quem tem que garantir que os dados são passados de maneira correta é você.
Printa os dados que você está passando no loop e tentando inserir no DefaultPieDataset

votos.insertValue(0, “João”, 200);
votos.insertValue(1, “Augusto”, 140);
votos.insertValue(2, nome, qtde);

assim tbm funciona, só pode ser algum erro na transmissão de dados entre classes, e olhe que eu usei SINGLETON(aprendi isso com meu professor de LPOO II neste sábado agora)

E imprimindo os valores?

Consegui finalizar o meu progama com sucesso, valeu, na verdade o problema mesmo era fazer com que os dados salvos chegassem á classe grafico, bem na verdade a solução não foi bem o que eu tinha em mente, e provavelemente eu nem preciso do método singleton nele, mas funcionou, um gráfico ligado automaticamente a lista de candidatos cadastrados. Obrigado pelas dicas, e aqui como funciona:

public class Grafico extends JFrame implements Serializable{

Salvando s = new Salvando();
Pretendentes p2 = s.trazer();

	public Grafico() throws IOException {
	
	setLocationRelativeTo(null);//Faz com que o gráfico, quando aberto, 
	//apareça no meio, e não na parte superior, sem ele	
	setSize(950,720);
	setTitle("GRÁFICO DA ELEIÇÃO");
	int x = p2.aspirantes.size();
	System.out.println("nós temos de candidatos::" + x );
		painel(dados());
		setVisible(true);
}


public JFreeChart dados( ) throws IOException{
	
	DefaultPieDataset votos= new DefaultPieDataset ();

	String nome ;
	int qtde ;
	
for(int i=0;i<p2.aspirantes.size();i++) {
		nome = p2.aspirantes.get(i).nome;
		qtde = p2.aspirantes.get(i).num;
		votos.setValue(nome, qtde);			}

JFreeChart molde = ChartFactory.createPieChart(“Resultado da eleição”, votos);
return molde;
}

public void salvar(JFreeChart molde) throws IOException {
	FileOutputStream registro = new FileOutputStream("Tabela_de_result.png");
	ChartUtilities.writeChartAsPNG(registro, molde, 900, 700);
	registro.close();
}

public ChartPanel painel(JFreeChart molde) throws IOException {
	
ChartPanel coisa = new 	ChartPanel(molde);
salvar(molde);
getContentPane().add(coisa);

return coisa;
}

public void mostrar() throws IOException {
	new Grafico();
}

}

public class Principal implements Serializable {

public static void main(String[] args) throws IOException {
	
	Salvando s = new Salvando();//Classe Seriable
	Scanner l = new Scanner(System.in);
	Pretendentes p = Pretendentes.getInstancia();
	Grafico g = new Grafico();
	int m = 5;				
try {
	Pretendentes p3 = null;
	p3 = s.trazer();
	p = p3;
	}catch(Exception e){
	System.out.println("problema de trazimento");
}


	do {
			Candidato c = new Candidato();
		System.out.println("1 - cadastrar candidato: \n"
				+ "2 - listar candidatos \n"
				+ "3 - mostrar grafico ");
				;
		m = l.nextInt();
		switch(m) {

		case 1:			System.out.println("informe nome e numero de votos");
			c.setNome(l.next());
			c.setNum(l.nextInt());
			p.adicionar(c);
			s.incluir(p4);
			break;
			
		case 2:try {
			p4.listar();
			//p.listar();
		}catch(Exception e){
			System.out.println("não tem nenhum candidato");
		}
		break;
		
		case 3:		g.mostrar();
		break;
		
		case 0:		try {
		s.incluir(p);
		System.out.println("Volte sempre que quiser!");
		}catch(Exception e){
		System.out.println("nao deu pra salvar");
		}
		break;

			default:	System.out.println("opcao invalida veva menu: ");
		}
		
	}while(m != 0);
	 
}

}