ошибка переполнения стека в Java - PullRequest
6 голосов
/ 06 февраля 2010

Я новичок в Java. Я пишу класс, где конструктор должен проверить параметр цены и убедиться, что он не является отрицательным числом. И если он отрицательный, он должен установить цену на ноль. Я получаю ошибку переполнения стека при проверке цены. Могу ли я получить помощь в том, что я сделал не так?

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;
       }

    }
}

Ответы [ 6 ]

14 голосов
/ 06 февраля 2010

Ваш метод getprice() вызывает себя вместо проверки price. В этом случае это приводит к бесконечной рекурсии.

1 голос
/ 06 февраля 2010

Не лекарство для решения проблемы рекурсии, но вы также должны рассмотреть возможность проверки цены во время строительства.
Иногда (чаще всего?) Лучше, чтобы ваш конструктор завершился с ошибкой с исключением, вместо того, чтобы разрешить создание несовместимого объекта. Таким образом, легче локализовать такую ​​ошибку.
Пример:

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

Существует риск того, что ваше приложение может выйти из строя в производственной среде, что может привести к путанице. Чтобы избежать этого, вы можете использовать assert или, по крайней мере, выдавать или регистрировать ошибку и использовать какую-то альтернативу. Проверка assert должна быть включена для разработки и может быть отключена при производстве. Подробнее см. Программирование с утверждениями

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

или

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();
    }
    ...
}
1 голос
/ 06 февраля 2010

Когда вы пишете бин, вы обычно хотите проверить, установлена ​​ли цена <0, вместо того, чтобы делать этот расчет каждый раз, когда вы пытаетесь получить переменную.

1 голос
/ 06 февраля 2010

Вы получаете бесконечную рекурсию, потому что ваше условие if проверяет ваш getprice() метод, а не переменную price.

Многие современные компиляторы предупреждают вас, когда вы кодируете что-то, что приводит к бесконечной рекурсии.

Я все еще иногда сталкиваюсь с этой ошибкой, особенно с IDE, которые имеют intellisense.

Удачи в изучении Java! :)

1 голос
/ 06 февраля 2010

Игнасио объяснил причину и решение:

Изменить строку

if(getprice() < 0)

к этому:

if(price < 0)
0 голосов
/ 06 февраля 2010

Ваш getprice должен быть просто записан как:

return price < 0 ? 0 : price;

Кстати, приятно видеть, что ошибка stackoverflow решается с помощью stackoverflow.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...