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

1

Good evening! I'm having a problem with a college work, which is seemingly simple (though I'm very noob in Java, and I do not know what to do!).

I'd like you to help me, I'm getting Null Pointer Exception when calling menu number 3 after creating new contacts. And I also need help to encode the function fetchphones, which has an array as a return (I have no idea how to do this). Thanks in advance for your understanding and help!

PS: Any suggestions will be welcome

packageagenda.de.telefones;importjava.util.Scanner;publicclassControlador_AgendaDeTelefones{publicstaticvoidmain(String[]args){Agendaagenda=newAgenda();Scannerentrada=newScanner(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);
    }    
}
    
asked by anonymous 02.05.2017 / 06:21

2 answers

1

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

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

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

  

Ideally, the Agenda takes care of only Contact objects, which in turn takes care of Phone objects.

So, if you want someone's phone, you 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

You have to remember that your structure is like this, and do not try to "skip steps" when it comes to doing gets / sets of data.

  

I started to modify your code - there are still things to do, but I think you can get an idea of how to go about it.

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

Schedule 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!");
    }
}

Contact Class:
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;
    }

}

Phone 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 alterarTelefone method, of 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!");
}
  

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

As for the buscarTelefone method, it returns a array , that is, several phones instead of a specific one - which means that this method is very simple:
public Telefone[] buscarTelefone() {
    return telefones; // retorna nosso array inteiro
}
  

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

(PS I had a bug in buscarContato that I had to fix.)

    
02.05.2017 / 09:42
1

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

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

As for your second doubt, to walk through an array in java the simplest way is to use a foreach.

Example 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 + "!");
        }        

    }

}

Here is a modified example with a method (function call in structured programming and method in object orientation) returning an ArrayList. You must specify the return type that the method will have on the signature of the method.

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;

    }

}
    
02.05.2017 / 12:01