java中的stackoverflow错误

我是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,而不是每次尝试获取变量时都进行此计算。

不能解决递归问题,但您还应该考虑在施工时检查价格。
有时(大多数情况下?)最好是你的构造函数失败而不是允许构造一个不一致的对象。 这样,更容易本地化这样的错误。
例:

 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检查以进行开发,并且可以在生产时关闭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(); } ... } 

您的getpricegetprice为:

 return price < 0 ? 0 : price; 

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