60th minute printed in java clock

I'm not sure why this happens, but the 60th minute is printed in the results, when it should change by an hour after minute 59.

Here is my class and main program:

public class Main {
    public static void main(String[] args) {
        BoundedCounter minutes = new BoundedCounter(59);
        BoundedCounter hours = new BoundedCounter(23);

        int i = 0;
        while (i < 121) {
            System.out.println(hours + ":" + minutes);   // the current time printed
            if (minutes.getValue() >= 59) {
                hours.getValue();
                i++;
            }
        }
    }

// BoundedCounter

    public class BoundedCounter {
        private int value;
        private int upperLimit;

        public BoundedCounter(int upperLimit) {
            this.upperLimit = upperLimit;
        }

        public void next() {
            if (this.value >= this.upperLimit) {
                this.value = 0;
            } else {
                this.value++;
            }
        }

        public String toString() {
            if (this.value < 10) {
                return "" + 0 + value;
            } else {
                return "" + value;
            }
        }

        public int getValue() {
            if (this.value <= this.upperLimit) {
                return this.value++;
            } else {
                return this.value = 0;
            }
        }
    }
}

Some results:

1:56 1:57 1:58 1:59 02:60 2:00 2:01 2:02 2:03 2:04 2:05 2:06 2:07 2:08 2:09 2:10 2: 11 2:12 2:13 2:14 2:15 2:16 2:17 2:18 2:19 2:20 2:21 2:22 2:23 2:24 2:25 2:26 2:27 2 : 28 2:29 2:30 2:31 2:32 2:33 2:34 2:35 2:36 2:37 2:38 2:39 2:40 2:41 2:42 2:43 2:44 2:45 2:46 2:47 2:48 2:49 2:50 2:51 2:52 2:53 2:54 2:55 2:56 2:57 2:58 2:59 03:60 3: 00 3:01 3:02 3:03 3:04 3:05

i.e. 2:60 and 3:60 - unexpected exit

+4
source share
4

-, , . , getValue() , . :

Main.java

public class Main {
    public static void main(String[] args) {
        BoundedCounter minutes = new BoundedCounter(59);
        BoundedCounter hours = new BoundedCounter(23);

        int i = 0;
        while (i < 121) {
            System.out.println(hours + ":" + minutes);

            minutes.next();                 // counting minutes
            if (minutes.getValue() == 0) {  // when minutes==0, count hours
                hours.next();               // counting hours
                i++;
            }
        }
    }
}

BoundedCounter.java

class BoundedCounter {
    private int value;
    private int upperLimit;

    public BoundedCounter(int upperLimit) {
        this.upperLimit = upperLimit;
    }

    public void next() {
        // when reach the upperLimit, the next value should be 0
        // so >= is not needed, just == will do
        this.value = this.value == this.upperLimit ? 0 : this.value+1;
    }

    public String toString() {
        // using smarter approach to pad with zeros :)
        return String.format("%02d", value);
    }

    public int getValue() {
        // this method should only return the value, not change it in any way
        return this.value;
    }
}

:

00:00 00:01 00:02 00:03 00:04 00:05 00:06 00:07 00:08 00:09 00:10 00:11 00:12 00:13 00:14 00:15 00:16 00:17 00:18 00:19 00:20 00:21 00:22 00:23 00:24 00:25 00:26 00:27 00:28 00:29 00:30 00:31 00:32 00:33 00:34 00:35 00:36 00:37 00:38 00:39 00:40 00:41 00:42 00:43 00:44 00:45 00:46 00:47 00:48 00:49 00:50 00:51 00:52 00:53 00:54 00:55 00:56 00:57 00:58 00:59 01:00 01:01 01:02 01:03 01:04 01:05 01:06 01:07 01:08 01:09 01:10 01:11 01:12 01:13 01:14 01:15 01:16 01:17 01:18 01:19 01:20 01:21 01:22 01:23 01:24 01:25 01:26 01:27 01:28 01:29 01:30 01:31 01:32 01:33 01:34 01:35 01:36 01:37 01:38 01:39 01:40 01:41 01:42 01:43 01:44 01:45 01:46 01:47 01:48 01:49 01:50 01:51 01:52 01:53 01:54 01:55 01:56 01:57 01:58 01:59 02:002:01

+2

:

if (this.value <= this.upperLimit) {
    return this.value++;

to

if (++this.value <= this.upperLimit) {
    return this.value;

if (minutes.getValue() >= 59) {

to

if (minutes.getValue() == 0) {

, 59 , <= 59, if. 59 , 60.

, 60, getValue(), 0.

, , 24...

, "" , , , , , . , . Shadowfax answer.

+1

- , , , , getValue.

public int getValue() {
    if (this.value <= this.upperLimit) {
        return this.value++;
    } else {
        return this.value = 0;
    }
}

this.value++; 60 .

0
source

there is a small problem in your approach to creating a BoundedCounter you should not change the value of the counter when your method name says that you just want to read it. Secondly, all of your checks for conditions for drops should only happen inside your BoundedCounter class. If you want to reset, your counter simply sets a different method for this.

Here is a working solution for your reference

import java.util.*;

public class Test{

    public static void main(String[] args){
        BoundedCounter minutes = new BoundedCounter(59);
        BoundedCounter hours = new BoundedCounter(23);
        int i = 0;
        while (i < 121) {
            if (minutes.hasNext()) {
                minutes.next();
            } else {
                hours.next();
                minutes.resetTo(0);
            }
            System.out.println(hours + ":" + minutes);
            i++;
        }
    }
}

class BoundedCounter {
    private int value;
    private int upperLimit;

    public BoundedCounter(int upperLimit) {
        this.upperLimit = upperLimit;
    }

    public void next() {
        ++this.value;
    }

    public boolean hasNext() {
        return this.value < this.upperLimit;
    }

    public void resetTo(int resetValue) {
        this.value = resetValue;
    }

    public int getValue() {
        if (this.hasNext()) {
            return this.value;
        }
        return 0;
    }

    public String toString() {
        if (this.value < 10) {
            return "" + 0 + value;
        } else {
            return "" + value;
        }
    }

}
0
source

All Articles