Tim
Tim

Reputation: 159

stackoverflow error in java

I'm a newbie in java. I'm writing a class where the constructor must check the price parameter and ensure it is not a negative number. And if it is negative, it must set the price to zero. I get a stackoverflow error when I check price. Can i get help with what I did wrong?

public class Book
{
    private String title;
    private String author;
    private String isbn;
    private int pages;
    private boolean pback;
    private double price;

    /**
     * Constructor for objects of class Book
     */
    public Book(String bookTitle, String bookAuthor, String bookCode, int bookPages, boolean paperback, double bookRetail)
    {
        title = bookTitle;
        author = bookAuthor;
        isbn = bookCode;
        pages = bookPages;
        pback = paperback;
        price = bookRetail;
    }

    /**
     * @returns title
     */

    public String gettitle()
    {
        return title;
    }

   /**
    * @returns author
    */

    public String getauthor()
    {
        return author;
    }

   /**
    * @returns ISBN#
    */

   public String getisbn()
    {
        return isbn; 
    }

   /**
    * @return number of pages
    */ 

   public int getpages()
    {
        return pages;
    }

   /**
    * @return is book paperback
    */ 

   public boolean getpback()
    {
        return pback;
    }

   /**
    * @return retail price
    */ 

   public double getprice() 
   {
       if(getprice() < 0)
       {
           return 0;
       } 
       else
       {
           return price;
       }

    }
}

Upvotes: 6

Views: 870

Answers (6)

fastcodejava
fastcodejava

Reputation: 41087

Your getprice should simply be written as :

return price < 0 ? 0 : price;

Btw, nice to see that a stackoverflow error is solved by stackoverflow.com

Upvotes: 0

user85421
user85421

Reputation: 29680

Not a cure for the recursion problem, but you should also consider checking the price at construction time.
Sometimes (most times?) it is better that your constructor fails with an Exception instead of allowing the construction of an inconsistent object. This way it is easier to localize such an Error.
Example:

public Book(String bookTitle, String bookAuthor, String bookCode, int bookPages, boolean paperback, double bookRetail)
{
    if (bookRetail < 0.0)
        throw new IllegalArgumentException("negative bookRetail: " + bookRetail);
    ...
}

The risk is that your application can fail when in the production environment, which can be a mess. To avoid this, you can use an assert or, at least, give out or log the error and use some alternative. The assert check must be turned on for development and may be turned off at production. For Detail see Programming With Assertions

public Book(String bookTitle, String bookAuthor, String bookCode, int bookPages, boolean paperback, double bookRetail)
{
    assert bookRetail >= 0.0 : bookRetail;
    ...
}

or

public Book(String bookTitle, String bookAuthor, String bookCode, int bookPages, boolean paperback, double bookRetail)
{
    if (bookRetail >= 0.0) {
        price = bookRetail;
    } else {
        price = 0.0;
        // display or log the "illegal argument"
        Exception ex = new IllegalArgumentException("negative bookRetail: " + bookRetail);
        ex.printStackTrace();
    }
    ...
}

Upvotes: 1

sdavids
sdavids

Reputation: 1537

When you write a bean you generally want to check if the price being set is < 0, instead of making this calculation every time you try to get the variable.

Upvotes: 1

Alex
Alex

Reputation: 65944

Your getting infinite recursion, because your if condition checks your getprice() method, not your price variable.

Many modern compilers will warn you when you have coded something that results in infinite recursion.

I still sometimes come across this error too, especially with IDE's that have intellisense.

Good luck learning Java! :)

Upvotes: 1

mauris
mauris

Reputation: 43619

Ignacio has explained the cause, and the solution:

Change the line

if(getprice() < 0)

to this:

if(price < 0)

Upvotes: 1

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 798526

Your getprice() method calls itself instead of checking price. This is leading to an infinite recursion in this case.

Upvotes: 14

Related Questions