Jump to content
rikardinhuh

if marado

Recommended Posts

rikardinhuh

boas, estou aqui com um problema, que me esta a intrigar bastante:

public class Professional extends Person {

    private Vehicle[] vehicles;

    Professional(String name, int age, Letter.LetterType lettertype) {
        super(name, age, lettertype, Person.PersonType.PRO);
        this.vehicles = new Vehicle[3];
    }

    public void parkVehicle(Vehicle vehicle) {
        boolean empty = false;

        for (int i = 0; i < vehicles.length; i++) {
            if ((vehicles[i] == null) && (!empty)) {
                vehicles[i] = vehicle;
                empty = true;
            }
        }
    }

    public void unparkVehicle(String platenr) {
        
        for (int i = 0; i < vehicles.length; i++) {
            if (vehicles[i].getPlatenr().equals(platenr) ) {
                System.out.println(vehicles[i].getPlatenr());
                vehicles[i] = null;
            }
        }
    }

e dá-me este erro:

at TransporterPackage.Professional.unparkVehicle(Professional.java:34)

        at TransporterPackage.TransporterApp.main(TransporterApp.java:35)

ou seja está-me a dar erro nesta linha :

if (vehicles[i].getPlatenr().equals(platenr) )

O problema é que ja fiz isto e resultou varias vezes, mas como e a primeira que uso com super class... Nao sei, mas estou deveras irritado :cheesygrin:

obrigado cumps

Share this post


Link to post
Share on other sites
Anusko

Se puderes dar mais informação sobre a excepção torna-se mais fácil ajudar-te. Mas algo me diz que deve ser uma NullPointerException... experimenta lá assim:

public class Professional extends Person {

    private Vehicle[] vehicles;

    Professional(String name, int age, Letter.LetterType lettertype) {
        super(name, age, lettertype, Person.PersonType.PRO);
        this.vehicles = new Vehicle[3];
    }

    public void parkVehicle(Vehicle vehicle) {
        for (int i = 0; i < vehicles.length; i++) {
            if (vehicles[i] == null) {
                vehicles[i] = vehicle;
                break;
            }
        }
    }

    public void unparkVehicle(String platenr) {
        
        for (int i = 0; i < vehicles.length; i++) {
            if (vehicles[i] != null && vehicles[i].getPlatenr().equals(platenr) ) {
                System.out.println(vehicles[i].getPlatenr());
                vehicles[i] = null;
            }
        }
    }

Share this post


Link to post
Share on other sites
rikardinhuh

hum resultou, e acho que percebi, apenas as variaveis de instancia sao iniciazadas a null, sendo assim aquelas variaveis nao sao da instancia logo nao foram inicializadas a null...

Está o meu pensamento correcto? muito obrigado ;D

Share this post


Link to post
Share on other sites
Anusko

A tua conclusão está correcta mas não é o teu problema. As variáveis de instância são de facto inicializadas a null (ou com o valor por omissão caso sejam dum tipo primitivo). As variáveis locais não (pq só contam para o espaço a alocar na stack pelo método, mas não vale a pena entrar em muito detalhe). Um array, quando é alocado, também é inicializado.

O problema no teu código é, pegando no caso de uso:

parkVehicle(...);
unparkVehicle(...);

A chamada ao parkVehicle() vai meter o vehicle na primeira posição livre do array (a posição 0). Quando o unparkVehicle() é invocado, ele está a iterar o array todo. Ora enquanto a primeira posição tem a referência para um objecto, a segunda e a terceira estão a null e tu estás a tentar invocar métodos sobre null quando fazes

vehicles[i].getPlatenr().equals(platenr)

porque o

vehicles[i]

quando o i é 1 ou 2 avalia como null. Daí teres que verificar primeiro se a posição está ou não com o valor null. Como o tens garantias da ordem da avaliação (da esquerda para a direita) e como o Java faz short-circuiting evaluation, se

vehicles[i] != null

então

vehicles[i].getPlatenr().equals(platenr)

não chega ser executado.

Faz sentido?

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.