Check if Integer is too great

13,470

Solution 1

You can't store a value in an int, and then check to see whether it's too big for an int. Store it in a long instead.

long price = (long)primaryAmount * (long)this.price;

Solution 2

In Java 8, one approach would be to use

Math.addExact(int, int);

which according to Javadocs will throw an ArithmeticException if the result overflows an int. In other versions, I would recommend what Flight Odyssey suggested and use longs at least for these types of checks.

Share:
13,470

Related videos on Youtube

Tyluur
Author by

Tyluur

Updated on September 16, 2022

Comments

  • Tyluur
    Tyluur over 1 year

    I am working on an exchange system and the user is setting the price and amount for an exchange.

    I want to make sure that the exchange is no greater than the Integer maximum value, but I am running into a problem.

    When the amount of the exchange is put to 9 or more, even though I have a check to make sure the number is no greater than the maximum value, it does not work. I have done some debugging and when setting the amount to 9 while the price is 2,147,483,646 (1 less than the max number), it prints out this:

    2,147,483,630 - 9

    This is my debugging code, what should I add to it to make sure that this does not happen?

    public void setPrimaryAmount(int primaryAmount) {
            int price = primaryAmount * this.price;
            System.out.println(Misc.format(this.price * primaryAmount) + " - " + primaryAmount);
            if (price > Integer.MAX_VALUE ||
                    price == Integer.MAX_VALUE ||
                    price >= Integer.MAX_VALUE ||
                    price < 0 || price <= 0 ||
                    price++ == Integer.MAX_VALUE) {
                System.out.println("Attempted to set a bad amount.");
                return;
            }
            this.primaryAmount = primaryAmount;
        }
    

    "Attempted to set a bad amount" prints out until you enter an amount >= 9.

    • Ted Hopp
      Ted Hopp over 10 years
      You do realize, I hope, that tests like price < 0 || price <= 0 are redundant: price <= 0 is entirely sufficient. Likewise for price > Integer.MAX_VALUE || price == Integer.MAX_VALUE || price >= Integer.MAX_VALUE, except there's the added wrinkle that an integer variable can never be greater than Integer.MAX_VALUE so price == Integer.MAX_VALUE is all you need.
  • Radiodef
    Radiodef over 10 years
    Note that switching to longs for good ensures you can sell a planet without overflow.
  • Lee Fogg
    Lee Fogg over 10 years
    @Tyluur We accept as answer (select the tick) when we're happy an answer resolves our concern.