2012-02-28 138 views
1

我想创建对象的二维数组,但无论我如何创建它,我都会得到空指针异常。我应该如何制作对象数组来让它们工作?这里是我的代码:对象数组 - 空指针异常

Game.java package com.jakob.game1;

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 

import java.awt.Canvas; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 
import java.awt.image.BufferStrategy; 
import java.util.Random; 

import javax.swing.JFrame; 


public class Game extends Canvas implements Runnable, MouseMotionListener{ 
    private static final long serialVersionUID = 1L; 

    public static final int gHeigh = 500; 
    public static final int gWidth = 500; 
    public static final int tHeigh = gHeigh/5; 
    public static final int tWidth = gWidth/5; 
    private boolean running; 
    public Random random; 

    public BufferStrategy b; 
    public Graphics g; 
    public Image bi; 

    public Pixel[][] pixel = new Pixel[tHeigh][tWidth]; 

    private void start(){ 
     running = true; 
     new Thread(this).start(); 
    } 

    public static void main(String args[]){ 
     Game game = new Game(); 

     JFrame frame = new JFrame("Game test"); 
     frame.setLayout(new BorderLayout()); 
     frame.setBounds(0, 0, gHeigh, gWidth); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.add(game, BorderLayout.CENTER); 
     //frame.pack(); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     game.start(); 
    } 

    public void run() { 
     bi = createImage(gHeigh, gWidth); 
     g = bi.getGraphics(); 
     g.setColor(Color.black); 
     g.fillRect(0, 0, gHeigh, gWidth); 
     g.setColor(Color.white); 
     addMouseMotionListener(this); 


     for(int i=0; i<tHeigh; i++){ 
      for(int j=0; j<tWidth; j++){ 
       if(pixel == null){ 
        pixel[i][j] = new Pixel; //No matter what I write here it can't create this 
       } 
      } 
     } 



     if(pixel != null){ 
      for(int i=0; i<tHeigh; i++){ 
       for(int j=0; j<tWidth; j++){ 
        pixel[i][j].setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); 
       } 
      } 
     } 

     while(running){ 
      for(int i=0; i<tHeigh ;i++){ 
       for(int j=0; j<tWidth; j++){ 
        paint(g, i*5, j*5); 
       } 
      } 
     } 
    } 

    public void paint(Graphics g, int x, int y){ 
     g.setColor(pixel[x][y].getColor()); 
     g.fillRect(x, y, 5, 5); 
    } 

    public void mouseDragged(MouseEvent e) { 
     g.fillRect(e.getX()-2, e.getY()-2, 4, 4); 
     repaint(); 
     e.consume(); 
    } 

    public void mouseMoved(MouseEvent e) { 

    } 

    public void update(Graphics g) { 
     g.drawImage(bi, 0, 0, this); 
    } 

    public void paint(Graphics g) { 
     update(g); 
    } 
} 

Pixel.java

package com.jakob.game1; 

import java.awt.Color; 

public class Pixel { 
    private Color color; 

    public Pixel(){ 
     color = new Color(0,0,0); 
    } 

    public void setColor(Color color){ 
     this.color = color; 
    } 

    public Color getColor(){ 
     return this.color; 
    } 
} 
+0

堆栈跟踪在哪里? – 2012-02-28 09:56:53

回答

0

你的条件是错误的

if(pixel == null){ 

这将检查是否像素对象为空或不是因为你已经初始化它[public Pixel[][] pixel = new Pixel[tHeigh][tWidth];]这是不为空。所以如果条件完全没有的话。你应该有:

if(pixel[i][j] == null){ 

在分析引擎收录你的代码后,我发现,现在的错误是不是像素而是random变量。您的代码中尚未初始化random,因此它为空,因此为错误。

+0

仍然不起作用。不管我在那里写什么,我都会遇到错误。 编辑: 我创建对象错误。现在开始工作。 – JakobekS 2012-02-28 10:02:29

+0

@JakobekS现在有什么错误?请注意,您忘记在'pixel [i] [j] = new Pixel'行添加'()'。 – 2012-02-28 10:04:15

+0

现在代码看起来像这样: http://pastebin.com/wcx3fRsn 仍然得到那个错误 – JakobekS 2012-02-28 10:24:02

2

你试过:

if(pixel[i][j] == null){ 
    pixel[i][j] = new Pixel(); 
} 

而实际上你似乎只有一次运行这个循环所以这应该是足够了:

for(int i=0; i<tHeigh; i++){ 
     for(int j=0; j<tWidth; j++){ 
      pixel[i][j] = new Pixel(); 
     } 
    } 

最后我不是一个摇摆的经验rt,但我认为在EDT之外使用GUI并不是一个好主意。

+0

我同意这一点。像素数组本身永远不会为空,因为它在声明时被初始化。 – tom 2012-02-28 09:55:34

0

当你调用

public Pixel[][] pixel = new Pixel[tHeigh][tWidth]; 

你只会得到包含空值像素对象的数组。您需要使用有效的Pixel对象来填充它才能使用它。希望这可以帮助。

0

像素不为空,因此pixel == null

if(pixel == null){ 
    pixel[i][j] = new Pixel; //No matter what I write here it can't create this 
} 

永远评估为true。只是摆脱它。