Jump to content
GeekBolota

Como resolver o NullPointerException

Recommended Posts

GeekBolota

"Boa, no meu código na linha "int countMoviesYear = dic_do_Ano.get(ano).size();", penúltima linha está me a dar nullpointerexception e eu não estou a perceber porquê, alguém tem alguma sugestão de como resolver? Obrigada.

package pt.ulusofona.deisi.aedProj2018;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.HashMap;


public class Main{
	
	//Declaração das variáves estáticas
		static  int resultado;
	    static ArrayList<Filme>filmes = new ArrayList<>();
	    static HashMap<Integer, Filme> filmesRepetidos;
	    static HashMap<Integer, ArrayList<Filme>> dic_do_Ano;//dicionário do ano
	    static HashMap<Integer,Actor> lista_dos_Atores ;
	    static ArrayList<GNC> lista_dos_Generos;
	    
	public static void main(String[] args) {
		parseMovieFiles();
		ArrayList<Filme> invocar = getMovies();
		 resultado = countMoviesYear(1890);
		System.out.println("O resultado é ->" + resultado);
		
	}
	
	
	public static void parseMovieFiles() {
		//Inicialização de algumas variáveis
		filmesRepetidos = new HashMap<Integer, Filme> ();
        dic_do_Ano = new HashMap<Integer, ArrayList<Filme>>();
        filmes = new ArrayList<Filme>();
        filmes = new ArrayList<Filme>();
        lista_dos_Atores = new HashMap<Integer, Actor>();
        lista_dos_Generos = new ArrayList<GNC>();
        		
		String nomeFicheiroFilme = "deisi_movies.txt";
		String nomeFicheiroAtor = "deisi_actors.txt";
		String nomeFicheiroGenero = "deisi_genres.txt";
		
		//Leitura do Ficheiro Filmes
        try {
            File ficheiro = new File(nomeFicheiroFilme);
            Scanner leitorFicheiro = new Scanner(ficheiro);

            // enquanto o ficheiro tiver linhas não-lidas
            while(leitorFicheiro.hasNextLine()) {
                // ler uma linha do ficheiro
                String linha = leitorFicheiro.nextLine();
                // partir a linha no caractere separador
                String dados[] = linha.split(",");
                if (dados.length == 7){
                    
                    
                        int id = Integer.parseInt(dados[0]);
                        String titulo = dados[1];
                        String data = dados[2];
                        
                        String date[] = data.split("-");
                        int ano = Integer.parseInt(date[0]);
                        
                        int orcamento = Integer.parseInt(dados[3]);
                        float duracao = Float.parseFloat(dados[4]);
                        float mediaVotos = Float.parseFloat(dados[5]);
                        int nrVotos = Integer.parseUnsignedInt(dados[6]);
                        HashMap<String,Actor>ator = new HashMap<>();
                        ArrayList<GNC> generos = new ArrayList<>();
                        
                        Filme filme = new Filme(id,titulo, data, orcamento,duracao, mediaVotos, nrVotos, ator, generos);
                        
                    if(filmesRepetidos.get(id)==null){
                        filmesRepetidos.put(id,filme);
                        ArrayList<Filme> lista = new ArrayList<>();
                        
                        if (dic_do_Ano.get(ano) == null) {
                            lista.add(filme);
                            dic_do_Ano.put(ano, lista);
                           
                        } else {
                            lista = dic_do_Ano.get(ano);
                            lista.add(filme);
                            dic_do_Ano.put(ano, lista);
                        }
                        filmes.add(filme);
                    }
                }

            }
		

            leitorFicheiro.close();
            System.out.println("Tamanho dicionario: " + dic_do_Ano.size());
	 }
     catch(FileNotFoundException exception) {
           String mensagem = "Erro: o ficheiro " + nomeFicheiroFilme + " nao foi encontrado.";
           System.out.println(mensagem);
	
     }
        
        //Leitura do Ficheiro Atores
        try {
        	
        	File ficheiro = new File(nomeFicheiroAtor);
            Scanner leitorFicheiro = new Scanner(ficheiro);
         
            // enquanto o ficheiro tiver linhas não-lidas
        	while(leitorFicheiro.hasNextLine()) {
        		// ler uma linha do ficheiro
                String linha = leitorFicheiro.nextLine();
                // partir a linha no caractere separador
                String dados[] = linha.split(",");
                if (dados.length == 4){
                	int idActor = Integer.parseInt(dados[0]);
                    String nomeActor = dados[1];
                    Boolean sexo = Boolean.parseBoolean(dados[2]);
                    int idFilme = Integer.parseInt(dados[3]);

                    Actor actorTemp = null;
                    //Ja tenho um objecto que represente este actor?
                    //Percorrer a lista de retorno para saber se tem actores repetidos
                    //Compara os objetos da lista de retorno e compara com o objecto que se pretende inserir
                    if(lista_dos_Atores.get(idActor) == null){
                        actorTemp = new Actor(idActor,nomeActor,sexo,idFilme);
                        lista_dos_Atores.put(idActor, actorTemp);
                    }else{
                        actorTemp = lista_dos_Atores.get(idActor);
                    }
                    Filme filme=filmesRepetidos.get(idFilme);
                    if(filme!=null){
                        filme.actores.put(actorTemp.nomeAtor,actorTemp);//adicionar o actor ao filme
                    }

                }
        		
        	}
        	
        	 leitorFicheiro.close();
        }
        
        catch(FileNotFoundException exception) {
            String mensagem = "Erro: o ficheiro " + nomeFicheiroAtor + " nao foi encontrado.";
            System.out.println(mensagem);
        }
        
	//Leitura do Ficheiro Géneros (GNC)
        try {
        	
        	File ficheiro = new File(nomeFicheiroGenero);
        	Scanner leitorFicheiro = new Scanner(ficheiro);
        	
        	//enquanto o ficheiro tiver linhas não-lidas
        	while(leitorFicheiro.hasNextLine()) {
        		
        		// ler uma linha do ficheiro
                String linha = leitorFicheiro.nextLine();
                // partir a linha no caractere separador
                String dados[] = linha.split(",");
                if (dados.length == 2){
                    String nomeGenero = dados[0];
                    int idFilmes = Integer.parseInt(dados[1]);
                    GNC gen = new GNC(nomeGenero, idFilmes);
                    lista_dos_Generos.add(gen);

                    //Procurar na lista filmes o idFilme deste objecto
                    Filme filme=filmesRepetidos.get(idFilmes);
                    if(filme!=null){
                        filme.generos.add(gen);//adicionar o actor ao filme
                    }
                }
        		
        	}
        	
        	  leitorFicheiro.close();
        	
        }
	
        catch(FileNotFoundException exception) {
            String mensagem = "Erro: o ficheiro " + nomeFicheiroGenero + " nao foi encontrado.";
            System.out.println(mensagem);
        }
	
	}	
	
	public static ArrayList<Filme> getMovies(){
        return filmes;
        
    }
    
	public static int countMoviesYear(int ano){
		
		int countMoviesYear = dic_do_Ano.get(ano).size();

		return countMoviesYear;	
		
	}
	
	

}

 

Share this post


Link to post
Share on other sites
bsccara

Estás a usar o método 'get' para procurar os filmes de 1890; se nenhum existir (estás a procurar nos primórdios do cinema) no HashMap irás obter um ponteiro nulo, como explicitado aqui.

Deves usar o método containsKey para proteger contra isso.

  • Vote 1

Share this post


Link to post
Share on other sites
GeekBolota
4 horas atrás, bsccara disse:

Estás a usar o método 'get' para procurar os filmes de 1890; se nenhum existir (estás a procurar nos primórdios do cinema) no HashMap irás obter um ponteiro nulo, como explicitado aqui.

Deves usar o método containsKey para proteger contra isso.

Mas eu sei que que existem dois filmes de 1890 no ficheiro, é possível ele apontar para nada mesmo existindo?

Share this post


Link to post
Share on other sites
bsccara

Se sabes que tens uma ou várias linhas com filmes de 1890 ainda assim pode não existir nenhuma chave para esse ano no HashMap:

- Se a formatação das linhas no ficheiro estiver mal e o número de campos por linha não fôr 7 as linhas serão ignoradas; basta um ponto em vez duma vírgula, pois estás a separar os campos com vírgulas.

String dados[] = linha.split(",");
if (dados.length == 7){

- Se tiveres linhas com o mesmo primeiro campo todas as subsequentes à primeira serão ignoradas, independentemente dos restantes campos.

if(filmesRepetidos.get(id)==null){
  filmesRepetidos.put(id,filme);

O melhor a fazeres é meteres um 'breakpoint' na linha que estoura e verificar quais as chaves contidas no HashMap. O teu IDE deverá permitir fazer isso sem esforço.

  • Vote 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.