NullPointerException / IReport / Java

Caros amigos, estou com um problema para gerar um relatório simples com o IReport. Segue abaixo os procedimentos que estou fazendo. Quem puder dar uma olhada, desde já fico agradecido.

O relatorio é simples, veja lay-out abaixo. Logo apos estao todos os programas
envolvidos no processo.
Este é o passo a passo que estou seguindo para gerar o relatorio no IReport. Esta
ocorrendo um erro descrito na linha abaixo. Descubram onde ESTA O ERRO!!!
Exception in thread “main” java.lang.NullPointerException

1- Criação do relatorio
1.1- New Tipo Blank A4
1.2- Criação do titulo do relatorio (Label em Title)
1.3- Criação dos nomes das colunas (Label em Column Header)
- Agencia
- Nome da Agencia
- Lacre
- Pacotes
1.4- Criação dos Fields
- cage
- nome
- lacr
- paco
1.5- Criação dos Text Fields no Detail
- $F{cage}
- $F{nome}
- $F{lacr}
- $F{paco}
2- Criação da conexão
2.1- Clicar no botão pertinente.
2.2- NEW - Selecionar o tipo de conexão - JRDataSource (Custom JRDataSource).
(Verificar se é deste tipo mesmo!, se não, qual seria?).
2.3- Name : ___________________________________________
Factory class:____________________________________
Metodo estatico: _________________________________
2.4- Preciso testar o funcionamento (TEST) ?
2.5- SAVE (Salvar o arquivo).
3- Compilar o arquivo de gelatorio, para gerar o .JASPER

Agencia Nome da Agencia Lacre Pacotes
xxxx aa----------------------aa xxxx.xxx xxx
xxxx aa----------------------aa xxxx.xxx xxx
xxxx aa----------------------aa xxxx.xxx xxx

= = = = = = = = = = = = = = = = = = = = = = = = = =
import java.util.Map;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.view.JasperViewer;

public class GerarRelatorio {
public static void gerarRelatorio(JRDataSource source) throws JRException {
Map map = new HashMap();
String visao = “…/dist/Folha_A4.jrprint”;
String jaspa = “C:/DHU/Rogerio/Relatorio/Folha_A4.jasper”;
JasperFillManager.fillReport(jaspa, map, source);
JasperViewer.viewReport(visao, false);
}

public static void main (String[] args) {
try {
GerarRelatorio.gerarRelatorio(AgenciaJRDadosFabrica.criacaoDosDados());
}catch (JRException e) { e.printStackTrace(); }
}
}
= = = = = = = = = = = = = = = = = = = = = = = = = =
import java.util.Vector;
import net.sf.jasperreports.engine.JRDataSource;

public class AgenciaJRDadosFabrica {
private static JRDataSource dados;

public static JRDataSource criacaoDosDados() {
if (dados == null) {
String cage = “1908”;
String nome = “CSO BH”;
String lacr = “7234578”;
String paco = “1”;
Agencia ag = new Agencia(cage, nome, lacr, paco);
Vector vitor = new Vector();
vitor.add(ag);
cage = “0012”;
nome = “SETE LAGOAS”;
lacr = “1234678”;
paco = “10”;
ag = new Agencia(cage, nome, lacr, paco);
vitor.add(ag);
cage = “0020”;
nome = “MATOZINHOS”;
lacr = “4444444”;
paco = “7”;
ag = new Agencia(cage, nome, lacr, paco);
vitor.add(ag);
cage = “0022”;
nome = “PRUDENTE DE MORAIS”;
lacr = “3245671”;
paco = “4”;
ag = new Agencia(cage, nome, lacr, paco);
vitor.add(ag);
//= = = = = =
dados = new AgenciaJRDataSource(vitor);
System.out.println(“Passou dentro do criacaoDosDados”);
} else System.out.println(“Passou FORA do criacaoDosDados”);
return dados;
}
}
= = = = = = = = = = = = = = = = = = = = = = = = = =
public class Agencia {

private String cage;
private String nome;
private String paco;
private String lacr;

public Agencia() {
//
}
public Agencia(String cage, String nome, String lacr, String paco) {
this.cage = cage;
this.nome = nome;
this.lacr = lacr;
this.paco = paco;
}

public String getCage() { return cage; }
public void setCage(String cage) { this.cage = cage; }

public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }

public String getPaco() { return paco; }
public void setPaco(String paco) { this.paco = paco; }

public String getLacr() { return lacr; }
public void setLacr(String lacr) { this.lacr = lacr; }
}
= = = = = = = = = = = = = = = = = = = = = = = = = =
import java.util.Iterator;
import java.util.Vector;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;

public class AgenciaJRDataSource implements JRDataSource {
private static Iterator iterator;
private static Agencia cursor;
public AgenciaJRDataSource(Vector agencia) {
super();
iterator = agencia.iterator();
}
public boolean next() throws JRException {
boolean retorno = iterator.hasNext();
return retorno;
}
public Object getFieldValue(JRField nome) throws JRException {
Agencia agencia = cursor;
if (nome.getName().equals(“cage”)) { return agencia.getCage(); }
if (nome.getName().equals(“nome”)) { return agencia.getNome(); }
if (nome.getName().equals(“lacr”)) { return agencia.getLacr(); }
if (nome.getName().equals(“paco”)) { return agencia.getPaco(); }
return null;
}
}
= = = = = = = = = = = = = = = = = = = = = = = = = =
import net.sf.jasperreports.engine.JRField;

public interface JRDataSource {
public Object getFieldValue(JRField jrFields);
public boolean next();
}
= = = = = = = = = = = = = = = = = = = = = = = = = =

É uma pegadinha?
"Descubram o erro"
Cadê o stack trace do erro?

Exception in thread “main” java.lang.NullPointerException
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:517)
at teste.GerarRelatorio.gerarRelatorio(GerarRelatorio.java:20)
at teste.GerarRelatorio.main(GerarRelatorio.java:28)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)