Method returning Nullpointerexception (JAVA)

Asked

Viewed 55 times

0

I’m doing an object-oriented exercise, I have a Car object and a Driver object, when I try to assign String name to one of the objects this returning me a Null

    public class Motorista {
            String nome;
            Carro CarroAtual;
    //Construtor   
        public Motorista(String nome)
        {
            this.nome = nome;
        }
    //Método
            public void entrarNoCarro(Carro carro){

            if(carro.motoristaAtual == null){       
            CarroAtual.motoristaAtual.nome = getNome();
            CarroAtual.nome = carro.getNome();
            System.out.println("O motorista " + nome + " entrou no carro " + carro.nome + ".");
        }
            else{
                throw new IllegalArgumentException("Este carro já tem um motorista.");
        }
            if(carro.velocidade != 0){
                throw new IllegalArgumentException("O motorista não pode entrar em um carro em movimento");
            }
        }

Error is on the line CarroAtual.motoristaAtual.nome = getNome();

Código completo //////////////////////////////////////////////////////// Driver Class

    public class Motorista {
        String nome;
        Carro CarroAtual;
//Construtor   
    public Motorista(String nome)
    {
        this.nome = nome;
    }
//Métodos    
    public void entrarNoCarro(Carro carro)
    {        
        if(carro.motoristaAtual == null){   
        CarroAtual.motoristaAtual.nome = getNome();
        CarroAtual.nome = carro.getNome();
        System.out.println("O motorista " + nome + " entrou no carro " + carro.nome + ".");
    }
        else{
            throw new IllegalArgumentException("Este carro já tem um motorista.");
    }
        if(carro.velocidade != 0){
            throw new IllegalArgumentException("O motorista não pode entrar em um carro em movimento");
        }
    }
    public void sairDoCarro(){
        if (CarroAtual.nome == null){
            throw new IllegalArgumentException("Não há um motorista para sair do carro");
        }
        else{
            System.out.println("O motorista" + nome + "saiu do carro");
        }
        if(CarroAtual.velocidade != 0) {
            throw new IllegalArgumentException("O motorista não pode sair de um carro em movimento.");
        }

}
    public String getNome(){
        return nome;
    }
    public String toString() { 
        if(CarroAtual.nome != null) {
            return getNome() + CarroAtual.posicaoX + CarroAtual.posicaoY + CarroAtual.velocidade + CarroAtual.aceleracao;
        }
        else {
          return getNome() + CarroAtual.posicaoX + CarroAtual.posicaoY + CarroAtual.velocidade + CarroAtual.aceleracao; 
        }
    }  
}

Car Class

    public class Carro {  
    String nome;
    int direcao = 0;
    int velocidade = 0;
    int aceleracao = 0;
    int posicaoX = 0;
    int posicaoY = 0;
    Motorista motoristaAtual;
//Construtores           
    public Carro(String nome){
        this.nome = nome;
    }
    public Carro(String nome, int posicaoX, int posicaoY) {
        this.nome = nome;
        this.posicaoX = posicaoX;
        this.posicaoY = posicaoY;
    }
//Métodos    
    public void mover(){
        try {
        if(motoristaAtual.getNome() != null){

        System.out.println("O carro " + nome + " começou a se mover.");
    }
        else{
            throw new IllegalArgumentException("O carro não pode se mover sem um motorista.");
        }
    }
        catch (Exception a) {
            System.out.println(a.getMessage());
        }
    }
    boolean mover(boolean progressivo){
    if(velocidade == 0 && direcao > 0 && motoristaAtual.nome != null){
        direcao = direcao + (+direcao) + (+direcao);
        return true;
    }
    else{
        return false;
    }

    }
    public void acelerar(int incremento) {
        try {
            if(mover(true)) {
                aceleracao = aceleracao + incremento;
            }
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }               
    }
    public void frear(int decremento) {
        try {
            mover();
            aceleracao = aceleracao - decremento;
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }               
    }   
    public void virarAEsquerda() {
        posicaoX = posicaoX - 90;
    }
    public void virarADireita() {
        posicaoX = posicaoX + 90;
    }

    public String getNome() {
        return this.nome;
    }
    public int getVelocidade() {
        return this.velocidade;
    }
    public int getAceleracao() {
        return this.aceleracao;
    }
    public int getPosicaoX() {
        return this.posicaoX;
    }
    public int getPosicaoY() {
        return this.posicaoY;
    }
    public String toString() {
        if (motoristaAtual != null) {
        return (motoristaAtual.getNome()) + posicaoX + posicaoY + velocidade + aceleracao;
        }
        else {
            return nome + posicaoX + posicaoY + velocidade + aceleracao; 
    }
}
    public static void main(String[] args) {
        Carro c1 = new Carro("C1");
        Motorista m1 = new Motorista("M1");
        m1.entrarNoCarro(c1);
    }
}
  • if(car.motoristaAtual == null) entered inside if the variable is null and how is trying to access the name of the motoristaAtual gives this error

  • I didn’t understand, how could I solve?

  • Edith the question and show how you are instantiating the objects in the Main method please, so I can include a more complete answer. Also add the definition of the Car class.

  • Edited..........

2 answers

0


Your problem, as I described in comment is in the non instantiation of the field motoristaAtual and later attempt to assign a name to that driver, but as this driver is not instantiated it has the value of Null.

Your version:

public void entrarNoCarro(Carro carro){

            if(carro.motoristaAtual == null){       
            CarroAtual.motoristaAtual.nome = getNome(); //CarroAtual é null neste momento.
            CarroAtual.nome = carro.getNome(); // Se afetar CarroAtual com carro ambos são o mesmo objeto e não é necessário atribuição do nome.
            System.out.println("O motorista " + nome + " entrou no carro " + carro.nome + ".");
        }
            else{
                throw new IllegalArgumentException("Este carro já tem um motorista.");
        }
            if(carro.velocidade != 0){
                throw new IllegalArgumentException("O motorista não pode entrar em um carro em movimento");
            }
        }

My version:

public void entrarNoCarro(Carro carro)
    {        
        if(carro.motoristaAtual == null){
            CarroAtual = carro; // o CarroAtual to motorista é o carro onde entrou
            CarroAtual.motoristaAtual = this; // O Motorista deste carro é o Motorista que entrou no carro
            System.out.println("O motorista " + nome + " entrou no carro " + carro.nome + ".");
    }
        else{
            throw new IllegalArgumentException("Este carro já tem um motorista.");
    }
        if(carro.velocidade != 0){
            throw new IllegalArgumentException("O motorista não pode entrar em um carro em movimento");
        }
    }

-1

You need to instantiate the Car class ex:

public Driver(String name){ carroAtual = new car();

}

  • From what I noticed you did not prompt the driver class inside the car and is calling the method without instantiating, try to give a System.out.println(Carroatual.motoristaAtual), to check if returns null.

Browser other questions tagged

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