我是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;
}
}
}
答案 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错误