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();
> }
> }