java中的stackoverflow错误

时间:2010-02-06 04:13:41

标签: java

我是java的新手。我正在编写一个类,构造函数必须检查price参数并确保它不是负数。如果是负数,则必须将价格设置为零。检查价格时出现stackoverflow错误。我可以帮助我做错了吗?

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 个答案:

答案 0 :(得分:14)

您的getprice()方法调用自身而不是检查price。在这种情况下,这会导致无限递归。

答案 1 :(得分:1)

Ignacio解释了原因和解决方案:

更改行

if(getprice() < 0)

到此:

if(price < 0)

答案 2 :(得分:1)

您获得无限递归,因为您的if条件会检查您的getprice()方法,而不是price变量。

许多现代编译器会在您编写导致无限递归的内容时发出警告。

我有时候也会遇到这个错误,特别是对于有智能感知的IDE。

祝学习Java好运! :)

答案 3 :(得分:1)

当您编写bean时,通常需要检查所设置的价格是否为&lt; 0,而不是每次尝试获取变量时都进行此计算。

答案 4 :(得分:1)

递归问题不是治愈,但您还应考虑在施工时检查价格。
有时候(大多数时候?)你的构造函数失败更好,而不是允许构造一个不一致的对象。这样就可以更容易地定位这样的错误 示例:

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检查才能进行开发,并且可能会在生产时将其关闭。有关详细信息,请参阅Programming With Assertions

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();
    }
    ...
}

答案 5 :(得分:0)

您的getprice应简写为:

return price < 0 ? 0 : price;

顺便说一句,很高兴看到stackoverflow.com解决了stackoverflow错误