Pesquisa sequencial

Preciso fazer uma pesquisa sequencial em uma lista de objetos da classe Pessoa a partir de seu ID, mas após pesquisar o terceiro número está aparecendo o erro Exception in thread “main” java.lang.NullPointerException
at Lista.Pesquisar(TP05Q01PesquisaSequencial.java:662)
at TP05Q01PesquisaSequencial.main(TP05Q01PesquisaSequencial.java:700)

Além disso preciso criar um txt com o tempo de execução e o numero de comparações feitas no algoritmo, e esse txt não está sendo criado

> import javax.swing.*;
> import java.io.FileWriter;
> import java.io.IOException;
> import java.io.PrintWriter;
> class Pessoa {



> 	//Declaracao de variaveis

> 	private int id,idade;

> 	private String nome;

> 	private String nacionalidade;

> 	private String datadenascimento;

> 	private String localdenascimento;

> 	private String datademorte;

> 	private String localdemorte;





> 	//Construtor vazio

> 	public Pessoa() {

> 		this.id = this.idade = 0;

> 		this.nome = "";

> 		this.nacionalidade = "";

> 		this.datadenascimento = "";

> 		this.localdenascimento = "";

> 		this.datademorte = "";

> 		this.localdemorte = "";

> 	}





> 	//Construtor que recebe parametros

> 	public Pessoa (int id, String nome, String nacionalidade, String datadenascimento, String localdenascimento, String datademorte, String localdemorte, int idade) {

> 		this.id = id;

> 		this.nome = nome;

> 		this.nacionalidade = nacionalidade;

> 		this.datadenascimento = datadenascimento;

> 		this.localdenascimento = localdenascimento;

> 		this.datademorte = datademorte;

> 		this.localdemorte = localdemorte;

> 		this.idade = idade;

> 	}





> 	//Metodo para transformar o mes em seu respectivo numero

> 	public int getMes(String data){

> 		int resp = 0;

> 		if(data.contains("janeiro") == true){

> 			resp = 1;

> 		} else if(data.contains("fevereiro") == true){

> 			resp = 2;

> 		} else if(data.contains("março") == true){

> 			resp = 3;

> 		} else if(data.contains("abril") == true){

> 			resp = 4;

> 		} else if(data.contains("maio") == true){

> 			resp = 5;

> 		} else if(data.contains("junho") == true){

> 			resp = 6;

> 		} else if(data.contains("julho") == true){

> 			resp = 7;

> 		} else if(data.contains("agosto") == true){

> 			resp = 8;

> 		} else if(data.contains("setembro") == true){

> 			resp = 9;

> 		} else if(data.contains("outubro") == true){

> 			resp = 10;

> 		} else if(data.contains("novembro") == true){

> 			resp = 11;

> 		} else if(data.contains("dezembro") == true){

> 			resp = 12;

> 		}

> 		return resp;

> 	}





> 	//Gets e sets

> 	public int getId() {

> 		return this.id;

> 	}



> 	public int getIdade() {

> 		return this.idade;

> 	}



> 	public String getNome() {

> 		return this.nome;

> 	}



> 	public String getNacionalidade() {

> 		return this.nacionalidade;

> 	}



> 	public String getDatadenascimento() {

> 		return this.datadenascimento;

> 	}



> 	public String getLocaldenascimento() {

> 		return this.localdenascimento;

> 	}



> 	public String getDatademorte() {

> 		return this.datademorte;

> 	}



> 	public String getLocaldemorte() {

> 		return this.localdemorte;

> 	}



> 	public void setId(int id) {

> 		this.id = id;

> 	}



> 	public void setIdade(int idade) {

> 		this.idade = idade;

> 	}



> 	public void setNome(String nome) {

> 		this.nome = nome;

> 	}



> 	public void setNacionalidade(String nacionalidade) {

> 		this.nacionalidade = nacionalidade;

> 	}



> 	public void setDatadenascimento(String datadenascimento) {

> 		this.datadenascimento = datadenascimento;

> 	}



> 	public void setLocaldenascimento(String localdenascimento) {

> 		this.localdenascimento = localdenascimento;

> 	}



> 	public void setDatademorte(String datademorte) {

> 		this.datademorte = datademorte;

> 	}



> 	public void setLocaldemorte(String localdemorte) {

> 		this.localdemorte = localdemorte;

> 	}







> 	//Metodo clone 

> 	public Pessoa clone (){

> 		Pessoa resp = new Pessoa();

> 		resp.id = this.id;

> 		resp.idade = this.idade;

> 		resp.nome = this.nome;

> 		resp.nacionalidade = this.nacionalidade;

> 		resp.datadenascimento = this.datadenascimento;

> 		resp.localdenascimento = this.localdenascimento;

> 		resp.datademorte = this.datademorte;

> 		resp.localdemorte = this.localdemorte;

> 		return resp;

> 	}





> 	//Metodo que faz o parse no arquivo

> 	public void parsePessoa(String s){

> 		String array[] = s.split(" ## ");

> 		this.id = new Integer(array[0]).intValue();

> 		this.nome = array[1];

> 		this.nacionalidade = array[2];

> 		this.datadenascimento = array[3];

> 		this.localdenascimento = array[4];

> 		this.datademorte = array[5];

> 		this.localdemorte = array[6];

> 		this.idade = new Integer(array[7]).intValue();

> 	}







> 	//Metodo para pegar uma Substring dentro de uma String	

> 	public String getSubstringEntre(String s, String antes, String depois){

> 		String resp = "";

> 		int posInicio , posFim;



> 		posInicio = s.indexOf(antes) + antes.length();



> 		if(antes.compareTo(depois) != 0){

> 			posFim = s.indexOf(depois);

> 		} else {

> 			posFim = s.indexOf(depois, posInicio);

> 		}



> 		if(0 <= posInicio && posInicio < posFim && posFim < s.length()){

> 			resp = s.substring(posInicio, posFim);

> 		}



> 		return resp;

> 	}





> 	//Metodo para pegar um int dentro de uma string, removendo . para deixar o numero inteiro

> 	public int getIntEntre(String s, String antes, String depois){

> 		return (new Integer(getSubstringEntre(s, antes, depois).replace(".","").trim())).intValue();

> 	}





> 	//Metodo para pegar um double dentro de uma string, trocando as , por . para que o real seja lido em Java

> 	public double getDoubleEntre(String s, String antes, String depois){

> 		return (new Double(getSubstringEntre(s, antes, depois).replace(",",".").trim())).doubleValue();

> 	}





> 	//Metodo que remove qualquer ocorrencia de tags como < > & ao ler um atributo

> 	public String removeTags(String s){

> 		String resp = "";



> 		for (int i = 0; i < s.length(); i++){



> 			/*Procurar uma ocorrencia de > apos uma ocorrencia de <. As clausulas nao podem ser invertidas pois seria verificado antes um i fora do tamanho da                         String*/

> 			while(i < s.length() && s.charAt(i) == '<'){

> 				for (i++; s.charAt(i) != '>'; i++);

> 				i++;



> 				//Percorrer a String apos uma ocorrencia de & ate encontrar um ;

> 				while(i < s.length() && s.charAt(i) == '&'){

> 					for (i++; s.charAt(i) != ';'; i++);

> 					i++;

> 				}

> 			}



> 			//Encontrar apos uma ocorrencia de & todas as tags antes de um ; e remove-las

> 			while(i < s.length() && s.charAt(i) == '&'){

> 				for (i++; s.charAt(i) != ';'; i++);

> 				i++;

> 				resp += ' ';

> 			}



> 			//Devemos verificar se o i ainda esta percorrendo uma posicao valida do vetor antes de fazer a operacao

> 			if(i < s.length()){

> 				resp += s.charAt(i);

> 			}

> 		}



> 		while(resp.length() > 0 && resp.charAt(0) == ' '){

> 			resp = resp.substring(1);

> 		}



> 		return resp;

> 	}





> 	//Metodo que le o arquivo e passa os parametros para as variaveis

> 	public void LerTudo(String nomeArquivo) {

> 		String linha;



> 		//Abrir o arquivo para leitura

> 		Arq.openRead(nomeArquivo, "UTF8");



> 		//Definir atributo id

> 		this.id = (nomeArquivo.charAt(nomeArquivo.length() - 8) - 48) * 100;

> 		this.id += (nomeArquivo.charAt(nomeArquivo.length() - 7) - 48) * 10;

> 		this.id += (nomeArquivo.charAt(nomeArquivo.length() - 6) - 48);



> 		//Definir atributo nome

> 		for(linha = Arq.readLine(); linha.contains("<h1") == false; linha = Arq.readLine());

> 		this.nome = getSubstringEntre(linha, "lang=\"pt\">", "</h1>");



> 		//Definir atributo nacionalidade

> 		for(linha = Arq.readLine(); linha.contains("Nacionalidade") == false; linha = Arq.readLine());

> 		this.nacionalidade = removeTags(Arq.readLine());



> 		//Definir atributo nascimento

> 		for(linha = Arq.readLine(); linha.contains("Nascimento") == false; linha = Arq.readLine());

> 		this.datadenascimento = removeTags(Arq.readLine());



> 		//Se vivo

> 		if(this.datadenascimento.charAt(this.datadenascimento.length()-1) == ')'){

> 			String tmp = this.datadenascimento.substring(this.datadenascimento.indexOf('(') + 1);

> 			tmp = tmp.substring(0, tmp.indexOf(' '));

> 			this.idade = (new Integer(tmp)).intValue();

> 			this.datadenascimento = this.datadenascimento.substring(0, this.datadenascimento.indexOf('('));

> 			this.datademorte = "vivo";

> 			this.localdemorte = "vivo";

> 		} else {

> 			this.datademorte = "";

> 			this.localdemorte = "";

> 		}



> 		//Definir atributo local de nascimento

> 		for(linha = Arq.readLine(); linha.contains("Local") == false; linha = Arq.readLine());

> 		this.localdenascimento = removeTags(Arq.readLine());



> 		//Definir atributos morte e local de morte

> 		if (this.datademorte.length() == 0){

> 			for(linha = Arq.readLine(); linha.contains("Morte") == false; linha = Arq.readLine());

> 			this.datademorte = removeTags(Arq.readLine());



> 			if(this.datademorte.contains("(") == true){

> 				String tmp = this.datademorte.substring(this.datademorte.indexOf('(') + 1);

> 				tmp = tmp.substring(0, tmp.indexOf(' '));

> 				this.idade = (new Integer(tmp)).intValue();

> 				this.datademorte = this.datademorte.substring(0, this.datademorte.indexOf('('));

> 			}



> 			for(linha = Arq.readLine(); linha.contains("Local") == false; linha = Arq.readLine());

> 			this.localdemorte = removeTags(Arq.readLine());

> 		}



> 		//Fechar o arquivo para a leitura

> 		Arq.close();

> 	}





> 	//Metodo que mostra os atributos na saida padrao

> 	public void EscreverTudo(){

> 		MyIO.println(this.id + " " + 

> 				this.nome + " " + 

> 				this.nacionalidade + " " +

> 				this.datadenascimento + " " +

> 				this.localdenascimento + " " +

> 				this.datademorte + " " +

> 				this.localdemorte + " " +

> 				this.idade + " " + 

> 				"");

> 	}

> }

> class Lista {
> 	Pessoa pessoa = new Pessoa();
> 	private Pessoa[] array;
> 	private int n;


> 	//Construtor
> 	public Lista () {
> 		this(6);
> 	}

> 	//Construtor da classe
> 	public Lista (int tamanho){
> 		array = new Pessoa[tamanho];
> 		n = 0;
> 	}



> 	//Metodo que insere um elemento na ultima posicao da lista
> 	public void inserirFim(Pessoa pessoa) {
> 		array[n] = pessoa.clone();
> 		n++;
> 	}


> 	public boolean Pesquisar (Lista lista, String s) {
> 		int i = 0;
> 		boolean resp = false;
> 		for (i = 0; i < array.length; i++) {
> 			int valor = Integer.parseInt(s);
> 			if (valor == array[i].getId()) {
> 				resp = true;
> 				break;
> 			}
> 		}

> 		return resp;
> 	}
> }

> class TP05Q01PesquisaSequencial {
> 	public static void main (String args[]) throws IOException {
> 		Pessoa pessoa = new Pessoa();
> 		Lista lista = new Lista(1000);
> 		long inicio = System.currentTimeMillis();
> 		int comparacoes = 0;
> 		String[] entrada = new String[1000];
> 		String[] entrada2 = new String[1000];
> 		int numEntrada = 0;
> 		int numEntrada2 = 0;

> 		//Leitura da entrada padrao
> 		do {
> 			entrada[numEntrada] = MyIO.readLine();
> 		}while (entrada[numEntrada++].equals ("####") == false);
> 		numEntrada --;		

> 		//Preenchendo a lista de Pessoas
> 		for (int i = 0; i < numEntrada; i++) {
> 			pessoa = new Pessoa();
> 			pessoa.LerTudo(entrada[i]);
> 			lista.inserirFim(pessoa);
> 		}


> 		//Le a segunda parte da entrada e chama o metodo de pesquisa
> 		do{
> 			entrada2[numEntrada2] = MyIO.readLine();
> 			if(lista.Pesquisar(lista,entrada2[numEntrada2])==true) {
> 				MyIO.println("SIM");
> 				comparacoes++;
> 			}
> 			else{
> 				MyIO.println("NAO");
> 				comparacoes++;
> }
> 			}while (entrada2[numEntrada2++].equals("FIM") == false);
> 		numEntrada2--;
> 		
> 		



> 		long fim = System.currentTimeMillis();

> 		FileWriter arq = new FileWriter("575350_sequencial.txt");
> 		PrintWriter gravarArq = new PrintWriter(arq);
> 		gravarArq.printf("575350 \t" + (fim-inicio) + "\t" + comparacoes);
> 		arq.close();
> 	}

> }

null pointer exception é assim

objeto o = null;
o.metodo; /* CABUM */

agora seu codigo esta dificil de ler ( que formatação é essa???) e vc faz coisas como

if( condicao == true )

quando poderia ser apenas

if ( condicao )

isso é mais legivel

Ninguém que mostro consegue entender os códigos, e olha que a primeira parte inteira foi copiada do professor. Ele nos obriga a usar algumas classes criadas por ele que complicam tudo.

Quanto ao post, o null pointer foi resolvido trocando o array.length do método abaixo por n, que era o tamanho da Lista

public boolean Pesquisar (Lista lista, String s) {
int i = 0;
boolean resp = false;
for (i = 0; i < n; i++) {
int valor = Integer.parseInt(s);
if (valor == array[i].getId()) {
resp = true;
break;
}