Frage von Emanuel2003, 64

Java meine Methode funktioniert nicht so wie ich es will! Aber warum?

Hey, ich habe eine Klasse programmiert und eine der Methoden ist diese hier. Allerdings soll es ja wenn hour == 0 ist, 59 minuten herunterzählen, und wenn minutes == 0 ist dann soll es alles in Sekunden herunterzählen, und wenn seconds == 0 dann soll es in Millisekunden herunterzählen! Aber es geht nicht! BITTE HELFEN! Hier der Code:

public void setHour(int hour) {

    System.out.println(hour + " Hours remaining.");
    hour--;
    
    try {
        
        Thread.sleep(3600000);
        
    } catch (InterruptedException e) {
        
        e.printStackTrace();
        
    }
    
    if(hour == 0) {
        int mhour = 59;
        System.out.println(mhour + " Minutes remaining.");
        mhour--;
        
        try {
            
            Thread.sleep(60000);
            
        } catch (InterruptedException e) {
            
            e.printStackTrace();
            
        }
        
    }
    
    if(mhour == 0) {
        int shour = 59;
        System.out.println(shour + " Seconds remaining.");
        shour--;
        
        try {
            
            Thread.sleep(1000);
            
        } catch (InterruptedException e) {
            
            e.printStackTrace();
            
        }
        
    }
    
    if(shour == 0) {
        int mshour = 1000;
        System.out.println(mshour + " Milliseconds remaining.");
        mshour--;
        
        try {
            
            Thread.sleep(1);
            
        } catch (InterruptedException e) {
            
            e.printStackTrace();
            
        }
        
    }
    
    if(mshour == 0) {
        System.out.println("The Countdown is over!");
        
    }
    
}
Antwort
von ceevee, 30

Du hast in deiner Funktion keine Schleife, wahrscheinlich wirst du (in der Funktion oder ausserhalb) auch Threads brauchen, damit deine Anwendung nicht stundenlang blockiert. Und deine Variablennamen sind hochgradig unglücklich gewählt - was ist "mshour"? Eine Millisekundenstunde?

Ich würde das ganze Problem mit dem Datetime-Objekt lösen, anstatt mit zig Integern rumzuhantieren.

https://docs.oracle.com/javase/tutorial/datetime/iso/datetime.html

Und wenn es ein naiver Ansatz sein soll, dann würde ich die Stunden am Anfang der Funktion in Millisekunden umrechnen und dann in der Funktion in Millisekunden rechnen und auch immer diese Millisekunden an sleep() übergeben. Mit beispielsweise 

if (milliseconds > 60 * 60 * 1000)

kannst du feststellen, ob die Zeit noch größer als eine Stunde ist.

Antwort
von ymicky, 25

Wie kann der Code überhaupt kompilieren? Du greifst doch in den If Abfragen auf Variablen zu die nur auf dem Stack, also in einer If Abfrage gültig sind?
Außerdem solltest du in Anwendungen die nicht mit Multithreading arbeiten definitiv auf Sleepfunktionen verzichten

Expertenantwort
von KnusperPudding, Community-Experte für Java, 38

 Aber es geht nicht! 

Was genau geht nicht ?

Was man nur sofort sieht: Du deklarierst

int mhour = 59;

innerhalb einer If-Bedingung. Entsprechend steht dir die Variable

außerhalb

nicht zur Verfügung.

dasselbe gilt für shour

Davon abgesehen wartet dein Code ständig dank Thread.sleep. Ist das wirklich das, was du in deinem Code machen willst?

Bitte sprich dein Problem konkret an.

Kommentar von Emanuel2003 ,

Also man gibt an wie lange Hour sein soll. Dann zählt er herunter auf Hour 0 (in stunden) wenn er bei Hour == 0 angekommen ist dann soll er in Minuten herunterzählen und wenn Minute == 0 ist dann soll er in Sekunden herunterzählen, und wenn Sekunden == 0 ist dann soll er in Millisekunden herunterzählen! Und wenn Millisekunde == 0 ist dann soll er System.out.println("Der Countdown ist zu ende!").

Aber Wenn er bei hour == 0 ist dann giebt er 
System.out.println("Der Countdown ist zu ende!") aus!

Und das will ich nicht!

Kommentar von KnusperPudding ,

nehmen wir mal das Beispiel und sagen: 2 Stunden.

Dann sieht dein Aufruf so aus:

setHour(2);

Zeile 1 gibt aus: 2 Stunden.

Der Wert "hour" wird dann um 1 gemindert und entspricht nun 1.

Dann lässt du den Thread eine Stunde lang warten. und prüfst anschließend ob Stunde = 0 ist. Was hier gar nicht der Fall ist. Somit Endet hier deine Methode ohne weiteren Output.

Wenn Heruntergezählt werden soll, benötigst du Schleifen. z.B. so:

for (int seconds = 59; seconds >= 0; seconds--) {
    TimeUnit.SECONDS.sleep(1);
    System.out.println("Countdown: " + seconds);
}
Antwort
von LeonardM, 34

Ja wie wärd mit nem loop? XDD

Kommentar von Emanuel2003 ,

Hab noch nie mit loops gearbeitet. Wie geht das?

Kommentar von ceevee ,

Öhm... dann solltest du dir ein Java-Buch / Tutorial schnappen und dieses mal von Anfang bis Ende durchlesen, Schleifen kommen in jedem Grundlagenbuch vor.

Es gibt einen Unterschied zwischen "programmieren" und "irgendwelchen Code ausm Internet zusammenkratzen, bis alles halbwegs funktioniert, man aber nicht kapiert, warum eigentlich". ;)

Kommentar von Schachpapa ,

Learning by reading - learning by doing - learning by stackoverflow ;-)

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten