簡體   English   中英

Java中的stackoverflow錯誤

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM