Frage zur Methode split der Klasse String

Mr Ma

Mitglied
Guten Abend,
ich stehe wieder auf dem Schlauch.
Ich möchte zum Test den Inhalt zweier String-Array miteinander vergleichen. Das erste Array [starr] ist hart gecodet. Die Daten vom Zweiten sollen über den Scanner eingegeben werden mit Hilfe eines Zwischenstrings "sys", der dann mit der Methode split() geteilt werden soll. In der for-Schleife klappt der Vergleich auch einwandfrei. Ich habe dem Array "gescannt" 4 Plätze zugeteilt, aber dennoch schreibt mir die Methode split() ein n-Stelliges Array (überprüft mit: System.out.println(gescannt.length)). Ich habe diesen Umstand abgefangen, indem ich split() ein Limit (4) gesetzt habe. Bloß warum schreibt split() mir ein, meiner Meinung nach, dynamisches Array (ist es das eigentlich?) Warum bekomme ich trotz Begrenzung des Arrays keine "Out of Bounds Exception"?, die ich mit trycatch abfangen könnte, wo ist mein Fehler.
Bitte sehr um Antwort

IndexOffTest.java:
import java.util.*;
import java.lang.*;

public class IndexofTest {
    
  public static void main(String[] args) {

    String[] starr = {"5","3","4","1"};

    Scanner sc = new Scanner(System.in);
    String[] gescannt = new String[4];
    System.out.println("Bitte 4 - stelligen numerischen Code eingeben!");
    String sys = sc.nextLine();
    gescannt = sys.split("", 4);

    for (int a = 0; a < starr.length; a++) {
        if (gescannt[a].equals(starr[a])) {
              System.out.println("an Stelle "+ (a+1)+ " Übereinstimmung gefunden");
        } else {
              System.out.println("Keine Übereinstimmung");
        }
    }
    System.out.println(Arrays.toString(gescannt));
    System.out.println(gescannt.length);
    System.out.println(Arrays.toString(starr));
  }
}
 

fhoffmann

Top Contributor
Die Methode "split" erzeugt ein neues Array. Dass du "gescannt" vorher ein Array der Größe 4 zuordnest, spielt also überhaupt keiine Rolle (und ist sinnlos).
Wenn du "split" als zweiten Parameter eine Zahl mitgibst, wird der ganze Rest in einen String gepackt.
 

kneitzel

Top Contributor
Also erst einmal zum Verständnis: Eine Array Variable ist eine Referenz. Du hast also ein String Array der Größe 4 erstellt und hast da danne ien Referenz drauf.
Split erzeugt nun ein neues Array und die Referenz in der Variable wird dann ersetzt.

Also so wie immer, wenn Du einer Variable einen neuen Wert zuweist:
int i = 1; // i ist 1
i = 3; // i ist 3 - die 1 ist nun nicht mehr in i.
 

mihe7

Top Contributor
dynamisches Array (ist es das eigentlich?)
Nein.

Warum bekomme ich trotz Begrenzung des Arrays keine "Out of Bounds Exception"?, die ich mit trycatch abfangen könnte, wo ist mein Fehler.
Warum solltest Du? Du greifst ja nicht darauf zu. Es werden drei "Splits" durchgeführt, damit erhälst Du vier Teile. Wenn Du "ABCDEFGHIJK".split("", 4) aufrufst, erhältst Du ein Array {"A","B","C","DEFGHIJK"}.
 

temi

Top Contributor
Der sinnvollste Weg wäre es, nach der Eingabe zu prüfen, ob es wirklich genau vier Stellen sind. Andernfalls solltest du den User darauf hinweisen und eine Neueingabe verlangen.

Danach kommt dann der Rest mit dem Splitten und vergleichen.
 

Mr Ma

Mitglied
Guten Abend Zusammen.
Vielen Dank für die vielen Antworten. Jetzt ist mir klar geworden, warum das mit der Methode split nichts werden kann.
Vielleicht geht es ja speziell um Arrays. Keine Ahnung.
Ja, in der Tat. Ich versuche zuerst im Kleinen und dann immer umfangreicher mit Arrays zu arbeiten, weil ich mit diesem Thema noch Schwierigkeiten habe. Mein Plan ist ein kleines Spiel zu entwerfen, ein immer erweiterbares Programm, woran ich lernen kann. Ein Teil davon soll ein zweidimensionales Array sein, welches wie ein Minenfeld funktioniert. Die Spielfigur soll sich wie auf einem Schachbrett durch das Feld bewegen und der Spieler die Kommandos über den Scanner eingeben können. Dabei sollen Vergleiche stattfinden: Wo die Spielfigur gerade ist, ob sie auf eine Mine gesetzt wurde, wenn nicht, dann ob sich die Mine unmittelbar rechts oder links (benachbarter Index) befindet (Minen für Spieler unsichtbar). In diesem Fall soll eine Methode gestartet werden, die der Figur erlaubt einen eigenen Zufallszug zu unternehmen (Random).
:rolleyes: Ok. alles noch in Planung. In Frage kamen mir nach erster Überlegung String und int (Zahlencodes als Spielzüge und Kopfrechenaufgaben um Minen zu entschärfen sind geplant). Welches besser ist, Strings oder ints muss ich noch sehen, aber Vorschläge und Tipps nehme ich gerne an.
@ mihe7 charAt habe ich schon einmal gesehen aber was kann substring machen? Ich würde nur Teile eines Arrays kopieren in eine normale Variable und diese dann abfragen, oder?
 

mihe7

Top Contributor

Mr Ma

Mitglied
Ja, ich stöbere soeben auf diesen Seiten. Für mich sind sie aber noch unübersichtlich, schon wegen der schieren Menge. Für erfahrene Entwickler bestimmt ein nützliches Nachschlagewerk, keine Frage. Ich bin aber noch überwiegend hier unterwegs: https://www.java-blog-buch.de/0303-nuetzliche-string-methoden/ . Die sind anscheinend noch im Aufbau und natürlich bei Weitem nicht so erschöpfend wie docs.oracle.com. Dafür haben sie ein eigenes Kapitel den Compilerfehler gewitmet. Hat sehr geholfen meinen Compiler besser zu verstehen:).
PS: Ich habe zwar Eclipse installiert, verwende es aber selten. Mit der Konsole komme ich nun etwas besser zurecht.
 

mihe7

Top Contributor
bestimmt ein nützliches Nachschlagewerk
Genau das. Das ist kein Lehrbuch, sondern schlicht Spezifikation. Wenn Du wissen willst, welche Möglichkeiten eine Klasse bietet, gibt es nichts besseres. Du musst aber schon relativ genau wissen, welche Klasse oder wenigstens welches Paket Du brauchst.

PS: Ich habe zwar Eclipse installiert, verwende es aber selten. Mit der Konsole komme ich nun etwas besser zurecht.
Es ist sehr gut, wenn Du weißt, was im Hintergrund passiert und für einfache Dinge (wie hier im Forum) verwende ich auch einfach nur vi und javac oder jshell. Allerdings würde ich Dir schon empfehlen, mehr in einer IDE zu machen - diese Programme unterstützen beim Programmieren schon wirklich heftig.
 

EinNickname9

Bekanntes Mitglied
Ich denke, du suchst einfach nur die Hamming Distance oder die Levenshtein Edit Distance....
Beispiel:

Java:
import java.util.Scanner;

public class StringDistance {
    public static int hamming_distance(String str1, String str2) {
        int i = 0, count = 0;
        if (str2.length() < str1.length()) {
            String t = str1;
            str1 = str2;
            str2 = t;
        }
        while (i < str1.length()) {
            if (str1.charAt(i) != str2.charAt(i)) {
                count++;
            }
            i++;
        }
        count += str2.length() - str1.length();
        return count;
    }

    public static double hamming_distance_percent(String str1, String str2) {
        if (str2.length() < str1.length()) {
            String t = str1;
            str1 = str2;
            str2 = t;
        }
        return 100.0 * (1.0 - (double) hamming_distance(str1, str2) / str2.length());
    }

    public static void readString(String str1) {
        Scanner scan = new Scanner(System.in);
        while (true) {
            System.out.println("Bitte die Zeichenkette eingeben, die auf Übereinstimmung überprüft werden soll:");
            String str2 = scan.nextLine();
            if (str2.isEmpty()) {
                break;
            }
            System.out.println("str1 = " + str1);
            System.out.println("str2 = " + str2);
            System.out.println("Übereinstimmung = " + hamming_distance_percent(str1, str2) + " %");
        }
    }

    public static void main(String[] args) {
        readString("5341");
    }
}

(Bitte verzeiht das Denglisch....)

Code:
Bitte die Zeichenkette eingeben, die auf Übereinstimmung überprüft werden soll:
1111
str1 = 5341
str2 = 1111
Übereinstimmung = 25.0 %
Bitte die Zeichenkette eingeben, die auf Übereinstimmung überprüft werden soll:
11111
str1 = 5341
str2 = 11111
Übereinstimmung = 19.999999999999996 %
Bitte die Zeichenkette eingeben, die auf Übereinstimmung überprüft werden soll:
51111
str1 = 5341
str2 = 51111
Übereinstimmung = 40.0 %
Bitte die Zeichenkette eingeben, die auf Übereinstimmung überprüft werden soll:
5341
str1 = 5341
str2 = 5341
Übereinstimmung = 100.0 %
Bitte die Zeichenkette eingeben, die auf Übereinstimmung überprüft werden soll:

Die Levenshtein Distance geht nochmal einen Schritt weiter und würde zum Beispiel "Zahlendreher" schnell aufspüren.
 

Mr Ma

Mitglied
Ich denke, du suchst einfach nur die Hamming Distance oder die Levenshtein Edit Distance....
Nein, ich suche verschiedene Möglichkeiten eine Aufgabe (nun hier das Vergleichen von Arrayinhalten) zu lösen, damit ich rumprobieren kann, welche sich am Besten eignet. So einen Code habe ich allerdings noch nie irgendwo gesehen. Habe heute ein wenig danach gegoogelt und dabei fiel mir die Ähnlichkeit zum Bubblesort-Algorithmus auf. Hat diese Hamming Distance eine ähnliche Aufgabe und wird dort im Hintergrund sortiert ohne den ursprünglichen String an sich zu verändern? Wenn ich das auf Arrays anwenden will, dann bräuchte ich also nur zusätzlich Schleifen einbauen?
 

Mr Ma

Mitglied
Allerdings würde ich Dir schon empfehlen, mehr in einer IDE zu machen - diese Programme unterstützen beim Programmieren schon wirklich heftig.
Ich habe die IDE auch nicht komplett verworfen. Ich hatte aber am Anfang null Vorkenntnisse. Die IDE hat da nur noch zusätzlich zu Verdruss geführt. Ich mache das jetzt so: Eine Aufgabe breche ich auf möglichst kleine Einzelbausteine herunter und beschäftige mich vorerst mit einzelnen noch unbekannten Methoden. Später versuche ich daraus größere Programme zu machen, Objekte, Datenkapselung, etz. Dabei passiert mir dann folgendes: Einzelne Bausteine verlieren ihre Funktion, oder machen etwas anderes als sie sollen. Bisher konnte die Benutzung einer IDE nichts daran ändern (oder ich benutze sie falsch?). Wie so etwas ausschaut möchte ich mal in einem Codebeispiel zeigen...
 

Mr Ma

Mitglied
Holzmichel Version 1:
import java.util.*;

public class Holzmichel {

    private int baumdicke;
    private int lebenspunkte;

    public Holzmichel(int bBaumdicke) {
        baumdicke = bBaumdicke;
    }

    public int getBaumdicke() {
        return baumdicke;
    }

    public int getLebenspunkte() {
        return lebenspunkte;
    }

    public void setLebenspunkte(int dieLebenspunkte) {
        lebenspunkte = dieLebenspunkte;
    }

    public void baumfaellen() {

        if (getBaumdicke() >= 30) {
            System.out.println("Den schafft der Michel nicht! Bitte einen duenneren als 30 waehlen");
            return;
        }

        if (getBaumdicke() <= 6) {
            for (int i = getBaumdicke(); i >= 0; i--) {
                    System.out.println("Michel hackt");
                    if (i == 0) {
                        System.out.println("Baum faellt !!!!");
                            return;
                    }
            }
        }

        for (int ru = getBaumdicke(); ru >= 0; ru--) {
            if (ru <= 6) {

                System.out.println("Michel atmet schwer und hackt");

                Random random = new Random();
                int rd = random.nextInt(20);

                if (rd == 0) {
                    setLebenspunkte(0);
                    System.out.println("Michel hat einen Herzinfarkt. Er haette noch "+ru + " Schlaege gebraucht");
                        return;
                }
                if (ru == 0) {
                    setLebenspunkte(lebenspunkte-getBaumdicke());
                    System.out.println("Baum faellt !!!!");
                        return;
                }
            } else {
                System.out.println("Michel hackt");
            }
        }
    }

    public void ueberprüfungLebenspunkte() {
        System.out.println("Lebt denn der alte Holzmichel noch?");
        boolean lebenszeichen = false;
        if (getLebenspunkte() > 0) {
            lebenszeichen = true;
            System.out.println("Jaa, er lebt noch! Er lebt noch!");
        }else{
            System.out.println("Nein, leider verstorben");
            System.exit(0); //Das Argument der Lebenspunkte ist 0
        }
    }
}

Main Version 1:
import java.util.*;

public class Main {

    public static void main(String[] args) {

        System.out.println("Der alte Michel erhebt die Axt und fragt: ");
        System.out.println("Wie dick soll der Baum sein?");
        Scanner sc = new Scanner(System.in);
        Holzmichel michel = new Holzmichel(sc.nextInt());

        michel.setLebenspunkte(100);
        michel.baumfaellen();
        michel.ueberprüfungLebenspunkte();
        System.out.println("Der Michel hat noch "+michel.getLebenspunkte()+ " Lebenspunkte!");
    }
}

Nun die verschlimmbesserte Version 2:
Holzmichel Version 2:
import java.util.*;

public class Holzmichel {

    private int baumdicke;
    private int lpZaehler;
    public Holzmichel(int bBaumdicke) {
        baumdicke = bBaumdicke;
    }

    public int getBaumdicke() {
        return baumdicke;
    }

    public int getLpZaehler() {
        return lpZaehler;
    }

    public void setLpZaehler(int derLpZaehler) {
        lpZaehler = derLpZaehler;
    }

    public void baumfaellen() {

        if (getBaumdicke() >= 30) {
            System.out.println("Den schafft der Michel nicht! Bitte einen duenneren als 30 waehlen");
            return;
        }

        if (getBaumdicke() <= 6) {
            for (int i = getBaumdicke(); i >= 0; i--) {
                    System.out.println("Michel hackt");
                    if (i == 0) {
                        System.out.println("Baum faellt !!!!");
                            return;
                    }
            }
        }

        for (int ru = getBaumdicke(); ru >= 0; ru--) {
            if (ru <= 6) {

                System.out.println("Michel atmet schwer und hackt");

                Random random = new Random();
                int rd = random.nextInt(20);

                if (rd == 0) {
                    setLpZaehler(0);
                    System.out.println("Michel hat einen Herzinfarkt. Er haette noch "+ru + " Schlaege gebraucht");
                        return;
                }
                if (ru == 0) {
                    setLpZaehler(lpZaehler-getBaumdicke());
                    System.out.println("Baum faellt !!!!");
                        return;
                }
            } else {
                System.out.println("Michel hackt");
            }
        }
    }
}

Prüfung der Lebenspunkte in eigener Klasse:
public class PruefungLebenspunkte {

    private int lebenspunkte;
/*
    public PruefungLebenspunkte(int dieLebenspunkte) {
        lebenspunkte = dieLebenspunkte;
    }
*/
    public int getLebenspunkte() {
        return lebenspunkte;
    }
    public void setLebenspunkte(int dieLebenspunkte) {
        lebenspunkte = dieLebenspunkte;
    }
    public void ueberpruefungLebenspunkte() {
        System.out.println("Lebt denn der alte Holzmichel noch?");
        boolean lebenszeichen = false;
        if (getLebenspunkte() > 0) {
            lebenszeichen = true;
            System.out.println("Jaa, er lebt noch! Er lebt noch!");
        }else{
            System.out.println("Nein, leider verstorben");
            System.exit(0); //Das Argument der Lebenspunkte ist 0
        }
    }
}

Main Version 2:
import java.util.*;
public class Main {

    public static void main(String[] args) {

        PruefungLebenspunkte lPunkte = new PruefungLebenspunkte();
        lPunkte.setLebenspunkte(100);
        System.out.println("Der alte Michel erhebt die Axt und fragt: ");
        System.out.println("Wie dick soll der Baum sein?");
        Scanner sc = new Scanner(System.in);
        Holzmichel michel = new Holzmichel(sc.nextInt());
        lPunkte.setLebenspunkte(michel.getLpZaehler());
        michel.baumfaellen();
//        lPunkte.ueberpruefungLebenspunkte();
        System.out.println("Der Michel hat noch "+lPunkte.getLebenspunkte()+ " Lebenspunkte!");// Fehler! Michel hat immer 0 Lebenspunkte!
        sc.close();
    }
}

So, die Version1 funktioniert wie es soll. Bei der 2. bleiben die Lebenspunkte immer 0! Selbst dann, wenn Michel den Baum fällen kann! Ich vermute eine set-Methode arbeitet nicht.
Wie gesagt werde ich auch bei Eclipse nicht schlauer.😞
PS: Bitte nicht am Format stören. Seit dieser Fehler aufgetreten ist habe ich mich zuerst versucht darum zu kümmern.
 

mihe7

Top Contributor
Mit Unterstützung durch die IDE war nicht gemeint, dass sie Dir logische Fehler zeigt. Wobei Code-Inspection-Tools durchaus Code-Smells zeigen können.

Es geht mir mehr um Dinge wie: Projektverwaltung, Code-Generation, Code-Vervollständigung, Refactoring, Bearbeitungskomfort wie z. B. per Klick von einem Methodenaufruf zur Methode zu springen, die Suche nach Verwendungen von Variablen, Methoden und Typen im Code (wieder mit Klick um die Stellen anzuspringen), JavaDocs-Anzeige usw. usf. Allein die Vervollständigungsfunktion ist beim Schreiben von Code Gold wert.

Bei der 2. bleiben die Lebenspunkte immer 0! Selbst dann, wenn Michel den Baum fällen kann! Ich vermute eine set-Methode arbeitet nicht.
Naja, Du hast ja auch keine Verbindung zwischen dem Holzmichel und der PruefungLebenspunkte :)
 

EinNickname9

Bekanntes Mitglied
Wenn ich das auf Arrays anwenden will, dann bräuchte ich also nur zusätzlich Schleifen einbauen?
Ich bin mir nicht sicher ob ich dich richtig verstanden habe. Weil du jetzt schon wieder mit einem Holzmichel anfängst. ;)

Aber ja, dasselbe würde anstatt mit String s auch mit char[] spielend leicht funktionieren... String s sind ja quasi auch nur char[] s...

Auch wenn es leicht ähnlich aussieht, hat die "hamming_distance" aber nix mit BubbleSort zu tun. ;)

Frag mich einfach konkret wo du Schwierigkeiten hast gerne auch per PN. Oder was du gezeigt bekommen möchtest.
 

Mr Ma

Mitglied
Hallo, ich habe mir Zeit genommen mit den Informationen hier aus dem Thread zu arbeiten. Vielen Dank an Alle für die Mühe erstmal.
Naja, Du hast ja auch keine Verbindung zwischen dem Holzmichel und der PruefungLebenspunkte
Ja, und ich bekomme die Verbindung leider auch nicht hin. Egal wie ich drehe und wende, auf mindestens eine Variable bekomme ich keinen Zugriff. Ich saß gestern die halbe Nacht dran und habe das Programm mehrfach umgeschrieben. Ein Beitrag aus dem Forum schaut nach einer potenziellen Lösung aus: https://www.java-forum.org/thema/von-mehreren-klassen-aus-auf-das-selbe-objekt-zugreifen.177914/ (Ich hoffe nichts verkehrt zu machen, wenn ich den hier verlinke). Das Prinzip ist mir hinten und vorne nicht klar, aber es ist wohl eine wichtige Hürde, die ich nehmen muss wenn ich in meiner Javakunst weiterkommen will. Bitte erklärt es mir.
Frag mich einfach konkret wo du Schwierigkeiten hast gerne auch per PN. Oder was du gezeigt bekommen möchtest.
Auf dieses Angebot komme ich sehr gerne zurück. Vorerst muss ich aber das der Verbindungslosigkeit gelöst bekommen. Was ich die letzten drei Tage gelernt habe ist, dass ich über Objektorientierte Programmierung weniger weiß als mir lieb ist😣
 

kneitzel

Top Contributor
Was ist denn Dein aktueller Stand nach dem Umschreiben? Wenn Du den zumindest einmal skizzieren kannst falls Du den Code nicht komplett zeigen willst / kannst.

Wenn wir erkennen können, was Du machen willst, dann kann man Dir am ehesten Tipps geben, wie dies zu lösen ist. Das erscheint am Anfang bestimmt alles recht schwer, aber wenn man einmal den Dreh raus hat, dann wird es relativ einfach.
 

Mr Ma

Mitglied
Der Code ist ein Privatprojekt und nichts geheimes. Gerne hier die aktuelle Version:
Main Klasse:
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Lebenspunkte lebenspunkte = new Lebenspunkte(100);

        Holzmichel michel = new Holzmichel(0);
        michel.baumfaellen();
        lebenspunkte.checkLebenspunkte();       
    }
}

/* Ausgelagert
    public static void ueberpruefungLebenspunkte() {
        Lebenspunkte check = new Lebenspunkte();
        System.out.println("Lebt denn der alte Holzmichel noch?");
        System.out.println("Der Michel hat noch //"+check.getLebenspunkte()+ "// Lebenspunkte!");
    }

        if (lebenspunkte.getLebenspunkte() > 0 && michel.getLpZaehler() >= 0) {
            int zwischenspeicher = lebenspunkte.getLebenspunkte();
            lebenspunkte.setLebenspunkte(zwischenspeicher-michel.getLpZaehler());
            System.out.println("Jaa, er lebt noch! Er lebt noch!");
            System.out.println("Der Michel hat noch "+lebenspunkte.getLebenspunkte()+ " Lebenspunkte!");
        }
        
        if(michel.getLpZaehler() < 0) {
            lebenspunkte.setLebenspunkte(0);
            System.out.println("Nein, leider verstorben");
            System.exit(0); //Das Argument der Lebenspunkte ist 0
        }
*/

Holzmichel Klasse:
import java.util.*;

public class Holzmichel {

    private int baumdicke;
    private int lpZaehler;
    private String lebtnoch;

    //Konstruktor für Main
    public Holzmichel(int bBaumdicke) {
        baumdicke = bBaumdicke;
    }

    //Konstruktor für Lebenspunkte
    public Holzmichel(String erLebtnoch, int derLpZaehler) {
        lebtnoch = erLebtnoch;
        lpZaehler = derLpZaehler;
    }

    public int getBaumdicke() {
        return baumdicke;
    }

    public String getLebtnoch() {
        return lebtnoch;
    }

    public int getLpZaehler() {
        return lpZaehler;
    }

    public void setBaumdicke(int dieBaumdicke) {
        baumdicke = dieBaumdicke;
    }

    public void setLpZaehler(int derLpZaehler) {
        lpZaehler = derLpZaehler;
    }

    public void baumfaellen() {
        System.out.println("Der alte Michel erhebt die Axt und fragt: ");
        System.out.println("Wie dick soll der Baum sein?");

        Scanner sc = new Scanner(System.in);
        setBaumdicke(sc.nextInt());

        if (getBaumdicke() >= 30) {
            System.out.println("Den schafft der Michel nicht! Bitte einen duenneren als 30 waehlen");
            return;
        }

        if (getBaumdicke() <= 6) {
            for (int i = getBaumdicke(); i >= 0; i--) {
                    System.out.println("Michel hackt");
                    if (i == 0) {
                        System.out.println("Baum faellt !!!!");
                            return;
                    }
            }
        }

        for (int ru = getBaumdicke(); ru >= 0; ru--) {
            if (ru <= 6) {

                System.out.println("Michel atmet schwer und hackt");

                Random random = new Random();
                int rd = random.nextInt(20);

                if (rd == 0) {
                    setLpZaehler(-1);
                    System.out.println("Michel hat einen Herzinfarkt. Er haette noch "+ru + " Schlaege gebraucht");
                        return;
                }
                if (ru == 0) {
                    setLpZaehler(lpZaehler = getBaumdicke());
                    System.out.println("Baum faellt !!!!");
                        return;
                }
            } else {
                System.out.println("Michel hackt");
            }
        }
        sc.close();
    }
}
Neue Klasse Lebenspunkte:
public class Lebenspunkte {

    private int lebenspunkte;

    public Lebenspunkte(int dieLebenspunkte) {
        lebenspunkte = dieLebenspunkte;
    }

    public int getLebenspunkte() {
        return lebenspunkte;
    }

    public void setLebenspunkte(int dieLebenspunkte) {
        lebenspunkte = dieLebenspunkte;
    }

    // Dieses Objekt steht hier zum Testzweck
    Holzmichel seinZaehler = new Holzmichel("Lebt denn der alte Holzmichel noch?", 0);

    public int verrechnungHolzmichel() {
        if (getLebenspunkte() > 0 && seinZaehler.getLpZaehler() >= 0) {
            int zwischenspeicher = getLebenspunkte();
            setLebenspunkte(zwischenspeicher-seinZaehler.getLpZaehler());
        }
        
        if(seinZaehler.getLpZaehler() < 0) {
            setLebenspunkte(0);
        }
    }

    public void checkLebenspunkte() {

        System.out.println(seinZaehler.getLebtnoch());

            System.out.println("Jaa, er lebt noch! Er lebt noch!");
            System.out.println("Der Michel hat noch "+ getLebenspunkte()+ " Lebenspunkte!");

            System.out.println("Nein, leider verstorben");
            System.exit(0); //Das Argument der Lebenspunkte ist 0
    }
}
Die Methode ueberprüfungLebenspunkte() möchte ich gerne aus Main heraus haben, da in der Klasse nur die Programmstrategie abgefahren werden soll wie zB: holzfällen, ein Minenfeld überqueren, mit der Axt gegen Rotkäppchen kämpfen(ich spinne mal ein bischen).
In der Klasse Holzmichel ist eine Variable int lpZaehler drin. In ihr sollen "erwirtschaftete" Lebenspunkte abgespeichert werden (in Menge der Baumdicke ab einem bestimmten Punkt: Wenn Michel schwer atmet. Vorher nicht), die dann mit den eigentlichen lebenspunkten in der Klasse Lebenspunkte verrechnet werden sollen: lebenspunkte minus lpZaehler. In der main-Methode ist es allerdings wichtig eine Prüfung der Gesamt-Lebenspunkte zu unternehmen um auf ein anderes "Spielfeld" zu kommen, Michel soll ja nicht gleich zum Zombie werden.
Nun bekomme ich aber keine Verbindung von lpZaehler und lebenspunkte zu Stande, also die Verrechnung klappt nicht. Die Idee der "Objektübergabe" aus dem anderen Thread hatte noch keinen Erfolg.
 

Mr Ma

Mitglied
Zwischendurch versuchte ich noch das Problem über verschiedene Konstruktoren zu lösen, auch um diesen Variablen einen Startwert zu verpassen, aber auch das brachte keine Lösung. Wollte es noch erwähnen, da ich diese Versuche aus dem aktuellen Code entfernt habe.
 

mihe7

Top Contributor
Ein Beitrag aus dem Forum schaut nach einer potenziellen Lösung aus: https://www.java-forum.org/thema/von-mehreren-klassen-aus-auf-das-selbe-objekt-zugreifen.177914/ (Ich hoffe nichts verkehrt zu machen, wenn ich den hier verlinke)
Du kannst den Beitrag direkt verlinken (über jedem Beitrag ist ein "Teilen"-Symbol und auch ein Rechtsklick auf die Kommentarnummer -> Link kopieren funktioniert).

Zur Frage: Du kannst Dein Lebenspunkte-Objekt über einen geeigneten Konstruktor z. B. an den Holzmichel übergeben.
 

kneitzel

Top Contributor
Das erste, das man sich überlegen muss, ist der Zusammenhang der Objekte.

Du hast Holzmichel und Lebenspunkte. Existieren die so frei ohne irgendwelchen Zusammenhang?

Du musst Dir also erst überlegen, wie der Zusammenhang ist. Und dann ist es doch so, dass ein Holzmichel Lebenspunkte hat.

Also von dem Aufbau her ist es so etwas:
Java:
public class HolzMichel {
    private LebensPunkte lebensPunkte;
}
Java:
public class LebensPunkte {
    
}

Und dann ist die Frage, was wohin gehört. Lebenspunkte sind Lebenspunkte. Da kann eine Methode nichts zu einem HolzMichel aussagen. Die Lebenspunkte können auch in einem Clown oder einem Hund sein.

Das wie bei einem Motor. Der weiss auch nichts zu dem Auto. Ob das nun ein BMW, Audi, VW, Skoda, ... ist. Es ist einfach ein Motor mit gewissen Eigenschaften.

Und ein System,exit() ist etwas sehr rabiates. Das sollte man nicht in einer Klasse machen, die nicht das ganze "Spiel" steuert.

Dann solltest Du Dir überlegen: Was macht den Holzmichel aus? Der kann leben oder tot sein. Eine Ausgabe gehört da aber nicht rein!
Die Idee dabei ist, dass Du alles einmal schreibst an Logik. Das kann dann hinterher in einem Konsolen-Programm ungesetzt werden. Oder in einem Programm mit UI (Swing, JavaFX, ..) oder gar in einer Web Applikation. Das interessiert den Holzmichel nicht.

Damit hat man noch eine weitere Klasse - nennen wir diese einfach mal Controller. Der ist dann für die Ausgabe und den Programmablauf zuständig. Die Ausgabe kann man da auch rein packen oder man macht das in eine separate Klasse. Das ist aber eine Trennung, die in einer Konsolen-Applikation eher schwer und unüblich ist. (Das wäre dann sowas wie eine View, so Du dass trennen wolltest. Da wäre dann sowas wie getBaumDurchmesser als Methode, die dann den Benutzer fragt und eine Eingabe entgegen nimmt und zurück gibt.
Oder printHolzmichelLebt als eine Methode die ausgibt, dass der Holzmichel noch lebt.

Sowas könnte man hier aufbauen, dann hättest Du an Klassen:
- Controller für den eigentlichen Spielablauf
- View für Methoden zur Eingabe / Ausgabe
- HolzMichel für den HolzMichel und seine Werte
- LebensPunkte als Klasse für die Lebenspunkte (Wobei ich da noch kein Verhalten sehe, dass groß über ein einfachen int geht, aber egal!)
Und evtl. noch eine Klasse Main, die nur eine main Methode hat, die dann den Controller erzeugt und startet.
 

EinNickname9

Bekanntes Mitglied
Also der Tag, wo ganz wichtige Politiker ganz wichtige Reden halten, die nicht zum Einschlafen sind, und die dabei (ganz ironiefrei) betonen, wie wichtig Ostdeutschland doch ist... (währenddessen wird Musik gespielt) :D Ich kann es langsam nicht mehr hören.... So viel Heuchelei macht mich krank
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 2
H Einfache Frage zur Punktnotation objektname.methode(wert) Java Basics - Anfänger-Themen 2
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 3
B Rekursion Schneeflocke - Kurze Frage zur Methode Java Basics - Anfänger-Themen 11
M Frage zu HashCode Methode in Java Java Basics - Anfänger-Themen 7
M Frage zur Methode showMessageDialog Java Basics - Anfänger-Themen 3
A Frage zu einer Methode - Panel arbeitet nicht ordnungsgemäß Java Basics - Anfänger-Themen 2
A Frage Methode ggt Rekursiv Java Basics - Anfänger-Themen 5
B Frage zur methode CharAt Java Basics - Anfänger-Themen 11
M Frage zu main Methode Java Basics - Anfänger-Themen 11
R Frage zu statischer Methode toString() Java Basics - Anfänger-Themen 3
M Frage zur Methode Action.putValue(String,Object) Java Basics - Anfänger-Themen 5
M Frage zur Methode Thread.sleep() Java Basics - Anfänger-Themen 6
A Frage zu einer Methode Java Basics - Anfänger-Themen 20
U Frage über return Methode Java Basics - Anfänger-Themen 4
E Frage zur Methode size() der Klasse ZipFile Java Basics - Anfänger-Themen 2
B Frage zur Methode Java Basics - Anfänger-Themen 2
J Frage zu einer Methode Java Basics - Anfänger-Themen 2
C Frage zu negativen und positiven Exponenten in rekursiver Methode Java Basics - Anfänger-Themen 11
S Frage zur paint-Methode Java Basics - Anfänger-Themen 3
J Methode, Allgemeine Frage Java Basics - Anfänger-Themen 5
M Frage zu Erstellung von Methode Java Basics - Anfänger-Themen 17
H Frage zur Methode: actionPerformed Java Basics - Anfänger-Themen 2
J Java Frage zur Methode Java Basics - Anfänger-Themen 14
R frage zur read()-Methode des BufferedReader Java Basics - Anfänger-Themen 2
D Frage zum Aufruf einer toString-Methode Java Basics - Anfänger-Themen 2
G Frage zu der Methode first() bei SortedSet Java Basics - Anfänger-Themen 2
A Stack, Frage zur Methode push Java Basics - Anfänger-Themen 4
G Frage zu Finalize - Methode Java Basics - Anfänger-Themen 4
M Frage zu List.toArray()-Methode Java Basics - Anfänger-Themen 4
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12
R Input/Output Frage zu Java IO Java Basics - Anfänger-Themen 6
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
C Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
J Frage zum Loggen Java Basics - Anfänger-Themen 18
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
C Exception-Frage Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
S Frage des Designs Java Basics - Anfänger-Themen 1
JavaTalksToMe Extends/Implements Frage Java Basics - Anfänger-Themen 3
pkm Frage zu Servletfunktion Java Basics - Anfänger-Themen 0
B Frage zur Währungsumrechnung Java Basics - Anfänger-Themen 3
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
D Frage zur IDE IntelliJ IDEA Java Basics - Anfänger-Themen 6
H Frage zum 2d Array Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
I Frage zu SkipList Java Basics - Anfänger-Themen 4
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
J Kleine Frage zu OOP Java Basics - Anfänger-Themen 371
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
F Frage zu Iteratoren Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur ArrayList Java Basics - Anfänger-Themen 15
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
H Frage zur ermittlung eines doppelte Paars aus Sotieralgorithmus Java Basics - Anfänger-Themen 4
H Frage zum Array Java Basics - Anfänger-Themen 17
G Schach -Frage 2- Maussteuerung Java Basics - Anfänger-Themen 7
G Schach in Java - Allgemeine Frage zur Architektur Java Basics - Anfänger-Themen 7
B Fachliche Frage bei Rechnungen Java Basics - Anfänger-Themen 16
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
B Frage zu Datenbank Design - Rechnungen, Angebote... und deren Positionen Java Basics - Anfänger-Themen 4
H Frage zur if-Bedingung bzw switch case Java Basics - Anfänger-Themen 6
H Frage um Eingbeaufforderung zu realisieren Java Basics - Anfänger-Themen 4
H Frage zu Methoden/Funktionen Java Basics - Anfänger-Themen 3
X Frage zur einer ArrayList in einer ArrayList Java Basics - Anfänger-Themen 5
S Frage zu Scanner Java Basics - Anfänger-Themen 3
M Rationale Zahl erkennen - Kurze Frage zum Restwert nach Division Java Basics - Anfänger-Themen 3
D Komplizierte Frage zum Writer Java Basics - Anfänger-Themen 4
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
G Frage an die Experten Java Basics - Anfänger-Themen 39
H Frage zu fehler Java Basics - Anfänger-Themen 24

Ähnliche Java Themen


Oben