Avatar billede daliwi Nybegynder
26. november 2005 - 17:00 Der er 7 kommentarer og
1 løsning

Sammenligne to objekter med null-værdi!

Sidder her og arbejder med noget equals i java, og kan det virkelig være sandt at man ikke kan sammenligne to objekter med en nullværdi?

F.eks.
aktivitet a = null;
aktivitet b = null;
if(a.equals(b))

Det resulterer i en NullPointerException

Jeg kan jo ikke benytte == da det udelukkende sammenligner objekternes adresser i lageret.

DaLiWi
Avatar billede mikkelbm Nybegynder
26. november 2005 - 17:02 #1
Hvis de er null har de jo ikke en værdi, og du kan derfor ikke sammenligne dem. Spørg på om en af dem er null inden du laver tjekket.
Avatar billede daliwi Nybegynder
26. november 2005 - 17:05 #2
Ok, men hvis man nu er i gang med at lave en test hvor output bliver sammenlignet med expected output, hvordan hulen klarer man så det, når programmet i visse tilfælde returnerer null!
Avatar billede mikkelbm Nybegynder
26. november 2005 - 17:06 #3
Hvis bare én af værdierne er null, er de jo heller ikke ens. Så:

public boolean checkActivity (aktivitet a, aktivitet b)
{
  if (a == null || b == null)
      return false;

  else return a.equals (b);
}
Avatar billede daliwi Nybegynder
26. november 2005 - 17:15 #4
Nåå, ja selvfølgelig.
Merci!

Har du så også en ide om hvorfor den returner false når jeg opretter to objekter med samme argumenter, og dernæst sammenligner dem med equals?

Activity a = new Activity(5,6)
Activity b = new Activity(5,6)

if(a.equals(b))
Avatar billede mikkelbm Nybegynder
26. november 2005 - 17:18 #5
Fordi objekt referencerne ikke er de samme. Hvis Activity er et objekt du selv har oprettet, skal du overskrive equals metoden, hvis du vil sammenligne på argumenter:

public class Activity
{
  private int a, b;
  public Activity (int a, int b)
  {
      this.a = a;
      this.b = b;
  }

  public boolean equals (Object o)
  {
      Activity temp = (Activity)o;
      return (a == temp.a) && (b == temp.b);
  }
}

På den måde kan du selv bestemme hvad der skal sammenlignes på.
Avatar billede daliwi Nybegynder
26. november 2005 - 17:23 #6
Ok, troede faktisk at equals sammenlignede objekter på deres argumenter og ikke på adressen. Det virker da med to Strings.

Men tak for metoden, den vil jeg arbejde lidt med.
Avatar billede mikkelbm Nybegynder
26. november 2005 - 17:25 #7
Her er equals-metoden fra String-klassen:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }

Som du kan se der, så overskriver de også metoden og sammenligner på de char-værdier der ligger i strengen.
Avatar billede simonvalter Praktikant
26. november 2005 - 18:29 #8
husk altid at override hashCode når du overrider equals. Kontrakten kan ses
her http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#equals(java.lang.Object)

Og forklares bla nærmere i Effective Java af joshua bloch.
Du kan få plugins til en IDE som eclipse der kan genere den for dig, eller finde en commons api fra apache som laver det vha reflection.

her er en som overholder kontrakten:

public class Activity {
    int a,b;

    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        final Activity activity = (Activity) o;

        if (a != activity.a || b !=activity.b) {
            return false;
        }
        return true;
    }

    public int hashCode() {
        int result = a;
        result = 29 * result + b;
        return result;
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester