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