NullPointerException ale czemu ?

NullPointerException ale czemu ?

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

AR
  • Rejestracja:około 10 lat
  • Ostatnio:około 7 lat
  • Postów:26
0

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

Kopiuj
 
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!

edytowany 3x, ostatnio: Armatorix
Shalom
!Byłby kosz ale na czas edytowałeś post...
AR
Źle mi się wkleiło na starcie, sorka.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Zapnij się tam debugerem i zobacz co jest nullem.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
AR
  • Rejestracja:około 10 lat
  • Ostatnio:około 7 lat
  • Postów:26
0

W jakim sensie sie "zapiąć debuggerem"?

AR
  • Rejestracja:około 10 lat
  • Ostatnio:około 7 lat
  • Postów:26
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ą.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
AR
  • Rejestracja:około 10 lat
  • Ostatnio:około 7 lat
  • Postów:26
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.

AR
  • Rejestracja:około 10 lat
  • Ostatnio:około 7 lat
  • Postów:26
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!

edytowany 2x, ostatnio: Armatorix
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
AR
Staram się z tym walczyć, tak samo z nawiasami...
AR
  • Rejestracja:około 10 lat
  • Ostatnio:około 7 lat
  • Postów:26
0

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

nowszy kod:

Kopiuj
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);
    }
}
 
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
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.

Kopiuj
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
AR
  • Rejestracja:około 10 lat
  • Ostatnio:około 7 lat
  • Postów:26
0

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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)