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

NullPointerException ale czemu ?

2015-06-08 21:57
Armatorix
0

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

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

public void windowClosing(WindowEvent e){
System.exit(0);
}
}
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.WindowEvent;
import java.util.Random;
import java.awt.Color;

public void windowClosing(WindowEvent e){
System.exit(0);
}
}

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;
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));
}
}
for(int i=0;i<x;i=i+1){
for(int j=0;j<y;j=j+1){
}
}
}

}
``````

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ąć:
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, 2015-06-08 22:00
Byłby kosz ale na czas edytowałeś post... - Shalom 2015-06-08 22:08
Źle mi się wkleiło na starcie, sorka. - Armatorix 2015-06-08 22:39

Pozostało 580 znaków

2015-06-08 22:12
Shalom
0

Zapnij się tam debugerem i zobacz co jest nullem.

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-06-08 22:25
Armatorix
0

W jakim sensie sie "zapiąć debuggerem"?

2015-06-08 23:17
Armatorix
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ą.

Pozostało 580 znaków

2015-06-08 23:28
Shalom
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...

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-06-08 23:51
Armatorix
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.

Pozostało 580 znaków

2015-06-08 23:59
Armatorix
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, 2015-06-09 00:04

Pozostało 580 znaków

2015-06-09 00:27
Shalom
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.

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Staram się z tym walczyć, tak samo z nawiasami... - Armatorix 2015-06-09 12:23

Pozostało 580 znaków

2015-06-09 12:25
Armatorix
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.WindowEvent;
import java.util.Random;
import java.awt.Color;

public void windowClosing(WindowEvent e){
System.exit(0);
}
}
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;
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)));
}
}
for(int i=0;i<x;i=i+1){
for(int j=0;j<y;j=j+1){
}
}
}

}
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")));
}
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.setBackground(Color.orange);
f.setLayout(new GridLayout());
f.pack();
f.setBounds(500,500,500,500);
f.setResizable(true);
f.setVisible(true);
}
}
``````

Pozostało 580 znaków

2015-06-09 18:50
bogdans
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.

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2015-06-09 19:10
Armatorix
0

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

Pozostało 580 znaków