Avatar billede tingholm Mester
21. februar 2003 - 20:00 Der er 17 kommentarer og
1 løsning

Hvorfor går det ned med en NullPointerException ??

Hvad kan jeg sige ?? her er koden, hvad går galt.
Det skal være et lille spil hvor man flytter rundt på 24 brikker på 25 pladser hvor man så kan flytte til den tomme plads ind til brikkerne står i rækkefølge !!

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

class knap extends JButton
{
    private int vaerdi;
    private JButton knp;
   
    public knap(int vd)
    {
        vaerdi = vd;
        if (vd != 0) knp = new JButton(""+vd);
        if (vd == 0) knp = new JButton("");
    }
   
    public int getVaerdi()
    { return vaerdi; }
}

       
public class spil extends JFrame implements ActionListener
{
    private final int str = 5;
    knap kn[][] = new knap[str][str];
    JButton cmdBland = new JButton("Nyt spil");
    JButton cmdLuk = new JButton("Luk Spillet");
    int tryk = 0;
   
    public static void main (String [] args)
    {
        new spil();
    }
   
    public spil()
    {
        super("Spil");
        setSize(str*50,str*50+50);
        setVisible(true);
        setResizable(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container cont = getContentPane();
        cont.setLayout(new GridLayout(str,str+1));
        for (int i = 0; i<str; i++)
        {
            for (int j = 0; j<str; j++)
            {
                cont.add(kn[i][j]);
                kn[i][j].addActionListener(this);
            }
        }
        cont.add(cmdBland);
        cmdBland.addActionListener(this);
        int tom =0;
        do
        {
            cont.add(new JLabel());
            tom++;
        }
        while (str-2>tom);
        cont.add(cmdLuk);
        cmdLuk.addActionListener(this);
    }
   
    public void start()
    {
        System.out.println("start");
        int n = 0;
        for (int i = 0; i<str; i++)
        {
            for (int j = 0; j<str; j++)
            {
                kn[i][j] = new knap(n);
                n++;
            }
        }
        bland();
    }
   
    public void bland()
    {
        System.out.println("bland");
        knap k1;
        int t1 = 0;
        int t2 = 0;
        int t3 = 0;
        int t4 = 0;
        Random rand = new Random ();
        for (int i = 0; i<(100*str); i++)
        {
            t1 = rand.nextInt(str);
            t2 = rand.nextInt(str);
            t3 = rand.nextInt(str);
            t4 = rand.nextInt(str);
            k1 = kn[t1][t2];
            kn[t1][t2] = kn[t3][t4];
            kn[t3][t4] = k1;
        }
    }
   
    public void slut()
    {
        for (int i = 0; i<str; i++)
        {
            for (int j = 0; j<str; j++)
            {
                if (kn[i][j].getVaerdi() != (i+5*j-5)) return;
            }
        }
        JOptionPane.showMessageDialog(this, "Du har vundet på " + tryk + " træk", "Du vandt", JOptionPane.PLAIN_MESSAGE);       
    }
   
    public boolean lovlig(knap k1)
    {
        System.out.println("lovlig");
        for (int i = 0; i<str; i++)
        {
            for (int j = 0; j<str; j++)
            {
                if (kn[i][j].getVaerdi() == k1.getVaerdi()) break;
                {
            }                if (kn[i+1][j].getVaerdi() == 0) return true;
                            if (kn[i-1][j].getVaerdi() == 0) return true;
                            if (kn[i][j+1].getVaerdi() == 0) return true;
                            if (kn[i][j-1].getVaerdi() == 0) return true;
            }
        }
        System.out.println("false");
        return false;
    }
   
    public void ulovlig()
    {
        JOptionPane.showMessageDialog(this, "Ulovligt træk", "Fejl", JOptionPane.ERROR_MESSAGE);
    }
   
    public void actionPerformed(ActionEvent e)
    {
        knap k2;
        if (e.getSource() == cmdLuk) this.dispose();
        if (e.getSource() == cmdBland) bland();
        for (int i = 0; i<str; i++)
        {
            for (int j = 0; j<str; j++)
            {
                if (e.getSource() == kn[i][j])
                {
                    if (lovlig(kn[i][j]))
                    {
                        k2 = kn[i][j];
                        for (int k = 0; k<str; k++)
                        {
                            for (int l = 0; l<str; l++)
                            {
                                if (kn[k][l].getVaerdi() == 0)
                                {
                                    kn[i][j] = kn[k][l];
                                    kn[k][l] = k2;
                                }
                            }
                        }
                        tryk++;
                        slut();
                    }
                    else ulovlig();
                }
            }
        }
       
    }
}
Avatar billede c971572 Nybegynder
21. februar 2003 - 20:02 #1
øhh, hvilken linie kommer nullpex i?
Avatar billede riversen Nybegynder
21. februar 2003 - 20:07 #2
kan godt ske det er mig, men fylder du overhovedet noget i kn[][] før du begynder på

for (int i = 0; i<str; i++)
        {
            for (int j = 0; j<str; j++)
            {
                cont.add(kn[i][j]);
                kn[i][j].addActionListener(this);
            }
        }
Avatar billede arne_v Ekspert
21. februar 2003 - 20:17 #3
De bliver jo initialiseret i start metode, som ikke bliver kaldt !?
Avatar billede riversen Nybegynder
21. februar 2003 - 20:19 #4
det er jo det.
Avatar billede arne_v Ekspert
21. februar 2003 - 20:22 #5
Og hvis man kalder start i spil constructor inden den løkke, så får man ikke
noge null pointer exception.

Men app'en virker dog ikke helt alligevel.
Avatar billede riversen Nybegynder
21. februar 2003 - 20:23 #6
jeg har også lidt bøvl med gui'en...jeg skal resize før knapperne kan ses
Avatar billede arne_v Ekspert
21. februar 2003 - 20:24 #7
Med en:
  pack();
  setVisible(true);
sidst i constructoren begynder man at kunne se noget.
Avatar billede arne_v Ekspert
21. februar 2003 - 20:25 #8
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class spil extends JFrame implements ActionListener {
    private final int str = 5;
    knap kn[][] = new knap[str][str];
    JButton cmdBland = new JButton("Nyt spil");
    JButton cmdLuk = new JButton("Luk Spillet");
    int tryk = 0;

    public static void main(String[] args) {
        new spil();
    }

    public spil() {
        super("Spil");
        start();
        setSize(str * 50, str * 50 + 50);
        setVisible(true);
        setResizable(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container cont = getContentPane();
        cont.setLayout(new GridLayout(str, str + 1));
        for (int i = 0; i < str; i++) {
            for (int j = 0; j < str; j++) {
                cont.add(kn[i][j]);
                kn[i][j].addActionListener(this);
            }
        }
        cont.add(cmdBland);
        cmdBland.addActionListener(this);
        int tom = 0;
        do {
            cont.add(new JLabel());
            tom++;
        } while (str - 2 > tom);
        cont.add(cmdLuk);
        cmdLuk.addActionListener(this);
        pack();
        setVisible(true);
    }

    public void start() {
        System.out.println("start");
        int n = 0;
        for (int i = 0; i < str; i++) {
            for (int j = 0; j < str; j++) {
                kn[i][j] = new knap(n);
                n++;
            }
        }
        bland();
    }

    public void bland() {
        System.out.println("bland");
        knap k1;
        int t1 = 0;
        int t2 = 0;
        int t3 = 0;
        int t4 = 0;
        Random rand = new Random();
        for (int i = 0; i < (100 * str); i++) {
            t1 = rand.nextInt(str);
            t2 = rand.nextInt(str);
            t3 = rand.nextInt(str);
            t4 = rand.nextInt(str);
            k1 = kn[t1][t2];
            kn[t1][t2] = kn[t3][t4];
            kn[t3][t4] = k1;
        }
    }

    public void slut() {
        for (int i = 0; i < str; i++) {
            for (int j = 0; j < str; j++) {
                if (kn[i][j].getVaerdi() != (i + 5 * j - 5))
                    return;
            }
        }
        JOptionPane.showMessageDialog(
            this,
            "Du har vundet på " + tryk + " træk",
            "Du vandt",
            JOptionPane.PLAIN_MESSAGE);
    }

    public boolean lovlig(knap k1) {
        System.out.println("lovlig");
        for (int i = 0; i < str; i++) {
            for (int j = 0; j < str; j++) {
                if (kn[i][j].getVaerdi() == k1.getVaerdi())
                    break;
                {
                }
                if (kn[i + 1][j].getVaerdi() == 0)
                    return true;
                if (kn[i - 1][j].getVaerdi() == 0)
                    return true;
                if (kn[i][j + 1].getVaerdi() == 0)
                    return true;
                if (kn[i][j - 1].getVaerdi() == 0)
                    return true;
            }
        }
        System.out.println("false");
        return false;
    }

    public void ulovlig() {
        JOptionPane.showMessageDialog(
            this,
            "Ulovligt træk",
            "Fejl",
            JOptionPane.ERROR_MESSAGE);
    }

    public void actionPerformed(ActionEvent e) {
        knap k2;
        if (e.getSource() == cmdLuk)
            this.dispose();
        if (e.getSource() == cmdBland)
            bland();
        for (int i = 0; i < str; i++) {
            for (int j = 0; j < str; j++) {
                if (e.getSource() == kn[i][j]) {
                    if (lovlig(kn[i][j])) {
                        k2 = kn[i][j];
                        for (int k = 0; k < str; k++) {
                            for (int l = 0; l < str; l++) {
                                if (kn[k][l].getVaerdi() == 0) {
                                    kn[i][j] = kn[k][l];
                                    kn[k][l] = k2;
                                }
                            }
                        }
                        tryk++;
                        slut();
                    } else
                        ulovlig();
                }
            }
        }

    }
}

class knap extends JButton {
    private int vaerdi;
    private JButton knp;

    public knap(int vd) {
        vaerdi = vd;
        if (vd != 0)
            knp = new JButton("" + vd);
        if (vd == 0)
            knp = new JButton("");
    }

    public int getVaerdi() {
        return vaerdi;
    }
}
Avatar billede riversen Nybegynder
21. februar 2003 - 20:26 #9
lægger lige et svar :-)
Avatar billede riversen Nybegynder
21. februar 2003 - 20:26 #10
og det kommer så her.
Avatar billede riversen Nybegynder
21. februar 2003 - 20:29 #11
der er nu 2 setVisible( true ) i konstruktøren :-)
Avatar billede tingholm Mester
21. februar 2003 - 20:29 #12
det er rigtigt !! *pling* der gik et lys op....
riversen gidder du lave et svar så jeg kan give dig point ??
Avatar billede arne_v Ekspert
21. februar 2003 - 20:30 #13
Også mig.
Avatar billede riversen Nybegynder
21. februar 2003 - 20:30 #14
huske lige arne også
Avatar billede arne_v Ekspert
21. februar 2003 - 20:31 #15
riversen>

Du har ret. Der var allerede en setVisible. Jeg er bare vant til
at den komemr til sidst.
Avatar billede arne_v Ekspert
21. februar 2003 - 20:32 #16
Det var kun pack() der manglede.
Avatar billede tingholm Mester
21. februar 2003 - 21:00 #17
kan man ikke tilføje en tekst til en JBUTTON efter den er oprettet ??
Avatar billede arne_v Ekspert
21. februar 2003 - 21:04 #18
Det skulle setText metoden gerne kunne gøre.
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