Avatar billede martin_t Nybegynder
13. december 2003 - 21:13 Der er 19 kommentarer og
1 løsning

Postnummermodul i java-program - NullPointerException

Jeg er ved at lave at program i Java. Til at støtte programmet har jeg en pakke hvori der ligger et postnummer-modul jeg selv har skrevet og ved virker.

Når brugeren indtaster et postnr i GUI'en fanger en actionlistener indtastningen og giver postnummeret videre som en string til metoden i postnummermodulet som burde returnere en string med byens navn.

Men det sker bare ikke! Der opstår i stedet en NullPointerException...

Herunder er min actionlistener:

    //-----------------------------------------------------------------
    // Ved indtastning i postnr-tekstfeltet.
    // Udfra postnummeret findes den tilhørende by.
    //-----------------------------------------------------------------
    private class PostnrfeltLytter implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {   
            String indtastetPostnr = postnummer.getText();
            System.out.println("" + indtastetPostnr);         
            try
            {
                String fundetBynavn = postnrdatabase.findBynavn(indtastetPostnr);
            }
            catch (NullPointerException e)
            {
                System.out.println("" + e);
            }
            by.setText(fundetBynavn);
             
        }
    }
Avatar billede repsak Nybegynder
13. december 2003 - 21:15 #1
en hjælp kan være at lave en masse system.out.println's for at finde specifikt ud af hvad der er fejlen
Avatar billede martin_t Nybegynder
13. december 2003 - 21:17 #2
Ja, men det har jeg gjort. Helt konkret går det galt i linien:
String fundetBynavn = postnrdatabase.findBynavn(indtastetPostnr);
Avatar billede erikjacobsen Ekspert
13. december 2003 - 21:19 #3
Du kan have glemt at sige new til din postnrdatabase
Avatar billede arne_v Ekspert
13. december 2003 - 21:19 #4
Er postnrbase initialiseret som den skal ?

Prøv at udskrive den.
Avatar billede _carsten Nybegynder
13. december 2003 - 21:20 #5
Prøv lige den her

            {
                String fundetBynavn = postnrdatabase.findBynavn(indtastetPostnr);
                by.setText(fundetBynavn);
            }
            catch (NullPointerException e)
            {
                System.out.println("" + e);
            }
Avatar billede repsak Nybegynder
13. december 2003 - 21:21 #6
martin -> ja, men i den linje indgår både postnrdatabase-referencen (som erik siger) og indtastetPostnr
Hvor går det galt? -af din kode fremgår det ikke hvor postnrdatabase bliver initialiseret
Avatar billede _carsten Nybegynder
13. december 2003 - 21:22 #7
Hvis postnr ikke findes i databasen returneres formentlig null og
fundetBynavn bliver ikke initieret
Avatar billede arne_v Ekspert
13. december 2003 - 21:23 #8
Carsten har fat i noget meget mystisk !

fundetBynavn vil jo ikke engang være i scope d.v.s. burde give en compile
fejl !
Avatar billede _carsten Nybegynder
13. december 2003 - 21:24 #9
Det var så gu da noget sludder jeg skrev

Sådan
if(fundetBynavn != null)
    by.setText(fundetBynavn);
Avatar billede martin_t Nybegynder
13. december 2003 - 21:28 #10
Her er min kode set i mere sammenhængende perspektiv. Uvæsentlig kode er udeladt:

import mam.Postnr;

public class OpretMedlemUI extends JPanel
{

private Postnr postnrdatabase;
 
public OpretMedlemUI()
{
Postnr postnrdatabase = new Postnr();       
    }
    private class PostnrfeltLytter implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
           
            String fundetBynavn;
            String indtastetPostnr = postnummer.getText();
            System.out.println("Postnr " + indtastetPostnr);         
            try
            {
                fundetBynavn = postnrdatabase.findBynavn(indtastetPostnr );
        by.setText(fundetBynavn);
            }
            catch (NullPointerException e)
            {
                System.out.println("" + e);
            }
            by.setText(fundetBynavn);
             
        }
    }
Avatar billede repsak Nybegynder
13. december 2003 - 21:30 #11
public OpretMedlemUI()
{
postnrdatabase = new Postnr();       
    }
Avatar billede repsak Nybegynder
13. december 2003 - 21:31 #12
fjern "Postnr" ellers får du ikke fat i den ønskede attribut
Avatar billede arne_v Ekspert
13. december 2003 - 21:31 #13
Det må være det. En lokal variabel som skygger for en instans variabel.
Avatar billede repsak Nybegynder
13. december 2003 - 21:32 #14
"public OpretMedlemUI()"
hvorfor har metoden ikke en returtype?
Avatar billede conrad Nybegynder
13. december 2003 - 21:34 #15
er by initialiseret?
Avatar billede repsak Nybegynder
13. december 2003 - 21:34 #16
argn det er jo din konstruktør - det var bare svært at se pga. parenteserne
Avatar billede arne_v Ekspert
13. december 2003 - 21:35 #17
repsak>

kig lige på klasse navnet
Avatar billede martin_t Nybegynder
13. december 2003 - 21:37 #18
Nu virker det! Tak for jeres hjælp alle sammen. Herunder er den endelige kode som virker.

import mam.Postnr;

public class OpretMedlemUI extends JPanel
{

private Postnr postnrdatabase;
 
public OpretMedlemUI()
{
postnrdatabase = new Postnr();       
    }
    private class PostnrfeltLytter implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
           
            String fundetBynavn;
            String indtastetPostnr = postnummer.getText();
            System.out.println("Postnr " + indtastetPostnr);         
            try
            {
                fundetBynavn = postnrdatabase.findBynavn(indtastetPostnr );
        by.setText(fundetBynavn);
            }
            catch (NullPointerException e)
            {
                System.out.println("" + e);
            }
            by.setText(fundetBynavn);
             
        }
    }
Avatar billede arne_v Ekspert
13. december 2003 - 21:38 #19
Du kan slette den sidste by.setText
Avatar billede martin_t Nybegynder
13. december 2003 - 21:46 #20
Her har jeg lige optimeret koden lidt og fjernet det unødvendige.

import mam.Postnr;

public class OpretMedlemUI extends JPanel
{
private Postnr postnrdatabase;
 
public OpretMedlemUI()
{
postnrdatabase = new Postnr();       
    }
    private class PostnrfeltLytter implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            String indtastetPostnr = postnummer.getText();       
            String fundetBynavn = postnrdatabase.findBynavn(indtastetPostnr );
            by.setText(fundetBynavn);             
        }
    }
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