Wątek przeniesiony 2015-06-08 22:09 z Kosz przez Shalom.

NullPointerException ale czemu ?

0

Witam, mam następujący problem z takim programem:

 
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;
import java.awt.Color;

class MyWindowAdapter extends WindowAdapter{
    public void windowClosing(WindowEvent e){
            System.exit(0);
}
}
class FieldThread extends Thread implements Runnable{
    Label[][] lab;
    int px;
    int py;
    int x;
    int y;
    Random rand;
    double k;
    double p;
    
    FieldThread(Label[][] lab, int px, int py,int x,int y, Random rand,int k,double p){
        
        this.lab=lab;
        this.px=px;
        this.py=py;
        this.x=x;
        this.y=y;
        this.rand=rand;
        this.k=k;
        this.p=p;
        start();
        
        }
    public void run(){
        int r,g,b;
        try{sleep(3000);}catch(Exception excep2){}
            while(true){
                try{sleep((long)((rand.nextLong()+0.5)*k));}catch(Exception excep1){}
                if(rand.nextDouble()>=p){
                    lab[x][y].setBackground(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255)));
                }
                else{
                    g=lab[mod(px-1,x)][mod(py-1,y)].getBackground().getGreen()+lab[mod(px+1,x)][mod(py-1,y)].getBackground().getGreen()+lab[mod(px-1,x)][mod(py+1,y)].getBackground().getGreen()+lab[mod(px+1,x)][mod(py+1,y)].getBackground().getGreen();
                    b=lab[mod(px-1,x)][mod(py-1,y)].getBackground().getBlue()+lab[mod(px+1,x)][mod(py-1,y)].getBackground().getBlue()+lab[mod(px-1,x)][mod(py+1,y)].getBackground().getBlue()+lab[mod(px+1,x)][mod(py+1,y)].getBackground().getBlue();
                    r=lab[mod(px-1,x)][mod(py-1,y)].getBackground().getRed()+lab[mod(px+1,x)][mod(py-1,y)].getBackground().getRed()+lab[mod(px-1,x)][mod(py+1,y)].getBackground().getRed()+lab[mod(px+1,x)][mod(py+1,y)].getBackground().getRed();
                    lab[x][y].setBackground(new Color(r,g,b));
                }
            }
    }
/**
     * Liczenie modulo p;
     * @param x podawana liczba
     * @param p modul
     * @return x modulo p
     */
    public static int mod(int x,int p){
        int result=x;
        if(result>=p){
            while(x>p){
                result=result-p;
                }
        }
        else{
            while(result<0){
                result=result+p;
                }
        }
        return result;
    } 
}



import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;
import java.awt.Color;

class MyWindowAdapter extends WindowAdapter{
    public void windowClosing(WindowEvent e){
            System.exit(0);
}
}

class FieldThread extends Thread implements Runnable{
    Label[][] lab;
    int px;
    int py;
    int x;
    int y;
    Random rand;
    double k;
    double p;
    
    FieldThread(Label[][] lab, int px, int py,int x,int y, Random rand,int k,double p){
        
        this.lab=lab;
        this.px=px;
        this.py=py;
        this.x=x;
        this.y=y;
        this.rand=rand;
        this.k=k;
        this.p=p;
        start();
        
        }
    public void run(){
        int r,g,b;
        try{sleep(3000);}catch(Exception excep2){}
            while(true){
                try{sleep((long)((rand.nextLong()+0.5)*k));}catch(Exception excep1){}
                if(rand.nextDouble()>=p){
                    lab[x][y].setBackground(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255)));
                }
                else{
                    g=lab[mod(px-1,x)][mod(py-1,y)].getBackground().getGreen()+lab[mod(px+1,x)][mod(py-1,y)].getBackground().getGreen()+lab[mod(px-1,x)][mod(py+1,y)].getBackground().getGreen()+lab[mod(px+1,x)][mod(py+1,y)].getBackground().getGreen();
                    b=lab[mod(px-1,x)][mod(py-1,y)].getBackground().getBlue()+lab[mod(px+1,x)][mod(py-1,y)].getBackground().getBlue()+lab[mod(px-1,x)][mod(py+1,y)].getBackground().getBlue()+lab[mod(px+1,x)][mod(py+1,y)].getBackground().getBlue();
                    r=lab[mod(px-1,x)][mod(py-1,y)].getBackground().getRed()+lab[mod(px+1,x)][mod(py-1,y)].getBackground().getRed()+lab[mod(px-1,x)][mod(py+1,y)].getBackground().getRed()+lab[mod(px+1,x)][mod(py+1,y)].getBackground().getRed();
                    lab[x][y].setBackground(new Color(r,g,b));
                }
            }
    }
/**
     * Liczenie modulo p;
     * @param x podawana liczba
     * @param p modul
     * @return x modulo p
     */
    public static int mod(int x,int p){
        int result=x;
        if(result>=p){
            while(x>p){
                result=result-p;
                }
        }
        else{
            while(result<0){
                result=result+p;
                }
        }
        return result;
    } 
}
class MyPanel extends Panel{
    int x;
    int y;
    int k;
    double p;
    Random rand;
    Label[][] field;
    FieldThread[][] watek;
    MyPanel(int x, int y, int k, double p){
        this.x=x;
        this.y=y;
        this.k=k;
        this.p=p;
        setLayout(new GridLayout(x,y));
        setBackground(Color.ORANGE);
        field=new Label[x][y];
        for(int i=0;i<x;i=i+1){
            for(int j=0;j<y;j=j+1){
                field[i][j]=new Label();
                field[i][j].setBackground(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255)));
                field[i][j].setPreferredSize(new Dimension(5,5));
                add(field[i][j]);
            }
        }   
        watek= new FieldThread[x][y];
        for(int i=0;i<x;i=i+1){
            for(int j=0;j<y;j=j+1){
             watek[i][j]=new FieldThread(field,i,j,x,y,rand,k,p);
            }
        }
        }

}


Program robi taką jakby wizualizacje kolorów na planszy mxn, jeśli wylosowana liczba jest większa od prawdopodobieństwa p (również zadanego) to zmienia swój kolor na losowy, w przeciwnym razie bierze kolory od sąsiadów(jeśli jest koniec tablicy to pobiera z drugiego końca, tylko wyskoczyły mi pewne problemy przez które nie potrafie przebrnąć:
Exception in thread "main" java.lang.NullPointerException
at MyPanel.<init>(FieldThread.java:105)
at MyApplet.main(MyApplet.java:37)

zatem rozchodzi się o linijki
field[i][j].setBackground(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255)));
oraz
panel=new MyPanel(3,3,1,0.5);

Nie mam pojęcia co i jak, proszę o pomoc!
Pozdrawiam!

0

Zapnij się tam debugerem i zobacz co jest nullem.

0

W jakim sensie sie "zapiąć debuggerem"?

0

niby panel jest null'em, no i args length=0, ale w takiej sytuacji przechodzi automatycznie do linijki :
panel=new MyPanel(3,3,1,0.5);
gdzie powinno mi ten panel przecież stworzyć, a tam jest niby problem. Od razu mówie, że z javy jestem noobem, oraz początkującym programistą.

0

Jejku jej, to robisz "step into" i klikasz dalej aż zobaczysz gdzie wywołujesz metodę na nullu. To jasne że panel będzie nullem zanim nie wywołasz konstruktora. problem jest w konstruktorze właśnie...

0

Tylko, że z tego co klikam nie wywołuje wcale metody na nullu już w samym konstruktorze, tworze pole labeli, no i w forze konstruuje labela, ustalam tam jego rozmiar i kolor, do tego konkretnego co utorzyłem, a przyczepia się o ustawianie koloru tego labela, obojętnie czy zaczynam od rozmiaru czy od koloru, zawsze czepia się o kolor.

0

A jednak czepia się o nextInt'a, Tak jak mówiłem, jestem noobem ... Nie skonstruwałem wpierw Random rand = new Random();
zamiast tego miałem Random rand;
Dzięki za pomoc, już chociaż wiem coś więcej jak się wspomagać debuggerem, Dzięki jeszcze raz za pomoc!

0

Na przyszłość zapamiętaj żeby nie mieć w jednej linijce zbyt wielu "kropek" bo potem masz takie kwiatki jak tutaj, że masz podaną linijkę z wyjątkiem a nadal nie wiesz co jest nie tak bo w tej linijce robisz 100 rzeczy na raz.

0

A macie może pomysł czemu kolor całej planszy zmienia się tylko 1 i to wszystkich w jednej chwili ?

nowszy kod:

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;
import java.awt.Color;

class MyWindowAdapter extends WindowAdapter{
    public void windowClosing(WindowEvent e){
            System.exit(0);
}
}
class FieldThread extends Thread{
    Label[][] lab;
    int px;
    int py;
    int x;
    int y;
    Random rand;
    double k;
    double p;
    
    FieldThread(Label[][] lab, int px, int py,int x,int y, Random rand,int k,double p){
        
        this.lab=lab;
        this.px=px;
        this.py=py;
        this.x=x;
        this.y=y;
        this.rand=rand;
        this.k=k;
        start();
        
        }
    public void run(){
        int r,g,b;
        try{sleep(1000);}catch(Exception excep2){}
            while(true){ 
                try{sleep((long)((rand.nextLong()+0.5)*k));}catch(Exception excep1){}
                if(rand.nextDouble()>=p){
                    r=rand.nextInt(255);
                    g=rand.nextInt(255);
                    b=rand.nextInt(255);
                    setColor(new Color(r,g,b),px,py,lab);
                }
                else{
                    setColor(getColor(x,y,px,py,lab),px,py,lab);
                }
            }
    }
    
    public synchronized void setColor(Color color, int px, int py,Label[][] lab){
        lab[px][py].setBackground(color);
    }
    
    public synchronized Color getColor(int x,int y,int px,int py,Label[][] lab){
        int r,g,b;
        g=lab[mod(px-1,x)][mod(py-1,y)].getBackground().getGreen()+lab[mod(px+1,x)][mod(py-1,y)].getBackground().getGreen()+lab[mod(px-1,x)][mod(py+1,y)].getBackground().getGreen()+lab[mod(px+1,x)][mod(py+1,y)].getBackground().getGreen();
        b=lab[mod(px-1,x)][mod(py-1,y)].getBackground().getBlue()+lab[mod(px+1,x)][mod(py-1,y)].getBackground().getBlue()+lab[mod(px-1,x)][mod(py+1,y)].getBackground().getBlue()+lab[mod(px+1,x)][mod(py+1,y)].getBackground().getBlue();
        r=lab[mod(px-1,x)][mod(py-1,y)].getBackground().getRed()+lab[mod(px+1,x)][mod(py-1,y)].getBackground().getRed()+lab[mod(px-1,x)][mod(py+1,y)].getBackground().getRed()+lab[mod(px+1,x)][mod(py+1,y)].getBackground().getRed();
                    
        
    return new Color(r/4,g/4,b/4);
    }
    
/**
     * Liczenie modulo p;
     * @param x podawana liczba
     * @param p modul
     * @return x modulo p
     */
    public int mod(int x,int p){
        int result=x;
        if(result>=p){
            while(x>=p){
                result=result-p;
                }
        }
        else{
            while(result<0){
                result=result+p;
                }
        }
        return result;
    } 
}
class MyPanel extends Panel{
    int x;
    int y;
    int k;
    double p;
    Random rand=new Random();
    Label[][] field;
    FieldThread[][] watek;
    MyPanel(int x, int y, int k, double p){
        this.x=x;
        this.y=y;
        this.k=k;
        this.p=p;
        setLayout(new GridLayout(x,y));
        setBackground(Color.ORANGE);
        field=new Label[x][y];
        for(int i=0;i<x;i=i+1){
            for(int j=0;j<y;j=j+1){
                field[i][j]=new Label();
                field[i][j].setBackground(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255))); 
                add(field[i][j]);
            }
        }   
        watek= new FieldThread[x][y];
        for(int i=0;i<x;i=i+1){
            for(int j=0;j<y;j=j+1){
             watek[i][j]=new FieldThread(field,i,j,x,y,rand,k,p);
            }
        }
        }

}
import java.applet.*;
import java.awt.*;
class MyApplet extends Applet {
    
    public void init(){
      MyPanel  panel=new MyPanel(Integer.parseInt(getParameter("width")),
                    Integer.parseInt(getParameter("hight")),
                    Integer.parseInt(getParameter("k")),
                    Double.parseDouble(getParameter("p")));
                    add(panel);   
}
    public static void main(String[] args){
        
    int m;
    int n;
    int k;
    double p;
    MyPanel panel;
    try{
        m=Integer.parseInt(args[0]);
        n=Integer.parseInt(args[1]);
        k=Integer.parseInt(args[2]);
        p=Double.parseDouble(args[3]);
        panel=new MyPanel(m,n,k,p);
    }
    catch(Exception x){ 
        panel=new MyPanel(15,15,3,0);  
    }
    
    Frame f=new Frame();
    f.addWindowListener(new MyWindowAdapter());
    f.setBackground(Color.orange);
    f.setLayout(new GridLayout());
    f.add(panel);
    f.pack();
    f.setBounds(500,500,500,500);
    f.setResizable(true);
    f.setVisible(true);
    }
}
 
1

Twoje podejście do programowania to brawura granicząca z głupotą. Program nie działa, a Ty zostawiasz pustą obsługę błędów.

try{sleep((long)((rand.nextLong()+0.5)*k));}catch(Exception excep1){}

Sposób obliczania czasu uśpienia wątku jest bardzo ekstrawagancki: wpierw losujesz liczbę z zakresu [0-9223372036854775807]. ni z gruszki ni z pietruszki dodajesz 0.5. W końcu mnożysz przez 3. W konsekwencji czas uśpienia jest ogromny, a od czasu do czasu jest ujemny bo przekraczasz zakres typu long.

0

wyrandomowałem złą liczbę... miało być (int)(rand.nextInt()+0,5)*k ... Dzięki. Jakoś "ślepo" patrzyłem na kod...

1 użytkowników online, w tym zalogowanych: 0, gości: 1