繁体   English   中英

Java中的stackoverflow错误

[英]stackoverflow error in 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;
       }

    }
}

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

Ignacio解释了原因以及解决方案:

换线

if(getprice() < 0)

对此:

if(price < 0)

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

当您编写了导致无限递归的代码时,许多现代的编译器都会警告您。

我有时还是会遇到此错误,尤其是具有智能感知功能的IDE。

祝您学习Java顺利! :)

当您编写bean时,通常希望检查所设置的价格是否小于0,而不是每次尝试获取变量时都进行此计算。

不是为递归问题治好 ,但你也应该考虑检查在施工时的价格。
有时候(大多数时候?)最好让构造函数以Exception 失败 ,而不是允许构造不一致的对象。 这样,更容易定位此类错误。
例:

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

您的getprice应该简单地写为:

return price < 0 ? 0 : price;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM