Why of Null Pointer Exception in simple Java agenda program, and how to configure the function that returns an array of phones

Asked

Viewed 212 times

1

Good evening! I’m having a problem with a college job, which is apparently simple (however, I’m very Noob in Java, and I don’t know what to do!).

I would like you to help me, I am receiving Null Pointer Exception by calling the number 3 on the menu, after creating new contacts. And I also need help to encode the function searchTelephones, which has an array as return(I have no idea how to do that). From now on, I thank everyone for their understanding and help!

PS: Any suggestion will be welcome![Foto do exercicio

package agenda.de.telefones;

import java.util.Scanner;

public class Controlador_AgendaDeTelefones {    

    public static void main(String[] args) {

        Agenda agenda = new Agenda();
        Scanner entrada = new Scanner(System.in);

        while(true){

            System.out.println("1 - Incluir Contato");
            System.out.println("2 - Alterar Contato");
            System.out.println("3 - Alterar Telefone");
            System.out.println("4 - Buscar Contato");
            System.out.println("9 - Sair");

            int opcao = entrada.nextInt();

            switch(opcao){
                case 1: //Incluir contato
                    System.out.println("Voce escolheu: Incluir Contato!");
                    System.out.println("Digite o nome do contato: ");
                    String nome1 = entrada.next();
                    System.out.println("Digite o numero do contato: ");
                    String numero1 = entrada.next();
                    System.out.println("Digite o tipo de telefone: ");
                    String tipo1 = entrada.next();

                    Contato c = new Contato(nome1);                  
                    Telefone t = new Telefone(numero1, tipo1);

                    int status1 = agenda.novoContato(c, t);
                        if(status1 == 1){
                            System.out.println("Contato incluido com sucesso!");
                        }else{
                            System.out.println("O contato não pode ser incluso por falta de espaço");
                        }                      

                    break;
                case 2://Alterar Contato
                    System.out.println("Voce escolheu Alterar Contato!");
                    System.out.println("Digite o nome do contato a ser alterado: ");
                    String nome2 = entrada.next();
                    System.out.println("Digite o novo nome do contato: ");
                    String novoNome2 = entrada.next();

                    int status2 = agenda.alterarContato(nome2, novoNome2);
                    if(status2 == 1){
                            System.out.println("Contato alterado com sucesso!");
                        }else{
                            System.out.println("O contato não pode ser alterado!");
                        }         

                    break;
                case 3://Alterar Telefone
                    System.out.println("Voce escolheu Alterar Telefone!");
                    System.out.println("Digite o nome do contato que deseja alterar o telefone:");
                    String nome3 = entrada.next();
                    System.out.println("Digite o numero que deseja alterar: ");
                    String numero3 = entrada.next();
                    System.out.println("Digite o novo numero desejado: ");
                    String novoNumero3 = entrada.next();

                    int status3 = agenda.alterarTelefone(nome3, numero3, novoNumero3);
                    if(status3 == 1){
                            System.out.println("Contato alterado com sucesso!");
                        }else{
                            System.out.println("O contato não pode ser alterado!");
                        }         

                    break;
                case 4://Buscar Contato
                    System.out.println("Voce escolheu Buscar Contato!");
                    System.out.println("Digite o nome do contato que deseja buscar:");
                    String nome4 = entrada.next();

                    agenda.buscarContato(nome4);

                    //terminar                    
                    break;
                case 9:
                    System.exit(0);
                default:
                    System.out.println("Opcao Invalida! Tente outra vez.");
                    break;
            }            
        }     

    }    
}

Then there are the other classes:

package agenda.de.telefones;

public class Agenda {
    private String dono;
    Contato contato = new Contato();
    Telefone telefone = new Telefone();

    private Contato[] meusContatos;
    private int numContatos;
    // controla a posiçao do array meusContatos

    private Telefone[] meusTelefones;
    private int numTelefones;
    // controla a posiçao do array meusTelefones

    //métodos construtores
    public Agenda(){
        meusContatos = new Contato[50];
        numContatos = 0;

        meusTelefones = new Telefone[50];
        numTelefones = 0;
    }

    //métodos de acesso
    public String getDono(){
        return dono;
    }

    public void setDono(String dono){
        this.dono = dono;
    }

    //métodos delegados
    public void mostrarDados(){

    }

    public int novoContato(Contato c1, Telefone t){        
        int retorno = 0;
        if(numContatos < 50){
            c1.associarTelefone(t);
            this.meusContatos[numContatos] = c1;
            numContatos++;
            numTelefones++;
            retorno = 1;
        }
        return retorno;
    }   

    public int alterarContato(String nome1, String novoNome1){        
        int retorno = 0;
        for(int i = 0; i<numContatos; i++){           
            if(this.meusContatos[i].getNome().equals(nome1)){                
                meusContatos[i].setNome(novoNome1);
                retorno = 1;
            }
        }
        return retorno;
    }

    public int alterarTelefone(String nome3, String numero3, String novoNumero3){
        int retorno = 0;
        for(int i = 0; i<numContatos; i++){            
            if(this.meusContatos[i].getNome().equals(nome3)){
                retorno = contato.alterarTelefone(numero3, novoNumero3, i);
            }
        }
    return retorno;
    }

    public void buscarContato(String nome4){
        for(int i = 0; i<numContatos; ++i){
            if(this.meusContatos[i].getNome().equals(nome4)){
                System.out.println("Numero: "+meusTelefones[i].getNumero());
            }
        }
    }

}

package agenda.de.telefones;

public class Contato {
    private String nome;
    private Telefone[] meusTelefones;
    private int numTelefones;
    // controla a posiçao do array meusTelefones

    //métodos construtores
    public Contato(){
        meusTelefones = new Telefone[50];
        numTelefones = 0;
    }

    public Contato(String nome){
        this.nome = nome;
        meusTelefones = new Telefone[50];
        numTelefones = 0;     
    }

    //métodos de acesso aos atributos (getters e setters)
    public String getNome() {
        return nome;
    }

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

    //metodos delegados
    public void mostrarDados(){
        System.out.println("Nome: " + this.nome); 
    }

    public int alterarTelefone(String numero3, String novoNumero3, int i){    
        int retorno = 0;
        if(this.meusTelefones[i].getNumero().equals(numero3)){                    
            meusTelefones[i].setNumero(novoNumero3);
            retorno = 1;
        }
    return retorno;
    }

    public void associarTelefone(Telefone t){
        meusTelefones[numTelefones] = t;
        numTelefones++;
    }
/*
    public Array[Telefone] buscarTelefone(){
        Está comentado porque realmente não sei o que fazer :(
    }*/

}

package agenda.de.telefones;

public class Telefone {
    private String numero;
    private String tipo;    

    //métodos construtores
    public Telefone(){        
    }

    //métodos de acesso aos atributos (getters e setters)
    public Telefone(String numero1, String tipo1){
        this.numero = numero1;
        this.tipo = tipo1;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;        
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public void mostrarDados(){
        System.out.println("Numero: "+this.numero);
        System.out.println("Tipo: "+this.tipo);
    }    
}

2 answers

1


Your code is a little messy - and to be honest, I think the diagram you passed is also incomplete.

Anyway, the tip I give is that you try to separate the function of each class well.

For example: The Agenda class should not, in my opinion, create a Phone.

The ideal is that the Agenda takes care only of Contact objects, which in turn takes care of Phone objects.

So if you want someone’s phone, you will have to call several methods in series, for example:

    meusContatos[0]. // seleciona um objeto Contato (pos. 0 do Array)
        buscarTelefone()[0]. // retorna um objeto Telefone (da pos. 0 do Array)
            getNumero(); // retorna o número dentro desse objeto

Remember that your structure is like this, and do not try to "skip steps" when doing gets/sets of the data.

I beginnings to modify your code - there are still things to do, but I think you can get an idea of how to follow.


Controller Class:

package agenda.de.telefones;

import java.util.Scanner;

public class Controlador_AgendaDeTelefones {

    public static void main(String[] args) {

        Agenda agenda = new Agenda("nome");
        Scanner entrada = new Scanner(System.in);

        while (true) {

            System.out.println("1 - Incluir Contato");
            System.out.println("2 - Alterar Contato");
            System.out.println("3 - Alterar Telefone");
            System.out.println("4 - Buscar Contato");
            System.out.println("9 - Sair");

            int opcao = entrada.nextInt();

            switch (opcao) {
            case 1: // Incluir contato
                System.out.println("Voce escolheu: Incluir Contato!");
                System.out.println("Digite o nome do contato: ");
                String nome1 = entrada.next();
                System.out.println("Digite o numero do contato: ");
                String numero1 = entrada.next();
                System.out.println("Digite o tipo de telefone: ");
                String tipo1 = entrada.next();

                agenda.novoContato(nome1, numero1, tipo1);
                break;

            case 2:// Alterar Contato
                System.out.println("Voce escolheu Alterar Contato!");
                System.out.println("Digite o nome do contato a ser alterado: ");
                String nome2 = entrada.next();
                System.out.println("Digite o novo nome do contato: ");
                String novoNome2 = entrada.next();

                agenda.alterarContato(nome2, novoNome2);

                break;
            case 3:// Alterar Telefone
                System.out.println("Voce escolheu Alterar Telefone!");
                System.out.println("Digite o nome do contato que deseja alterar o telefone:");
                String nome3 = entrada.next();
                System.out.println("Digite o numero que deseja alterar: ");
                String numero3 = entrada.next();
                System.out.println("Digite o novo numero desejado: ");
                String novoNumero3 = entrada.next();

                agenda.alterarTelefone(nome3, numero3, novoNumero3);

                break;
            case 4:// Buscar Contato
                System.out.println("Voce escolheu Buscar Contato!");
                System.out.println("Digite o nome do contato que deseja buscar:");
                String nome4 = entrada.next();

                agenda.buscarContato(nome4);

                // terminar
                break;
            case 9:
                System.exit(0);
            default:
                System.out.println("Opcao Invalida! Tente outra vez.");
                break;
            }
        }
    }
}


Agenda Class:

package agenda.de.telefones;

public class Agenda {
    private String dono;
    private Contato[] meusContatos;
    private static int contador = 0;

    // métodos construtores
    public Agenda(String dono) {
        meusContatos = new Contato[50];
        this.dono = dono;
    }

    // métodos de acesso
    public String getDono() {
        return dono;
    }

    public void setDono(String dono) {
        this.dono = dono;
    }

    // métodos delegados
    public void mostrarDados() {
    }

    public void novoContato(String nome, String t, String tipo) {

        if (contador >= 50) {
            System.out.println("Não é possível adicionar mais contatos. Agenda cheia!");
            return;
        }

        meusContatos[contador++] = new Contato(nome, t, tipo);

    }

    public void alterarContato(String nome1, String novoNome1) {
        for (int i = 0; i < contador; i++) {
            if (meusContatos[i].getNome().equals(nome1)) {
                meusContatos[i].setNome(novoNome1);
                return;
            }
        }
        System.out.println("Não foi possível alterar contato. Contato não encontrado!");
    }

    public void alterarTelefone(String nome3, String numero3, String novoNumero3) {
        /*
         * TODO
         */
    }

    public void buscarContato(String nome4) {

        for (int i = 0; i < contador; i++) {
            if (meusContatos[i].getNome().equals(nome4)) {

                System.out.println("Contato: " + meusContatos[i].getNome());
                System.out.println("Telefones:");
                for (int j = 0; j < meusContatos[i].getQtdTelefones(); j++) {
                    System.out.println(meusContatos[i].buscarTelefone()[j].getNumero());
                }
                return;
            }
        }
        System.out.println("Contato não encontrado!");
    }
}


Class Contact:

package agenda.de.telefones;

public class Contato {
    private String nome;
    private Telefone[] telefones = new Telefone[5];
    private int qtdTelefones = 0;

    // métodos construtores
    public Contato(String nome2, String t, String tipo) { // eles pedem int para
                                                            // telefone (?)
        this.nome = nome2;
        telefones[0] = new Telefone(t, tipo);
        qtdTelefones++;
    }

    // métodos de acesso aos atributos (getters e setters)
    public String getNome() {
        return nome;
    }

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

    // metodos delegados
    public void mostrarDados() {
        System.out.println("Nome: " + this.nome);
        System.out.println("Telefones:");
        for (Telefone t : telefones) {
            t.mostrarDados();
        }
    }

    public void alterarTelefone(String numero3, String novoNumero3) {
        for (int i = 0; i < telefones.length; i++) {
            if (telefones[i].getNumero().equals(numero3)) {
                telefones[i].setNumero(novoNumero3);
                return;
            }
        }
        System.out.println("Não foi possível alterar, telefone não encontrado.");
    }

    public Telefone[] buscarTelefone() {
        return telefones;
    }

    public int getQtdTelefones() {
        return qtdTelefones;
    }

}


Telephone class:

package agenda.de.telefones;

public class Telefone {
    private String numero;
    private String tipo;

    // métodos de acesso aos atributos (getters e setters)
    public Telefone(String numero1, String tipo1) {
        this.numero = numero1;
        this.tipo = tipo1;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public void mostrarDados() {
        System.out.println("Numero: " + this.numero);
        System.out.println("Tipo: " + this.tipo);
    }
}

Edit:

Here is the method alterarTelefone, class Agenda:

public void alterarTelefone(String nome3, String numero3,
                            String novoNumero3) {
    for (int i = 0; i < contador; i++) {
        if (meusContatos[i].getNome().equals(nome3)) {
            meusContatos[i].alterarTelefone(numero3, novoNumero3);
            return;
        }
    }
    System.out.println("Não foi possível alterar telefone. Contato não encontrado!");
}

He looks for a Contato with that name, and when he finds it, he calls the method alterarTelefone of that object.


As for the method buscarTelefone, he returns a array, that is, multiple phones instead of a specific one - which means that this method is quite simple:

public Telefone[] buscarTelefone() {
    return telefones; // retorna nosso array inteiro
}

See in class Agenda in the method buscarContato how it was used.

(P.S. Had a bug in buscarContato I had to fix.)

1

The exception Null Pointer Exception occurs when you try to access a reference that instead of pointing to an object, is with the value Null.

This occurs when the variable is initialized, we do not use new to create the object to which this variable will reference or not assign any value to it (default is Null) and then try to access its content. And when you try to access something with a value equal to Null will always result in this exception.


As for your second question, to scroll through a java array the simplest way is to use a foreach.

Example of foreach in Java:

import java.util.ArrayList;
import java.util.List;

public class ExemploForeach
{
    public static void main(String[] args)
    {

        List<String> lista = new ArrayList<>();

        lista.add("Banana");
        lista.add("Maçã");
        lista.add("Uva");
        lista.add("Kiwi");        
        lista.add("Pera");
        lista.add("Abacaxi");
        lista.add("Mamão");

        // FOREACH em JAVA
        for(String item : lista)
        {
            System.out.println("Minha salada de frutas tem " + item + "!");
        }        

    }

}

The following example is modified with a method (calls function in structured programming and method in object orientation) returning an Arraylist. You must specify the type of return the method will have on the signature of the same.

import java.util.ArrayList;
import java.util.List;

public class ExemploForeach
{
    public static void main(String[] args)
    {

        //Obs: Método não-estático não pode ser referenciado de contexto
        // estático, por isso dei um new pra criar um objeto dessa mesma
        // classe, mas poderia ter criado outra classe diferente

        ExemploForeach ef = new ExemploForeach();
        List<String> lista = ef.getLista();


        // FOREACH em JAVA
        for(String item : lista)
        {
            System.out.println("Minha salada de frutas tem " + item + "!");
        }        

    }

    public List<String> getLista()
    {

        List<String> lista = new ArrayList<>();

        lista.add("Banana");
        lista.add("Maçã");
        lista.add("Uva");
        lista.add("Kiwi");        
        lista.add("Pera");
        lista.add("Abacaxi");
        lista.add("Mamão");

        return lista;

    }

}
  • Thanks for the explanation and for the example of array with Arraylist, did not know how to use it, and also did not know the foreach, very good! But for a function to return an array, would I just do "list" (using your example code) ? Is that correct ? Again, Thank you!

  • This you said and also specify the return type of the method in the signature of the same. Note that in the example I used an executable class and from main you can not return anything because the class is static and returns void(void). You need to create another class that is not executable, create an object with the new calling the method that returns your list. The signature of a method that returns an Arraylist can be, for example, like this: public List<String> getLista() ? ... } with return of the list at the end as you said. See example in the answer edited just above.

  • Thank you very much! Work was presented, and your comment helped a lot in my learning. Valew! :)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.