Sieht jemand was, was ich nicht sehe...? (Debugging)

White_Fox

Top Contributor
Moin allerseits.

Sieht irgendjemand, warum die TimerTaskmethode nur einmal ausgeführt wird? typeSpeedIntervall ist mit 2.000 belegt, damit der Task alle zwei Sekunden ausgeführt wird.

Java:
    private void setTypeSpeedTimer() {
        typeSpeedTimer = new Timer();
        typeSpeedTimer.scheduleAtFixedRate(new TimerTask() {
            private long speedCorrectionFactor = 60000 / typeSpeedIntervall;

            @Override
            public void run() {
                calculatedTypeSpeed = (int) (characterCounter * speedCorrectionFactor);
                characterCounter = 0;
            }
        }, 0, typeSpeedIntervall);
    }
 

Oneixee5

Top Contributor
s. API:
Mit Java 5.0 wurde das Paket java.util.concurrent eingeführt, und eines der darin enthaltenen Dienstprogramme für die Gleichzeitigkeit ist der ScheduledThreadPoolExecutor, ein Thread-Pool für die wiederholte Ausführung von Aufgaben mit einer bestimmten Rate oder Verzögerung. Er ist ein vielseitigerer Ersatz für die Timer/TimerTask-Kombination, da er mehrere Service-Threads zulässt, verschiedene Zeiteinheiten akzeptiert und keine Unterklassifizierung von TimerTask erfordert (implementieren Sie einfach Runnable). Die Konfiguration von ScheduledThreadPoolExecutor mit einem Thread macht ihn äquivalent zu Timer.

Übersetzt mit DeepL.com (kostenlose Version)
 

KonradN

Super-Moderator
Mitarbeiter
Du setzt nur Werte in den zwei Variablen? Sind diese volatile? Wenn Du aus mehreren Threads auf Variablen zugreifst, dann sollten diese volatile sein (So man kein Locking verwendet):
The Java programming language allows threads to access shared variables (§17.1). As a rule, to ensure that shared variables are consistently and reliably updated, a thread should ensure that it has exclusive use of such variables by obtaining a lock that, conventionally, enforces mutual exclusion for those shared variables.

The Java programming language provides a second mechanism, volatile fields, that is more convenient than locking for some purposes.

A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable (§17.4).

Sprich: Evtl. wird es mehrfach ausgeführt nur eben siehst Du Änderungen im anderen Thread einfach nicht ...
 

White_Fox

Top Contributor
Habe ich den Fehler eigentlich genau beschrieben?

Das Problem ist, daß die run-Methode genau einmal aufgerufen wird - und danach nicht mehr. Zumindest hält der Debugger dort nur einmal an.

Ich habe die ganze Angelegenheit mal nach dem Vorschlag von @Oneixee5 umgebaut:

Java:
    private class TypeSpeedCalculator implements Runnable {
        private long speedCorrectionFactor = 60000 / typeSpeedIntervall;

        @Override
        public void run() {
            calculatedTypeSpeed = (int) (characterCounter * speedCorrectionFactor);
            characterCounter = 0;
        }

    }

    private void setTypeSpeedTimer() {
        threadPool = new ScheduledThreadPoolExecutor(1);

        Runnable typeSpeedTask = new TypeSpeedCalculator();
        threadPool.scheduleAtFixedRate(typeSpeedTask, 0, 1, TimeUnit.SECONDS);
    }

Aber das ScheduledThreadPoolExecutor habe ich exakt dasselbe Theater: Die Methode wird exakt einmal aufgerufen - und danach nie wieder.

Ich stelle hier mal die ganze Klasse rein:
Java:
import java.util.HashSet;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 *
 */
public class TypingTrainer {

    private boolean isNumRowEnabled;
    private boolean isUpperRowEnabled;
    private boolean isMiddleRowEnabled;
    private boolean isLowerRowEnabled;
    private Skillmode skillmode;
    private Fingermode fingermode;

    private String nextCharactersequenceToType = "";
    private String inputBuffer = "";
    private HashSet<String> trainingCharacters;
    private final int minimumSequenceLength = 20;

    private int errors = 0;
    private int characterCounter = 0;
    private int calculatedTypeSpeed = 0;
    private Timer typeSpeedTimer;
    private ScheduledThreadPoolExecutor threadPool;
    private final long typeSpeedIntervall = 2000; // Time in ms for type speed measurement

    // String regexFilterPhrase = "[^[ёа-я]|[0-9]|[^\b]]";
    // private Pattern userInputFilter;
    private View view;

    public static int SKILLMODE_MIN = 1;
    public static int SKILLMODE_MAX = 3;
    public static int FINGERMODE_MIN = 2;
    public static int FINGERMODE_MAX = 5;

    private class TypeSpeedCalculator implements Runnable {
        private long speedCorrectionFactor = 60000 / typeSpeedIntervall;

        @Override
        public void run() {
            calculatedTypeSpeed = (int) (characterCounter * speedCorrectionFactor);
            characterCounter = 0;
        }

    }

    public TypingTrainer() {
        isNumRowEnabled = false;
        isUpperRowEnabled = false;
        isMiddleRowEnabled = true;
        isLowerRowEnabled = false;
        skillmode = Skillmode.GREENHORN;
        fingermode = Fingermode.WITH_INDEXFINGER;

        trainingCharacters = new HashSet<>();
        refreshTrainingCharacters();
        refreshTypeSequence();

        setTypeSpeedTimer();
    }

    public void setView(View view) {
        this.view = view;
    }

    private void setTypeSpeedTimer() {
        threadPool = new ScheduledThreadPoolExecutor(1);

        Runnable typeSpeedTask = new TypeSpeedCalculator();
        threadPool.scheduleAtFixedRate(typeSpeedTask, 0, 1, TimeUnit.SECONDS);
        /*
         * typeSpeedTimer = new Timer();
         * typeSpeedTimer.scheduleAtFixedRate(new TimerTask() {
         * private long speedCorrectionFactor = 60000 / typeSpeedIntervall;
         *
         * @Override
         * public void run() {
         * calculatedTypeSpeed = (int) (characterCounter * speedCorrectionFactor);
         * characterCounter = 0;
         * }
         * }, 0, typeSpeedIntervall);
         */

    }

    String textToType() {
        return nextCharactersequenceToType;
    }

    void feedWithUserInput(String userInput) {
        filterFormatAndConcat(userInput);
        processUserInput();
    }

    private void filterFormatAndConcat(String userInput) {
        userInput = userInput.toLowerCase();
        // userInput = userInput.replaceAll("[0-9\\sа-яА-ЯёЁ]", "");
        // userInput = userInput.replaceAll("[^[a-z]|[0-9]|[^\b]]", "");

        if (userInput.replaceAll("[0-9\\sа-яА-ЯёЁ]", "").equals("")) {
            inputBuffer = inputBuffer.concat(userInput);
        } else {
            view.showMistypeErrorMsg();
        }
    }

    private void processUserInput() {
        while (!inputBuffer.isEmpty()) {
            String nextInputCharacter = inputBuffer.substring(0, 1);
            inputBuffer = inputBuffer.substring(1, inputBuffer.length());

            if (nextInputCharacter.equals(nextCharactersequenceToType.substring(0, 1))) {
                characterCounter++;
                nextCharactersequenceToType = nextCharactersequenceToType.substring(1,
                        nextCharactersequenceToType.length());
                if (nextCharactersequenceToType.length() < minimumSequenceLength) {
                    refreshTypeSequence();
                }
            } else {
                errors++;
            }
        }
    }

    private void refreshTypeSequence() {
        while (nextCharactersequenceToType.length() < minimumSequenceLength) {
            String quatrupel = "";
            switch (skillmode) {
                case GREENHORN:
                    quatrupel = addSimpleQuatriple();
                    break;
                case MIDDLE:
                    quatrupel = addMiddleQuatriple();
                    break;
                case REALISTIC:
                    quatrupel = addRealisticQuatriple();
            }
            if (nextCharactersequenceToType.isEmpty()) {
                nextCharactersequenceToType = nextCharactersequenceToType.concat(quatrupel);
            } else {
                nextCharactersequenceToType = nextCharactersequenceToType.concat(" " + quatrupel);
            }
        }
    }

    private String addSimpleQuatriple() {
        String c = getRandomCharacter();
        return c + c + c + c;
    }

    private String addMiddleQuatriple() {
        String c1 = getRandomCharacter();
        String c2 = getRandomCharacter();
        return c1 + c1 + c2 + c2;
    }

    private String addRealisticQuatriple() {
        String quatrupel = "";
        for (int i = 0; i < 4; i++) {
            quatrupel = quatrupel + getRandomCharacter();
        }
        return quatrupel;
    }

    private String getRandomCharacter() {
        var random = new Random().nextInt(trainingCharacters.size());
        int element = 0;
        for (String s : trainingCharacters) {
            if (element == random) {
                return s;
            }
            element++;
        }
        throw new RuntimeException("Bad random");
    }

    private void refreshTrainingCharacters() {
        HashSet<String> enabledCharactersByKeyboardRows = new HashSet<>();
        if (isNumRowEnabled) {
            enabledCharactersByKeyboardRows.addAll(KeyboardRow.NUMROW.characters());
        }
        if (isUpperRowEnabled) {
            enabledCharactersByKeyboardRows.addAll(KeyboardRow.UPPERROW.characters());
        }
        if (isMiddleRowEnabled) {
            enabledCharactersByKeyboardRows.addAll(KeyboardRow.MIDDLEROW.characters());
        }
        if (isLowerRowEnabled) {
            enabledCharactersByKeyboardRows.addAll(KeyboardRow.LOWERROW.characters());
        }

        HashSet<String> enabledCharactersByFingerselection = new HashSet<>();
        switch (fingermode) {
            case WITH_INDEXFINGER:
                enabledCharactersByFingerselection.addAll(Fingermode.WITH_INDEXFINGER.characters());
                break;
            case WITH_MIDDLEFINGER:
                enabledCharactersByFingerselection.addAll(Fingermode.WITH_INDEXFINGER.characters());
                enabledCharactersByFingerselection.addAll(Fingermode.WITH_MIDDLEFINGER.characters());
                break;
            case WITH_RINGFINGER:
                enabledCharactersByFingerselection.addAll(Fingermode.WITH_INDEXFINGER.characters());
                enabledCharactersByFingerselection.addAll(Fingermode.WITH_MIDDLEFINGER.characters());
                enabledCharactersByFingerselection.addAll(Fingermode.WITH_RINGFINGER.characters());
                break;
            case WITH_PINKY:
                enabledCharactersByFingerselection.addAll(Fingermode.WITH_INDEXFINGER.characters());
                enabledCharactersByFingerselection.addAll(Fingermode.WITH_MIDDLEFINGER.characters());
                enabledCharactersByFingerselection.addAll(Fingermode.WITH_RINGFINGER.characters());
                enabledCharactersByFingerselection.addAll(Fingermode.WITH_PINKY.characters());
                break;
        }
        enabledCharactersByFingerselection.retainAll(enabledCharactersByKeyboardRows);
        trainingCharacters = enabledCharactersByFingerselection;
    }

    public boolean isNumRowEnabled() {
        return isNumRowEnabled;
    }

    public boolean isUpperRowEnabled() {
        return isUpperRowEnabled;
    }

    public boolean isMiddleRowEnabled() {
        return isMiddleRowEnabled;
    }

    public boolean isLowerRowEnabled() {
        return isLowerRowEnabled;
    }

    void enableNumRow(boolean numRowState) {
        isNumRowEnabled = numRowState;
        refreshTrainingCharacters();
    }

    void enableUpperRow(boolean upperRowState) {
        isUpperRowEnabled = upperRowState;
        refreshTrainingCharacters();
    }

    void enableMiddleRow(boolean middleRowState) {
        isMiddleRowEnabled = middleRowState;
        refreshTrainingCharacters();
    }

    void enableLowerRow(boolean lowerRowState) {
        isLowerRowEnabled = lowerRowState;
        refreshTrainingCharacters();
    }

    void setFingermode(int i) {
        fingermode = fingermode.fromInt(i);
        refreshTrainingCharacters();
    }

    int getFingermode() {
        return Fingermode.fromFingermode(fingermode);
    }

    void setSkillmode(int i) {
        skillmode = skillmode.fromInt(i);
        refreshTrainingCharacters();
    }

    int getSkillmode() {
        return Skillmode.fromSkillmode(skillmode);
    }

    public int getErrorCnt() {
        return errors;
    }

    public int getSpeedCnt() {
        return calculatedTypeSpeed;
    }

    void terminate() {
        if (typeSpeedTimer != null) {
            typeSpeedTimer.cancel();
            typeSpeedTimer.purge();
            typeSpeedTimer = null;
        }
        threadPool.shutdown();
    }
}


Edit:
@Konrad Da hast du recht, guter Punkt. Um konkurierende Zugriffe sollte ich mich da nochmal kümmern. Aber erklärt das, weshalb die Methode nur einmal aufgerufen wird?
 

KonradN

Super-Moderator
Mitarbeiter
Also Du hast den Debugger verbunden und ein Breakpoint in der run Methode. Und der Debugger geht nur einmal in die run Methode. Das wäre das Fehlerbild, richtig?

Das wird aber immer weiter ausgeführt bis eben eines der folgenden Dinge passiert:
The sequence of task executions continues indefinitely until one of the following exceptional completions occur:

Subsequent executions are suppressed. Subsequent calls to isDone() on the returned future will return true.

  • Der erste Punkt entfällt, denn Du machst mit dem future nichts.
  • Du hast die Methode terminate, in der Du shutdown aufrufst. Bitte prüfe einmal, ob die Ausführung evtl. da reinläuft bzw. prüf deine Logik, ob das evtl. aufgerufen wird.
  • Ich sehe bei den beiden Zuweisungen keine Möglichkeit für eine Exception. Die Multiplikation + Cast und die Zuweisung von 0 sollten beide keinerlei Exception werfen können.

Daher tippe ich auf einen terminate Aufruf. Prinzipiell könnte man auch einmal prüfen, ob der Debugger nicht irgend ein Problem hat - einfach mal Ausgaben an stderr machen in run und in terminate - das ist etwas, das ich im Zweifelsfall immer kurz einbaue nur um sicher zu gehen, dass wirklich nur (k)ein Aufruf stattfindet. (Aber der Debugger ist sonst auch etwas, dem ich vertraue ...)
 

White_Fox

Top Contributor
@KonradN du hast Recht: Ich rufe unbeabsichtigt die terminate-Methode auf, gleich nachdem die View präsentiert wird.

Ich ging – ohne das zu prüfen – davon aus daß die Methode in der ich ein Fenster anzeige blockierens sein würde. Ich habe vorher ein anderes GUI-Framework benutzt, da war das so. Mal sehen wie ich da eine künstliche Blockade reinbekomme...while-Schleife mit Thread.sleep, solange das Fenster nicht geschlossen ist oder sowas vielleicht.
 

KonradN

Super-Moderator
Mitarbeiter
Das Normale Vorgehen ist aus meiner Sicht, dass man das dem UI Thread überlässt. Man hat keinen blockierten Thread. Threads sind halt Schwergewichte (von den neuen virtuellen Threads einmal abgesehen) und die sollte man nicht unnötig haben, selbst wenn sie blockiert sind.

Du hast ein Fenster und das kann sich selbst verwalten. Wenn das Fenster geschlossen wird, dann kannst Du auf dieses Event reagieren und z.B. so einen Thread beenden. (Damit deutlich wird, dass das terminate aber aufgerufen werden muss, sollte Deine Klasse AutoClosable implementieren und statt terminate wäre das dann die Methode close())

Natürlich kann man sich auch selbst irgendwas bauen a.la. Dein Thread blockiert, beim Interrupt prüft es: Ist das Fenster noch offen? Wenn ja, blockiert er wieder ansonsten macht er weiter. Aber das ist eher unschön.

Die andere Alternative wären ggf. modale Dialoge. Sowas kann man natürlich auch nutzen, aber das ist meist eine schlechte Benutzererfahrung, da der Benutzer gezwungen wird, dieses Fenster erst zu schliessen. Als Benutzer will ich aber ggf. doch eben zurück zum anderen Fenster oder so... Daher verzichte ich auf sowas, wenn es irgendwie geht (Wobei es mich beruflich weniger betrifft, da ich weder Frontend noch UI/UX Themen beruflich behandle.... Habe da also eine eher Laienhafte Sichtweise und UI/UX Spezis werden da eine zumindest differenziertere Sichtweise haben...)
 

White_Fox

Top Contributor
So...ich habe jetzt zumindest etwas, das funktioniert.

Ob ich damit zufrieden sein will, weiß ich aber noch nicht. Ich will mal kurz einen Überblick geben, es geht um drei Klassen:
Java:
//Das eigentliche Programm, ist auch wirklich nur so groß.
public class Main {
    public static void main(String[] args) {
        System.setProperty("file.encoding", "UTF-8");
        TypingTrainer trainer = new TypingTrainer();
        View v = new SwingView(trainer);
        trainer.setView(v);
        v.showAndRun();
        trainer.terminate();
    }
}

//Die Programmlogik. Nimmt Benutzereingaben entgegen, liefert den String den der Benutzer abtippen soll,
//prüft auf Richtigkeit, zählt Fehler und ermittelt die Tippgeschwindigkeit.
//Nimmt auch Benutzereinstellungen entgegen und passt ihr Verhalten entsprechend an.
public class TypingTrainer {
    private int errors = 0;
    private int characterCounter = 0;
    private int calculatedTypeSpeed = 0;
    private Timer typeSpeedTimer;
    private final long typeSpeedIntervall = 1500; // Time in ms for type speed measurement

    private View view;
    
    public TypingTrainer() {
        //...
        setTypeSpeedTimer();
    }

    private void setTypeSpeedTimer() {
        typeSpeedTimer = new Timer();
        typeSpeedTimer.scheduleAtFixedRate(new TimerTask() {
            private long speedCorrectionFactor = 60000 / typeSpeedIntervall;

            @Override
            public void run() {
                calculatedTypeSpeed = (int) (characterCounter * speedCorrectionFactor);
                characterCounter = 0;
            }
        }, 0, typeSpeedIntervall);
    }
    
    void terminate() {
        if (typeSpeedTimer != null) {
            typeSpeedTimer.cancel();
            typeSpeedTimer.purge();
            typeSpeedTimer = null;
        }
    }
}

//Swingview zeigt nur Dinge an. Was sie wie anzeigt, wird von der TypingTrainer-Klasse gesteuert.
public class SwingView implements View {
    private final int statisticsRefreshDelay = 200;

    private boolean isClosed;

    public SwingView(TypingTrainer trainer) {
        this.trainer = trainer;
        isClosed = false;
    }

    private void initGUI() {
        //...baue GUI...
        windowFrame.addWindowListener(new WindowListener() {
            @Override
            public void windowClosing(WindowEvent e) {
                isClosed = true;
        });
    }

    @Override
    public void showAndRun() {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(SwingView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(SwingView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(SwingView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(SwingView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        initGUI();

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                windowFrame.setVisible(true);
            }
        });

        while (!isClosed) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

Damit daß nicht allzu unübersichtlich wird, habe ich es mal auf das Wesentliche zusammengestutzt.
Falls es jemand bemerkt hat: SwingView erbt von View, wobei View eine abstrakte Klasse ist und ledigich ein paar Methoden deklariert, sonst aber keinerlei Funktionalität enthält. Ursprünglich habe ich das Programm mal geschrieben, um ein GUI-Framework auszuprobieren. Und daher wollte ich die Möglichkeit, das GUI-Framework rasch austauschen zu können, gerne beibehalten. Das GUI-Framework, daß ich damals benutzt habe, hätte mir eine blockierende showAndRun()-Methode beschert, daher hat das so ganz gut funktioniert.

Im Moment habe ich das mit einer Warteschleife, nachdem ich die GUI initialisiert habe und anzeigen lasse, nachgebildet. Wie gesagt - es funktioniert so. Ich verstehe zwar das Argument von Konrad und sehe es auch selber so, daß es nicht gerade sauber aussieht einen Thread einfach so zu blockieren, aber ich habe ehrlich gesagt auch keine Idee, wie man es sonst machen könnte (mit der Maßgabe, bei Bedarf zum alten GUI-Framework zurückzukehren und dabei nur die View-Klasse zu tauschen). Habt ihr noch irgendwelche Vorschläge?
 

KonradN

Super-Moderator
Mitarbeiter
Also die Verantwortung vom Trainer würde ich bei der View sehen. Daher wird trainer.terminate() nicht in der main Routine aufgerufen. Statt dessen kommt der Aufruf einfach in die windowClosing Methode und ersetzt da das isClosed = true.
Damit kann dann auch die Schleife, die den Thread blockiert, entfallen. Das wird dann einfach ein Öffnen der View und fertig. Hat den Vorteil, dass Du dies auch prinzipiell aus anderen Threads heraus aufrufen kannst.

Die Problematik wird evtl. deutlich, wenn Du morgen feststellst, dass Du mehrere so toller Tools hast und Du willst die zusammenfassen. Also hast Du ein Fenster mit Knöpfen und das, was Du in main hast kommt dann in die Event Behandlung. Ups - damit ist der UI Thread blockiert.

Oder Du stolperst morgen über ein Best Practice, dass UI Elemente doch immer nur vom UI Thread erstellt und verändert werden sollen. Schwups: Dein showAndRun blockiert den UI Thread.

Ansonsten ist mit Java 8 ein Konstrukt wie
Java:
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                windowFrame.setVisible(true);
            }
        });
einfach zu unleserlich. Das ist ein Einzeiler wie: EventQueue.invokeLater( () -> windowFrame.setVisible(true) ); Wobei ich mich frage, wieso da nicht einfach ein windowFrame.setVisible(true): ausreichend ist. (Da kommt wohl das Best Practice mit rein ... bei einem Fenster spielt das aber keine Rolle, wenn Du das nicht auf dem UI Thread erzeugst und dann sichtbar machst. Das findet sich sehr oft und da scheint es keine Probleme zu geben., (Aber ja: Sowas sollte auf dem UI Thread laufen. Daher sieht man in der Main Methode oft Dinge wie ein invokeLater( () -> new MainWindow() ); oder so (das Fenster macht dann alles im Konstruktor incl. am ende das setVisible.

Das nur als kleine Hinweise. Toll, dass es erst einmal funktioniert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Getter/Setter - wie sieht ein Setter aus? Und wie nicht? Java Basics - Anfänger-Themen 34
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
I Java Programm sieht wie exe aus. Java Basics - Anfänger-Themen 3
B Wie sieht die Formel für eine Rechtecksschwingung aus? Java Basics - Anfänger-Themen 5
G Vererbung Sicherheitslücke? Reflection sieht members, die nicht sichtbar sein sollten?! Java Basics - Anfänger-Themen 11
M JButton sieht komisch aus :-) Java Basics - Anfänger-Themen 5
G Problem mit Zeichen Zeilenumbruch sieht aus wie(Eckige Null) Java Basics - Anfänger-Themen 4
T Wie sieht ein '.' im regulären Ausdruck aus? Java Basics - Anfänger-Themen 2
T JEditorPane und Stylesheet.sieht komisch aus. Java Basics - Anfänger-Themen 6
G Compiler sieht die Bedingung nicht! Java Basics - Anfänger-Themen 5
F Kann mir jemand bei dem Fehler helfen? Java Basics - Anfänger-Themen 6
U Kann mir jemand helfen? Java Basics - Anfänger-Themen 2
T Kann mir jemand wörtlich erklären, was in dem Code genau passiert? Java Basics - Anfänger-Themen 1
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
C Kann mir jemand sagen warum public void unzulässig ist? Java Basics - Anfänger-Themen 2
C Kann mir jemand sagen warum ich nicht mal rechnen kann ? Java Basics - Anfänger-Themen 32
C Kann mir jemand helfen was mit diesen Fehlern gemeint ist ? Java Basics - Anfänger-Themen 12
M Kennt jemand die richtige Lösung? Java Basics - Anfänger-Themen 7
F Kann mir jemand kurz dieses Programm erklären? Java Basics - Anfänger-Themen 22
HeiTim Kann mir Jemand helfen ? Java Basics - Anfänger-Themen 11
H Versteht jemand diesen Codewars Error? Java Basics - Anfänger-Themen 8
M BerechneEtwas Weiss jemand woran es liegt Java Basics - Anfänger-Themen 8
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 2
M Kann mir jemand hier die Logik vermitteln? Java Basics - Anfänger-Themen 3
M Kann mir jemand die Logik erklären? Java Basics - Anfänger-Themen 1
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 9
T Ich habe eine Variabel die nicht Methoden übergreifend ist. Kann mir jemand Helfen :) Java Basics - Anfänger-Themen 5
marcooooo Kann mir jemand das Beispiel kurz erklären so ungefähr:/ Java Basics - Anfänger-Themen 7
G Weiß jemand wie man dieses Programm schreibt? Java Basics - Anfänger-Themen 84
A Kann mir Jemand erklären wie ich das iteriere? Java Basics - Anfänger-Themen 4
G Fehlersuche-kann mir jemand helfen? Java Basics - Anfänger-Themen 46
T Kann jemand kurz das Programm testen? Java Basics - Anfänger-Themen 13
T Aufgabe Flussdiagramm, kann jemand checken? Java Basics - Anfänger-Themen 8
J Hat jemand einen Lösungsansatz für diese Aufgabe? Java Basics - Anfänger-Themen 1
Y kann jemand die Terme mit Zahlen schreiben ?? Java Basics - Anfänger-Themen 4
R Kann mir hier jemand weiterhelfen? Java Basics - Anfänger-Themen 1
B Java -Turtle Grafik - kennt sich jemand damit aus? Java Basics - Anfänger-Themen 1
A Kann mir jemand dieses Programm erklären? Java Basics - Anfänger-Themen 1
B Kann mir jemand diese Bedingung erklären Java Basics - Anfänger-Themen 5
B Kann mir jemand erklären, warum hier dreimal was ausgegeben wird und nicht nur zweimal? Java Basics - Anfänger-Themen 16
B Könnte jemand über dieses jurze Javaprogramm schauen? Irgendwas funktioniert mit der z-Varible nicht Java Basics - Anfänger-Themen 2
E Input/Output Kann jemand meinen Code durchschauen? Java Basics - Anfänger-Themen 4
T Kann mir jemand sagen, was bei folgender for-Schleife passiert? Java Basics - Anfänger-Themen 1
F Versteht das jemand? -Java Java Basics - Anfänger-Themen 6
J TabelView - Kann mir jemand die Sequenz genau erklären ? Java Basics - Anfänger-Themen 2
K Könnte mir jemand erläutern, was der autor damit meint? Java Basics - Anfänger-Themen 5
J Kann mir bitte mal jemand diese Codes erklären? Java Basics - Anfänger-Themen 19
A Hat jemand einen ratschlag, wie java beim replaceALL eine geschweifte klammer erkennt ? Java Basics - Anfänger-Themen 5
H Java Hamster - kann mir jemand weiterhelfen? Java Basics - Anfänger-Themen 4
V kennt jemand empfehlenswerte online tutorials zur Hibernate ? gerne auch englisch. Java Basics - Anfänger-Themen 4
R Kann jemand diese Java Programmierung machen? Versteh ich leider nicht Java Basics - Anfänger-Themen 17
R weiß jemand warum Java diesen Fehler ausspuckt? "Variable might not hav been initialized" Java Basics - Anfänger-Themen 4
R kann mir jemand erklären was hier gemacht wurde? Java Basics - Anfänger-Themen 10
I kann mir jemand weiterhelfen, wo liegen die Fehler? Java Basics - Anfänger-Themen 3
E Kann mir jemand sagen was hier falsch ist? Java Basics - Anfänger-Themen 6
gonzoradio Hat jemand Erfahrung mit javavideokurs.de Java Basics - Anfänger-Themen 5
D Kann mir vielleicht jemand die reflexive Assoziation erklären? Java Basics - Anfänger-Themen 2
C Hat jemand Ahnung zum GCJ(Gnu Compiler for Java) Java Basics - Anfänger-Themen 7
S Kann mir jemand kurz die Vorteile des Iterators erklaeren..? Java Basics - Anfänger-Themen 8
M Kann mir bitte jemand "java.util.ArrayList" erklären? Java Basics - Anfänger-Themen 5
S Kennt jemand die Default-Cache Zeit beim Java-Plugin? Java Basics - Anfänger-Themen 2
B könnte nochmal jemand über mein Projekt schauen? Java Basics - Anfänger-Themen 4
S unschöne schleifen.jemand ne bessere idee Java Basics - Anfänger-Themen 4
K Kennt jemand ein gutes Tutorial für Wertübergabe? Java Basics - Anfänger-Themen 4
G Kann mir jemand das erklären? Java Basics - Anfänger-Themen 11
S Hat jemand eine Idee warum die JLabels nicht mehr farbig Java Basics - Anfänger-Themen 7
G Hoffe jemand kann mir ein paar Tips geben:binärer Suchbaum Java Basics - Anfänger-Themen 3
G Nutzt Jemand JCalendar? Java Basics - Anfänger-Themen 3
C Kann jemand mir helfen? Java Basics - Anfänger-Themen 15
N Kann mir bitte jemand helfen? Java Basics - Anfänger-Themen 6
M Kann mir jemand erklären, wie "static" funktionier Java Basics - Anfänger-Themen 2
A Signierte Exe Datei funktioniert nicht mehr Java Basics - Anfänger-Themen 1
A Signierte Exe Datei funktioniert nicht mehr Java Basics - Anfänger-Themen 3
C my_table.setRowSelectionAllowed(true) funktioniert nicht; Java Basics - Anfänger-Themen 0
B Warum funktioniert die Lösung von CodeGym aber meine nicht? Java Basics - Anfänger-Themen 3
P Wo NUR (!) JRE v18 oder v21 herunterladen? Also nicht volles JDK Java Basics - Anfänger-Themen 1
J shuffle cards wird nicht ausgeführt. Java Basics - Anfänger-Themen 2
J JTextField -> CaretPos bei SelectionStart() setzten nicht bei SelectionEnd() Java Basics - Anfänger-Themen 20
W Java-PRogramm liest als EXE-File Nicht USB, jedoch aus NetBeans Java Basics - Anfänger-Themen 45
I Webservice funktioniert nicht Java Basics - Anfänger-Themen 5
C Abbruch einer Schleife mit break, meine Übung funktioniert nicht richtig Java Basics - Anfänger-Themen 4
SarahXyy Ergebnisse stimmen nicht überein? Java Basics - Anfänger-Themen 11
thomas55 Erste Schritte Modul läuft in IntelliJ, nicht in NetBeans Java Basics - Anfänger-Themen 11
G Nicht ausführbares JAR, externe jars mit einbinden Java Basics - Anfänger-Themen 7
S Erstes Programm: Hallo Welt funktioniert nicht. Java Basics - Anfänger-Themen 3
O Obfuscateter Code lässt sich nicht ausführen? Java Basics - Anfänger-Themen 7
A "Hello World"-Programm läuft nicht Java Basics - Anfänger-Themen 16
G Regex greift nicht richtig Java Basics - Anfänger-Themen 4
G JTable den angezeigten WERT nicht den Wert aus dem Model ausgeben. Java Basics - Anfänger-Themen 3
G JTable Header ausgeblendete (width = 0) nicht per mouseDragged aufziehen. Java Basics - Anfänger-Themen 9
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
G JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
J Datenüberwachung funktioniert nicht Java Basics - Anfänger-Themen 9
S Wie debugge ich dies am besten: SingleThreadExecutor führt Task nicht aus..? Java Basics - Anfänger-Themen 29
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
N Klassen Hintergrundfarbe in JPanel ändert sich nicht Java Basics - Anfänger-Themen 3

Ähnliche Java Themen


Oben