Unverstandene Null.PointException

Sot Burst

Mitglied
Hallo erstmal,

Ich habe gestern mit JavaFX angefangen und wollte ein Spiel ähnlich wie Cookie Clicker programmieren.
Alle Anzeige sowie Knöpfe wurden als ich anfing von den Knöpfen "geupdated". Da es auch Pro sekunden Geld
geben sollte, wollte ich das in einen Thread der im Hintergrund läuft machen lassen.
Der Thread selbst sieht so aus:
Java:
package org.solidteam.game;

import org.solidteam.application.Main;


public class Updater extends Main implements Runnable {
   long timer;
   boolean ingame;

   public void run() {

     while(getIngame()){

       updater();
     }
   }

   private void updater() {
     timer = System.currentTimeMillis();

     if(getGame().getMoney().compareTo(getGame().getCosts(0))<0){
       getLayout1().getChildren().remove(getKaufButton(1));
       setButtonStatus(1, false);
     }
     getMoneyText().setText("Geld:  " + getGame().getMoney() + " Euro");
     if(getGame().getMoney().compareTo(getGame().getCosts(0))>=0 && !getButtonStatus(1)){
       getLayout1().getChildren().add(getKaufButton(1));
       setButtonStatus(1, true);
     }

     while((timer+100)>System.currentTimeMillis()){

     }

   }
}
Er wird erst gestarted nachdem Game game vom Construktor gesetzt wurde, also die Variablen entsprechend gesetzt.

Wenn ich jetzt das Programm starte sagt er mir das, das alles
Code:
     if(getGame().getMoney().compareTo(getGame().getCosts(0))<0){
       getLayout1().getChildren().remove(getKaufButton(1));
       setButtonStatus(1, false);
     }
     getMoneyText().setText("Geld:  " + getGame().getMoney() + " Euro");
     if(getGame().getMoney().compareTo(getGame().getCosts(0))>=0 && !getButtonStatus(1)){
       getLayout1().getChildren().add(getKaufButton(1));
       setButtonStatus(1, true);
     }
Nullpoint fehler sind (habe z.b mal die if abfragen ausgeklammert dann hat er einfach woanders gemeckert deswegen geh ich davon aus das die beiden Kompletten Blöcke Fehler aufrufen)

Die Getter und Setter sind eigentlich auch richtig gemacht. Wäre gut wenn einer von euch mit helfen könnte.

Wenn ihr nochmehr Code braucht kann ich diesen "Nachreichen".
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
Sinnvoll wäre es, den Stacktrace und zumindest etwas mehr Code zu sehen ;)

In dem Codestück gibts ja nicht mal #getGame
 

Sot Burst

Mitglied
Ok ich Poste Hier jetzt Nocheinmal den Vollständigen Code
Main:
Java:
package org.solidteam.application;

import org.solidteam.game.Game;
import org.solidteam.game.Updater;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.scene.text.*;

public class Main extends Application {
   private Button geldButton;
   private Text event;
   private Button kaufButton1;
   private Game game;
   private Text moneyText;
   private VBox layout1;
   private boolean kaufButtons[] = new boolean[1];
   private static boolean ingame;

   @Override
   public void start(Stage window) throws Exception {
       game = new Game();
       event = new Text();

       event = new Text();



       window.setTitle("Mini Game by SoT Burst");

       layout1 = new VBox(20);


       setMoneyText(new Text());
       getMoneyText().autosize();
       getMoneyText().setX(230);

       getMoneyText().setText("" + game.getMoney());
       geldButton = new Button();

       geldButton.setText("GELD");
       geldButton.setOnAction(e ->{
         game.addMoney(game.getMoneyPerClick());

       });

       kaufButton1 = new Button();
       kaufButton1.setText("Klickupgrade");

       kaufButton1.setOnAction(e ->{
         game.buy(0);

         getMoneyText().setText("Geld:  " + game.getMoney() + " Euro");
       });

       getLayout1().getChildren().add(getMoneyText());
       getLayout1().getChildren().add(event);
       getLayout1().getChildren().add(geldButton);


       Updater updater = new Updater();
       Thread u = new Thread(updater);

       Scene home = new Scene(getLayout1(),1280,720);
       home.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
       window.setScene(home);
       window.show();
       u.start();
   }

   public static void main(String[] args) {
     ingame = true;
     launch(args);
     ingame = false;
   }
   public Button getKaufButton(int i){
     if(i==1){
       return kaufButton1;
     }
     return null;
   }
   public boolean getIngame(){return ingame;}
   public Button getGeldButton(){return geldButton;}
   public boolean getButtonStatus(int i){return kaufButtons[i];}
   public void setButtonStatus(int i, boolean b) {kaufButtons[i] = b;}
   public Game getGame(){return game;}
   public VBox getLayout1() {return layout1;}
   public Text getMoneyText() {return moneyText;}
   public void setMoneyText(Text moneyText) {this.moneyText = moneyText;}
}

Game:
Java:
package org.solidteam.game;

import java.math.BigInteger;

public class Game {
  private BigInteger money;
  private BigInteger moneyPerSecond;
  private BigInteger moneyMultiplier;
  private BigInteger moneyClickMultiplier;
  private BigInteger moneyPerClick;
  private static int length = 1;
  private static BigInteger[] startingCosts = new BigInteger[length];
  private BigInteger[] costs = startingCosts;
  private BigInteger[] levels = new BigInteger[length];

  public Game() {
     levels[0] = BigInteger.ZERO;
     startingCosts[0] = new BigInteger("25");
     money = BigInteger.ZERO;
    moneyPerSecond = BigInteger.ZERO;
    moneyMultiplier = BigInteger.ONE;
    moneyPerClick = BigInteger.ONE;
    moneyClickMultiplier = BigInteger.ONE;
  }

  public void buy(int i){
     if(getMoney().compareTo(getCosts(i))>=0){
       setMoney(getMoney().subtract(getCosts(i)));
       costs[i] = costs[i].multiply(new BigInteger("12")).divide(BigInteger.TEN);
       levels[i] = levels[i].add(BigInteger.ONE);
       moneyPerClick = moneyPerClick.add(BigInteger.ONE);
     }
  }

  public BigInteger getMoney(){
  return money;
  }
  public void setMoney(BigInteger money){
  this.money = money;
  }
  public void addMoney(BigInteger money){
     this.money = this.money.add(money);
  }
  private void setMoneyPerSecond(BigInteger moneyPerSecond){
  this.moneyPerSecond = moneyPerSecond;
  }
  public BigInteger getMoneyPerSecond(){
  return moneyPerSecond;
  }
  public void setMoneyPerClick(BigInteger moneyPerClick){
  this.moneyPerClick = moneyPerClick;
  }
  public BigInteger getMoneyPerClick(){
  return moneyPerClick;
  }
  public BigInteger getMoneyMultiplier(){
  return moneyMultiplier;
  }
  public void setMoneyMultiplier(BigInteger moneyMultiplier){
  this.moneyMultiplier = moneyMultiplier;
  }

  public BigInteger getCosts(int i) {
     return costs[i];
   }

   public static int getUpgradeNumber() {

     return length;
   }

   public String getLevel(int i) {
     return "" + levels[i];
   }
}

Und die Letzte und fehlerbringende datei Updater:

Java:
package org.solidteam.game;

import org.solidteam.application.Main;


public class Updater extends Main implements Runnable {
   long timer;
   boolean ingame;

   public void run() {

     while(getIngame()){

       updater();
     }
   }

   private void updater() {
     timer = System.currentTimeMillis();

     if(getGame().getMoney().compareTo(getGame().getCosts(0))<0){
       getLayout1().getChildren().remove(getKaufButton(1));
       setButtonStatus(1, false);
     }
     getMoneyText().setText("Geld:  " + getGame().getMoney() + " Euro");
     if(getGame().getMoney().compareTo(getGame().getCosts(0))>=0 && !getButtonStatus(1)){
       getLayout1().getChildren().add(getKaufButton(1));
       setButtonStatus(1, true);
     }

     while((timer+100)>System.currentTimeMillis()){

     }
   }
}

Hier noch der Fehlercode:
Exception in thread "Thread-4" java.lang.NullPointerException
at org.solidteam.game.Updater.updater(Updater.java:23)
at org.solidteam.game.Updater.run(Updater.java:16)
at java.lang.Thread.run(Unknown Source)
 
Zuletzt bearbeitet von einem Moderator:

Flown

Administrator
Mitarbeiter
Hier läuft so einiges falsch!
Warum sollte der Updater von Main ableiten? Du brauchst eher die Referenz von Main im Updater:
Java:
public class Main extends Application {
  
  private Button geldButton;
  private Text event;
  private Button kaufButton1;
  private Game game;
  private Text moneyText;
  private VBox layout1;
  private boolean kaufButtons[] = new boolean[1];
  private static boolean ingame;
  
  @Override
  public void start(Stage window) {
    
    game = new Game();
    event = new Text();
    
    window.setTitle("Mini Game by SoT Burst");
    
    layout1 = new VBox(20);
    
    setMoneyText(new Text());
    getMoneyText().autosize();
    getMoneyText().setX(230);
    
    getMoneyText().setText("" + game.getMoney());
    geldButton = new Button();
    
    geldButton.setText("GELD");
    geldButton.setOnAction(e -> {
      game.addMoney(game.getMoneyPerClick());
      
    });
    
    kaufButton1 = new Button();
    kaufButton1.setText("Klickupgrade");
    
    kaufButton1.setOnAction(e -> {
      game.buy(0);
      
      getMoneyText().setText("Geld:  " + game.getMoney() + " Euro");
    });
    
    getLayout1().getChildren().add(getMoneyText());
    getLayout1().getChildren().add(event);
    getLayout1().getChildren().add(geldButton);
    
    Updater updater = new Updater(this);
    Thread u = new Thread(updater);
    
    Scene home = new Scene(getLayout1(), 1280, 720);
    home.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
    window.setScene(home);
    window.show();
    u.start();
    
  }
  
  public static void main(String[] args) {
    ingame = true;
    launch(args);
    ingame = false;
  }
  
  public Button getKaufButton(int i) {
    if (i == 1) {
      return kaufButton1;
    }
    return null;
  }
  
  public boolean getIngame() {
    return ingame;
  }
  
  public Button getGeldButton() {
    return geldButton;
  }
  
  public boolean getButtonStatus(int i) {
    return kaufButtons[i];
  }
  
  public void setButtonStatus(int i, boolean b) {
    kaufButtons[i] = b;
  }
  
  public Game getGame() {
    return game;
  }
  
  public VBox getLayout1() {
    return layout1;
  }
  
  public Text getMoneyText() {
    return moneyText;
  }
  
  public void setMoneyText(Text moneyText) {
    this.moneyText = moneyText;
  }
}

class Game {
  private BigInteger money;
  private BigInteger moneyPerSecond;
  private BigInteger moneyMultiplier;
  private BigInteger moneyClickMultiplier;
  private BigInteger moneyPerClick;
  private static int length = 1;
  private static BigInteger[] startingCosts = new BigInteger[length];
  private BigInteger[] costs = startingCosts;
  private BigInteger[] levels = new BigInteger[length];
  
  public Game() {
    levels[0] = BigInteger.ZERO;
    startingCosts[0] = new BigInteger("25");
    money = BigInteger.ZERO;
    moneyPerSecond = BigInteger.ZERO;
    moneyMultiplier = BigInteger.ONE;
    moneyPerClick = BigInteger.ONE;
    moneyClickMultiplier = BigInteger.ONE;
  }
  
  public void buy(int i) {
    if (getMoney().compareTo(getCosts(i)) >= 0) {
      setMoney(getMoney().subtract(getCosts(i)));
      costs[i] = costs[i].multiply(new BigInteger("12")).divide(BigInteger.TEN);
      levels[i] = levels[i].add(BigInteger.ONE);
      moneyPerClick = moneyPerClick.add(BigInteger.ONE);
    }
  }
  
  public BigInteger getMoney() {
    return money;
  }
  
  public void setMoney(BigInteger money) {
    this.money = money;
  }
  
  public void addMoney(BigInteger money) {
    this.money = this.money.add(money);
  }
  
  private void setMoneyPerSecond(BigInteger moneyPerSecond) {
    this.moneyPerSecond = moneyPerSecond;
  }
  
  public BigInteger getMoneyPerSecond() {
    return moneyPerSecond;
  }
  
  public void setMoneyPerClick(BigInteger moneyPerClick) {
    this.moneyPerClick = moneyPerClick;
  }
  
  public BigInteger getMoneyPerClick() {
    return moneyPerClick;
  }
  
  public BigInteger getMoneyMultiplier() {
    return moneyMultiplier;
  }
  
  public void setMoneyMultiplier(BigInteger moneyMultiplier) {
    this.moneyMultiplier = moneyMultiplier;
  }
  
  public BigInteger getCosts(int i) {
    return costs[i];
  }
  
  public static int getUpgradeNumber() {
    
    return length;
  }
  
  public String getLevel(int i) {
    return "" + levels[i];
  }
  
}

class Updater implements Runnable {
  
  long timer;
  boolean ingame;
  Main main;
  
  public Updater(Main main) {
    this.main = main;
  }
  
  @Override
  public void run() {
    
    while (main.getIngame()) {
      
      updater();
    }
  }
  
  private void updater() {
    timer = System.currentTimeMillis();
    
    if (main.getGame().getMoney().compareTo(main.getGame().getCosts(0)) < 0) {
      main.getLayout1().getChildren().remove(main.getKaufButton(1));
      main.setButtonStatus(0, false);
    }
    main.getMoneyText().setText("Geld:  " + main.getGame().getMoney() + " Euro");
    if (main.getGame().getMoney().compareTo(main.getGame().getCosts(0)) >= 0 && !main.getButtonStatus(1)) {
      main.getLayout1().getChildren().add(main.getKaufButton(1));
      main.setButtonStatus(1, true);
    }
    
    while (timer + 100 > System.currentTimeMillis()) {
      
    }
  }
}
Du solltest nochmal mit Grundlagen beginnen! Ein paar Tutorials ansehen.
Tipps:
- Arbeite mit fxml und Controller
- Nimm Timelines oder Tasks als Thread (JavaFX-Threads müssen anders behandelt werden)
- Schau dir nochmal static/non-static an
- Schau dir nochmal die Verarbeitung von Arrays an
- Schau dir Bindings und Properties in JavaFX an
- ...

Erst die Punkte abarbeiten, dann nochmal an dem Spiel versuchen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z textField.getText = null AWT, Swing, JavaFX & SWT 15
Davee JavaFX ListView = null wenn ich sie in Laufzeit ändern will! AWT, Swing, JavaFX & SWT 16
AmsananKING Textfelder sind gleich null AWT, Swing, JavaFX & SWT 2
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
J Injection - Aber Controller sind null AWT, Swing, JavaFX & SWT 3
J Controller ist null - Warum AWT, Swing, JavaFX & SWT 3
Z Swing Wert aus Textfeld auslesen -- null Fehler AWT, Swing, JavaFX & SWT 4
N SceneBuilder wie auf Attribute zugreifen? Diese sind immer null. AWT, Swing, JavaFX & SWT 6
F javaxt.io.Image getBufferedImage liefert null AWT, Swing, JavaFX & SWT 1
A Swing Null Pointer Exception obwohl Objekt initialisiert AWT, Swing, JavaFX & SWT 21
D Zwischen Null-Layouts wechseln AWT, Swing, JavaFX & SWT 2
D AWT Graphics2D getClip gibt null zurück AWT, Swing, JavaFX & SWT 3
H Swing jComboBox Ausgabe -1/null AWT, Swing, JavaFX & SWT 4
G Swing, JavaFx - Felder aus FXML sind null AWT, Swing, JavaFX & SWT 6
K Swing JSpinner mit NULL AWT, Swing, JavaFX & SWT 3
F JavaFX Properties und NULL Werte AWT, Swing, JavaFX & SWT 2
M JTextField gibt beim auslesen null aus AWT, Swing, JavaFX & SWT 9
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
S String is null Fehler AWT, Swing, JavaFX & SWT 2
R Swing JLabel gibt stets 'null' aus AWT, Swing, JavaFX & SWT 3
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
P Swing JTable null values an das Ende verschieben AWT, Swing, JavaFX & SWT 2
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
C JTable sorter GregorianCalender null Exc AWT, Swing, JavaFX & SWT 4
N Swing JFrame==null und doch nicht null?! AWT, Swing, JavaFX & SWT 4
N JButton Border(null) AWT, Swing, JavaFX & SWT 3
E JPanel mit Null Layout entfernt Buttons AWT, Swing, JavaFX & SWT 11
K Swing regexFilter() null filtern AWT, Swing, JavaFX & SWT 3
R Swing JComboBox - Null-Feld AWT, Swing, JavaFX & SWT 7
M SWT DateTime per default null Wert ? AWT, Swing, JavaFX & SWT 3
D Bild zeichnen lassen aus array, null pointer Exception AWT, Swing, JavaFX & SWT 2
J JScrollPane & Null-Layout AWT, Swing, JavaFX & SWT 12
A JPanel mit Layout(null) in JPanel AWT, Swing, JavaFX & SWT 4
G Zentrieren mittels setLocationRelativeTo(null);? AWT, Swing, JavaFX & SWT 14
G Value vom TreeCellEditor ist immer null AWT, Swing, JavaFX & SWT 3
G JTree Problem: Null Child not allowed AWT, Swing, JavaFX & SWT 12
J JList CellRenderer Null-Layoutpanel AWT, Swing, JavaFX & SWT 4
C getGraphics() liefert nur null AWT, Swing, JavaFX & SWT 4
H null Layout -> Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
G Probleme mit Content bei Null-Layout verändern AWT, Swing, JavaFX & SWT 7
T Null Layout Problem. AWT, Swing, JavaFX & SWT 3
M JFormattedTextField und Null-Werte AWT, Swing, JavaFX & SWT 4
S Text im JLabel wird nicht als null anerkannt AWT, Swing, JavaFX & SWT 4
I Null-Layout-Problem AWT, Swing, JavaFX & SWT 2
M Problem mit NULL-Layout AWT, Swing, JavaFX & SWT 2
P paint null pointer exception AWT, Swing, JavaFX & SWT 3
G null pointer mit getText AWT, Swing, JavaFX & SWT 2
V CellEditor der nur Eingaben int 1-9 und "null" er AWT, Swing, JavaFX & SWT 11
H getGraphics() eines JPanel liefert immer null zurück AWT, Swing, JavaFX & SWT 6
F PanelBounds an TextPaneBounds anpassen LayoutManager: Null AWT, Swing, JavaFX & SWT 2
A Null pointer exception beim Neuzeichnen AWT, Swing, JavaFX & SWT 4
O JScrollPane beinhaltet JPanel mit null Layout kein Scrollen AWT, Swing, JavaFX & SWT 3
M bei filechooser.showSaveDialog(null); auf Datein. zugreifen AWT, Swing, JavaFX & SWT 2
B NULL Layout - TextFelder verschwinden AWT, Swing, JavaFX & SWT 8
F Scrollen bei JTextArea in einem Null-Layout? Unmöglich? AWT, Swing, JavaFX & SWT 4
V Null Pointer Exception bei JTextField setText AWT, Swing, JavaFX & SWT 25
R Komponenten frei per Drag&Drop in (z.B.) Null-Layout bew AWT, Swing, JavaFX & SWT 2
B [Swing] Null-Layout AWT, Swing, JavaFX & SWT 2
G Scrollpane in null-Layout einfügen AWT, Swing, JavaFX & SWT 5
G JList: Anzeige von null-Werten verhindern AWT, Swing, JavaFX & SWT 3
W Probleme mit Border- und null-Layout AWT, Swing, JavaFX & SWT 8
Z createImage() liefert null zurück AWT, Swing, JavaFX & SWT 4
K JTextArea und setLayout(null) AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben