[英]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.