Avatar billede dn666 Nybegynder
19. december 2007 - 16:58 Der er 10 kommentarer og
1 løsning

Hvorfor NullPointerException

Når jeg fyrer nedenstående kode af forventer jeg at der bliver returneret null.

Men.... der bliver smidt en NullPointerException, er der en fed forklaring på det ?
er det noget autoboxing der snubler ?


public class Test {

    public static void main(String[] args) {
        Test t = new Test();
        t.getId();
    }

    public Integer getId() {
        int id = 0;
        Integer id9 = null;

        return id == 0 ? id9 : id;
    }
}
Avatar billede arne_v Ekspert
19. december 2007 - 17:10 #1
return id == 0 ? id9 : new Integer(id);

virker, saa jeg gaetter paa at den forsoeger at lave:

return new Integer(id == 0 ? id9.intValue() : id);
Avatar billede _carsten Nybegynder
19. december 2007 - 17:12 #2
Integer id9 - betyder at du erklærer en reference til et OBJECT, men du sætter reference = null, altså peger din reference IKKE til et object, men ud i det blå == ingenting, derfor får du en NullPointerException
Avatar billede arne_v Ekspert
19. december 2007 - 17:13 #3
jep

javap -c giver:

Compiled from "Test.java"
public class december.Test extends java.lang.Object{
public december.Test();
  Code:
  0:  aload_0
  1:  invokespecial  #8; //Method java/lang/Object."<init>":()V
  4:  return

public static void main(java.lang.String[]);
  Code:
  0:  new    #1; //class december/Test
  3:  dup
  4:  invokespecial  #16; //Method "<init>":()V
  7:  astore_1
  8:  aload_1
  9:  invokevirtual  #17; //Method getId:()Ljava/lang/Integer;
  12:  pop
  13:  return

public java.lang.Integer getId();
  Code:
  0:  iconst_0
  1:  istore_1
  2:  aconst_null
  3:  astore_2
  4:  iload_1
  5:  ifne    15
  8:  aload_2
  9:  invokevirtual  #24; //Method java/lang/Integer.intValue:()I
  12:  goto    16
  15:  iload_1
  16:  invokestatic    #30; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  19:  areturn

}
Avatar billede dn666 Nybegynder
19. december 2007 - 17:49 #4
Ja det er jo ikke til at ta' fejl af.
Arne du fortjener et svar for den!

Det sker også hvis man har en metode der tager en int men man giver en null Integer ind.

at koden i sig selv ser ok ud gør jo at man tænker lidt over hvordan de gæve folk hos sun har fundet på at implementeret det...



Hehe Carsten. jo den er jeg rendt ind i en gang imellem, at der findes objekter der peger ud i det blå. ;)

/David..
Avatar billede _carsten Nybegynder
19. december 2007 - 17:58 #5
Selvfølgelig findes der objekter der peger ud i det blå, men så er det vel heller ikke unaturligt de giver en NullPointerException
Avatar billede arne_v Ekspert
19. december 2007 - 18:05 #6
Det er helt naturlig at o.m() giver en NPE hvis o er null, men der kaldes jo ikke
nogen metode paa id9 i source coden. Det goer der saa behind the scene, hvilket giver problemet.
Avatar billede arne_v Ekspert
19. december 2007 - 18:07 #7
og for dem som ikke laeser JVM kode saa er den udfoerte kode altsaa:

return Integer.valueOf(id == 0 ? id9.intValue() : id));
Avatar billede arne_v Ekspert
19. december 2007 - 18:08 #8
og et svar
Avatar billede _carsten Nybegynder
19. december 2007 - 18:21 #9
Ja Arne - men er vi så ikke tilbage igen, up front kaldes ingen metode, men behind !?
Avatar billede arne_v Ekspert
19. december 2007 - 18:46 #10
Jo.

Som jeg opfattede spoergsmaalet spurgte dn66 netop om hvor/hvordan det kald skete.
Avatar billede _carsten Nybegynder
19. december 2007 - 18:52 #11
Tjaaa - tjoo, sikkert rigtigt nok, om ikke andet er spm. udtømmende forklaret :)
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