Hilfe gesucht: String wird auf null gesetzt!

Hallo erstmal,
ich bin beim Programmieren mit Java mit Eclipse auf ein Problem gestoßen: in einer Klasse (ohne public static void main(String[] args)) , nennen wir sie einfach Klasse A, wird eine zufällige Zahl mithilfe von java.util.Random bzw. nextInt() von 1 bis 16 generiert. Anhand dieser Zahl wird durch switch eine String-Variable mit den Namen b initalisiert. Diese String-Variable b habe ich am Anfang der Klasse deklariert. Nun hatte ich vor, in einer Methode einen übergebenen String und b mithilfe von equals() zu vergleichen. Jedoch bekomme ich nie das gewünschte Ergebnis, da b nicht mehr den voher initalisierten String, sondern nur noch null enthält.

Wüsste jemand, woran das liegen könnte oder wie man es hinbekommen könnte, dass der Wert im String bleibt?

Danke im Voraus!
 
Wenn du den Code auch noch zeigen würdest, könnte man genauer antworten.
Meine Vermutung: Du deklarierst lokal eine "zweite" String-Instanz b, die mit der Instanz-Variable nichts zu tun hat.
 
Java:
import java.util.Random;

import javax.swing.JOptionPane;

public class WrongProduct {
    Random gen1 = new Random();
    NewArticlesV02 na3 = new NewArticlesV02(); // nicht beachten!
 
    private int NwProduct;
    private String wProduct; // String, der zurückgesetzt wird
 
    void setWProduct() {                                   
        NwProduct = 1+gen1.nextInt(16);
     
        switch (NwProduct) {
            case 1: wProduct = "Äpfel";
                break;
            case 2: wProduct = "Butter";
                break;
            case 3: wProduct = "Donuts";
                break;
            case 4: wProduct = "Eier";
                break;
            case 5: wProduct = "Fischstäbchen";
                break;
            case 6: wProduct = "Geröllsteiner Mineralwasser";
                break;
            case 7: wProduct = "Harribo Gummibärchen";
                break;
            case 8: wProduct = "Kloßteig";
                break;
            case 9: wProduct = "Müllbeutel";
                break;
            case 10:wProduct = "Nutella";
                break;
            case 11:wProduct = "Pompers Windeln";
                break;
            case 12:wProduct = "Rotmützchen Wein";
                break;
            case 13:wProduct = "Schokolade";
                break;
            case 14:wProduct = "Torte";
                break;
            case 15:wProduct = "Voll & Fit Energydrink";
                break;
        }
    }
    int getNWProduct() {
        return NwProduct;
    }
    void display_wrong_Product() {
        JOptionPane.showMessageDialog(null, "Folgendes Produkt darf nicht verkauft werden:\n\n" + wProduct);
    }
    void is_wrong_Product_selled(int b, String p) {
        if (b == 0) {
            //System.out.println(b);
            //System.out.println(p);
            //System.out.println(wProduct);
            if (p.equals(wProduct)) {
                //System.out.println(b);
                //System.out.println(wProduct);
                JOptionPane.showMessageDialog(null, "Wrong Product selled!");
            }
            else {
                JOptionPane.showMessageDialog(null, "0_0001");
            }
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Okay, hier kann ich gerade nichts außergewöhnliches sehen, wie wird die Klasse denn verwendet? Wo wird der Konstruktor, setWProduct und getNWProduct aufgerufen -> Code?
Ansonsten:
Bitte benutze Java-Code Tags. Im Editor: Einfügen... -> Code -> Im Overlay Java auswählen.
 
Java:
while (loop == true && start == 1) {
            wn.setWProduct();
            wn.display_wrong_Product();
            while (time != 0) {
                nc.new_customer();
                if (customer == 5) {
                    customer = 0;
                    time = time - 1;
                    System.out.println("time - 1");
                    continue;
                }
                else if (time == 0 && customer == 5) {
                    JOptionPane.showMessageDialog(null, "Schicht zuende!");
                    break;
                }
                else {
                    customer++;
                    System.out.println(customer);
                }
            }

Der Konstruktor und setWProduct werden in der Datei mit public static void main aufgerufen, getNWProduct war nur zum Test gedacht, um die zufällig generierte Zahl auszugeben/weiterzuverwenden und kann eigentlich übersehen werden.
Die Klasse dient dazu, für ein Spiel ein zufälliges Produkt zu erstellen, welches nicht verkauft werden darf.

PS: Entschuldigung für den Fail mit den Code!
 
Zuletzt bearbeitet:
Also damit ich den Fehler genauer verstehe:
beim Aufruf von wn.display_wrong_Product(); wird im Message-Dialog null angezeigt?
Weil in deinem Ausgangspost, geht es ja um den Vergleich mit equals, der wohl in is_wrong_Product_selled stattfindet?
 
Es geht um den Vergleich in is_wrong_Product_selled, denn wenn man nach if (b == 0) wProduct ausgeben lässt, hat wProduct den Wert "null", was der Fehler ist und dadurch auch die zweite if-Abfrage immer nur false bringt.
 
Ok, kannst du mal den Code raussuchen in dem is_wrong_Product_selled() aufgerufen wird? Ich vermute du rufst die Methode auf einer anderen Instanz auf, als du wn.setWProduct(); aufgerufen hast.
 
Java:
package ccv02;

import javax.swing.JOptionPane;

public class NewRoundV02 {
   
    NewArticlesV02 na2 = new NewArticlesV02();
    WrongProduct wn1 = new WrongProduct();
   
    private int a;
    private String rProduct;
   
    int getA() {
        return a;
    }
    String getRProduct() {
        return rProduct;
    }
    void new_round() {
        na2.setArticle();
        rProduct = na2.getArticle();
        a = JOptionPane.showConfirmDialog(null, "Ware: " + na2.getArticle() + "\n\nWare abscannen?");
        System.out.println(a);
        if (a == 0) {
            JOptionPane.showMessageDialog(null, "Ware abgescannt!");
        }
        else {
            JOptionPane.showMessageDialog(null, "Ware nicht abgescannt!");
        }
        wn1.is_wrong_Product_selled(a, rProduct);
    }
}

Das ist der Code, in den is_wrong_Product_selled aufgerufen wird.
 
Zum besseren Verständnis: der Code für das Objekt na2

Java:
package ccv02;

import java.util.*;

public class NewArticlesV02 {
   
    Random generator = new Random();
   
    private int anzahlWaren;
    private int nWaren;
    private String article;
    private int nArticle;

    void setAnzahlWaren() {
        nWaren = 1 + generator.nextInt(16);
        anzahlWaren = nWaren;
        System.out.println(anzahlWaren);
    }
    int getAnzahlWaren() {
        return anzahlWaren;
    }
    void setArticle() {
        nArticle = 1 + generator.nextInt(16);
        switch (nArticle) {
            case 1: article = "Äpfel";
                    break;
            case 2: article = "Butter";
                    break;
            case 3: article = "Donuts";
                    break;
            case 4: article = "Eier";
                    break;
            case 5: article = "Fischstäbchen";
                    break;
            case 6: article = "Geröllsteiner Mineralwasser";
                    break;
            case 7: article = "Harribo Gummibärchen";
                    break;
            case 8: article = "Kloßteig";
                    break;
            case 9: article = "Müllbeutel";
                    break;
            case 10:article = "Nutella";
                    break;
            case 11:article = "Pompers Windeln";
                    break;
            case 12:article = "Rotmützchen Wein";
                    break;
            case 13:article = "Schokolade";
                    break;
            case 14:article = "Torte";
                    break;
            case 15:article = "Voll & Fit Energydrink";
                    break;
        }
        System.out.println(article);
    }
    String getArticle() {
        return article;
    }
    int getNArticle() {
        return nArticle;
    }
}
 
Okay, ich nehme an der erste Code-Ausschnitt, in dem eben setWProdcut() aufgerufen wird, ist in einer anderen Klasse. und speziell wichtig: Du rufst dort ebenfalls WrongProduct wn1 = new WrongProduct(); auf?
Also du rufst mehrfach "new WrongProduct();" auf?
 
Ja, der erste mit setWProduct() ist in einer anderen Datei und WrongProduct wird zweimal aufgerufen.
Sollte ich WrongProduct nur einmal aufrufen und kann ich von einer anderen Klasse auf ein Objekt einer anderen zugreifen?
 
Ja, der erste mit setWProduct() ist in einer anderen Datei und WrongProduct wird zweimal aufgerufen.
Sollte ich WrongProduct nur einmal aufrufen und kann ich von einer anderen Klasse auf ein Objekt einer anderen zugreifen?

Genau, du solltest es nur einmal erstellen, wenn es nur einmal im Programm existieren soll.

Jedes Objekt hat ja seinen eigenen Zustand, deshalb ist beim zweiten der Wert nicht gesetzt.

Du kannst das bereits erstellte Objekt per Konstruktor/Methode übergeben.
 
Etwa so ..
Java:
import javax.swing.JOptionPane;

public class NewRoundV02 {
  
    NewArticlesV02 na2 = new NewArticlesV02();
    WrongProduct wn1 ;

   public NewRoundV02 (WrongProduct wn1 ){
       this.wn1 = wn1
   }
   //[rest der klasse]
}

Dann musst du beim Erstellen von NewRoundV02 ein WrongProduct-Objekt mitgeben.
 

Zurück
Oben