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(); } ... }
您的getprice
应getprice
为:
return price < 0 ? 0 : price;
顺便说一句,很高兴看到stackoverflow.com解决了stackoverflow错误
- 如何编写一个程序,将一个整数序列读入一个数组,并计算数组中所有元素的交替总和?
- 逻辑OR运算符与按位OR运算符
- 目录分隔符不应出现在库名称中:Macintosh HD / Users / sakkisetty / Documents / dll / FasExtend.dll
- 如何在listview中显示??(使用okhttp库)
- 使用SpreadSheet API时无法完成HTTP请求
- 在非UI线程上实例化视图
- 如何正确使用load数组并保存数组方法?
- App Engine灵活环境Java servlet获取太多/ _ah / health请求
- 如何在Android开发中将jchar转换为JNi中的char?