2017-07-18 9 views
3

現在、Javaで書かれたゲームで作業しているレベルを選択するには、ワールドを選択してレベルを選択する必要があります。 これはJFrames、JPanels、およびJButtonを使用しています。ゲームを起動すると、WorldSelectionクラスの新しいインスタンスが作成され、ボタンを押すと、選択したワールドが設定され、LevelSelectionの新しいインスタンスが作成されます。ボタンを押すとレベルが設定されます。私のゲームのクラスで変数が値を持っていてもJava NullPointerException

、私の更新方法を選択した世界とレベル60回をチェック:これは私の問題である私の初めてここに投稿しているので、私のポストを改善する方法についてのアドバイスが理解される:)

ここ

を両方とも選択された値を持つ場合は、ステージ/レベルの新しいインスタンスを作成します。レベルを設定するためにボタンを押した瞬間に、値がチェックされていても、NullPointerExceptionが発生します。そして、これはすべての時間、それが動作する時間の半分、例外がスローされない、他の50%例外がスローされます発生しません。ここで

Exception in thread "main" java.lang.NullPointerException 
at Game.update(Game.java:41) 
at Game.run(Game.java:23) 
at Game.start(Game.java:34) 
at Game.<init>(Game.java:10) 
at Game.main(Game.java:77) 

は私のコードです:

ゲームクラス:

public class Game { 
private boolean running; 
private WorldSelection ws; 
private boolean chosen = false; 

public Game() { 
    ws = new WorldSelection(); 
    start(); 
} 

public void run() {    // game loop 
    long lastTime = System.nanoTime(); 
    long timer = System.currentTimeMillis(); 
    final double ns = 1000000000.0/60.0; 
    double delta = 0; 
    while (running) { 
     long now = System.nanoTime(); 
     delta += (now - lastTime)/ns; 
     lastTime = now; 
     while (delta >= 1) { 
      update(); 
      delta--; 
     } 
     if (System.currentTimeMillis() - timer == 1000) { 
      timer += 1000; 
     } 
    } 
} 

public void start() { 
    running = true; 
    run(); 
} 

private void update() { 

    if (!chosen) { 
     if (ws.getWorld() == 1) { 
      if (ws.ls.getLevel() == 1) { 
       chosen = true; 
       //creates new stage here 
      } 
      if (ws.ls.getLevel() == 2) { 
       chosen = true; 
       //creates new stage here 
      } 
      if (ws.ls.getLevel() == 3) { 
       chosen = true; 
       //creates new stage here 
      } 
     } 

     else if (ws.getWorld() == 2) { 
      if (ws.ls.getLevel() == 1) { 
       chosen = true; 
       //creates new stage here 
      } 
      if (ws.ls.getLevel() == 2) { 
       chosen = true; 
       //creates new stage here 
      } 
      if (ws.ls.getLevel() == 3) { 
       chosen = true; 
       //creates new stage here 
      } 
     } 
    } 
    else { 
     //game updates here 
    } 

} 

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

} 

WorldSelectionクラス:

import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class WorldSelection implements ActionListener { 
public JFrame frame; 
private int width, height; 
private int world = 0; 
private JButton button1; 
public LevelSelection ls; 
private JPanel panel; 

public WorldSelection() { 

    this.width = 900; 
    this.height = 506; 
    frame = new JFrame(); 
    frame.setSize(width, height); 
    frame.setResizable(false); 
    frame.setTitle("Quentins Adventure"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 

    panel = new JPanel(); 
    panel.setBackground(Color.black); 

    button1 = new JButton("World 1"); 
    button1.setBackground(Color.LIGHT_GRAY); 
    button1.setSize(120, 44); 
    button1.setLocation(80, 350); 
    button1.addActionListener(this); 

    panel.add(button1); 

    frame.add(panel); 

    frame.setVisible(true); 
} 

public void actionPerformed(ActionEvent e) { 
    if(e.getSource() == button1){ 
     setWorld(1); 
     ls = new LevelSelection(235,268); 
     frame.setVisible(false); 
    } 
} 

public int getWorld() { 
    return world; 
} 

public void setWorld(int world) { 
    this.world = world; 
} 
} 

LevelSelectionクラス:

import java.awt.Color; 
import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class LevelSelection implements ActionListener { 
    public JFrame frame; 
    private int width, height, buttonSize = 50; 
    private int level = 0; 
    private JButton button1; 
    private Font font; 
    private JPanel panel; 


public LevelSelection(int bPosX,int bPosY) { 


     this.width = 900; 
     this.height = 506; 
     frame = new JFrame(); 
     frame.setSize(width, height); 
     frame.setResizable(false); 
     frame.setTitle("Quentins Adventure - Wold Selection"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 

     panel = new JPanel(); 
     panel.setBackground(Color.black); 

     button1 = new JButton("1"); 
     button1.setBackground(Color.LIGHT_GRAY); 
     button1.setFont(font); 
     button1.setSize(buttonSize, buttonSize); 
     button1.setLocation(bPosX, bPosY); 
     button1.addActionListener(this); 

     panel.add(button1); 

     frame.add(panel); 
     frame.setVisible(true); 
    } 


@Override 
public void actionPerformed(ActionEvent e) { 
    if(e.getSource() == button1){ 
     setLevel(1); 
     frame.dispose(); 
    } 
    } 


public int getLevel() { 
    return level; 
} 


public void setLevel(int level) { 
    this.level = level; 
} 

} 
あなたの助けのためのの

感謝:)

+1

NPEが発生する行のコードを強調表示できますか? –

+0

'ws'の' ls'値をどこで初期化しましたか?btw、この種の例外を避けるためにメソッドを使う前に、オブジェクトがヌルかどうかを調べるべきです。 –

答えて

6

あなたsetWorld、その後ls = new LevelSelection(235, 268);

を行うにはモーメントがws.getWorld() == 1が真である時に存在することを意味するが、ws.lsnullです。

しかし、あなたのコードだけではありません。コードはスレッドセーフではありません。バグの数が膨大になり、見つけにくいものです。あなたのクラスWorldSelection

+0

お返事ありがとうございました。 :)あなたが気にしないなら、コードを「スレッドセーフな」ものにする方法を説明できますか、Javaで作業を始めたばかりなので、どのように修正すればい​​いのか分かりませんし、学校では何かを作る方法スレッドセーフ:( とにかく、ありがとう! –

+0

これは高度なトピックです。いくつかの文章では説明できません。 – talex

0

、クラスLevelSelectionの参照が作成されますが、 ActionPerformed()に初期化されています。したがって、その前に LevelSelection lsの参照はnullを指しています。

+0

@ user2441511ありがとうございます:) –

関連する問題