GeekBolota Posted July 13, 2018 at 02:19 AM Report #611297 Posted July 13, 2018 at 02:19 AM "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; } }
bsccara Posted July 13, 2018 at 10:57 AM Report #611302 Posted July 13, 2018 at 10:57 AM 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. 1 Report
GeekBolota Posted July 13, 2018 at 03:19 PM Author Report #611306 Posted July 13, 2018 at 03:19 PM 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?
bsccara Posted July 15, 2018 at 12:22 AM Report #611317 Posted July 15, 2018 at 12:22 AM 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. 1 Report
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now