2010-02-06 26 views
6

Tôi là một newbie trong java. Tôi đang viết một lớp nơi hàm tạo phải kiểm tra tham số giá và đảm bảo nó không phải là số âm. Và nếu nó là tiêu cực, nó phải thiết lập giá bằng không. Tôi nhận được lỗi stackoverflow khi tôi kiểm tra giá. Tôi có thể được giúp đỡ với những gì tôi đã làm sai?lỗi stackoverflow trong java

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; 
     } 

    } 
} 
+4

+1 cho stackoverflow tự tham chiếu trên stackoverflow! – trashgod

+0

bây giờ một số có thể nhận ra tên của trang web có nghĩa là gì ... –

+0

Vì vậy, meta! Tôi tự hỏi liệu anh ta có đến đây bằng cách googling cho "stackoverflow".:-) – ibz

Trả lời

14

Phương thức của bạn tự thay vì kiểm tra price. Điều này dẫn đến một đệ quy vô hạn trong trường hợp này.

+1

+1, và bình luận về câu trả lời của Ignacio: IDE hiện đại sẽ nhận thấy sự đệ quy vô hạn và cảnh báo bạn về nó trong thời gian thực (tôi sử dụng IntelliJ và nó cảnh báo bạn về những lỗi như vậy, tôi chắc chắn các IDE khác cũng làm như vậy). – SyntaxT3rr0r

+1

bạn cũng có thể viết lại nó như sau: if (price <0) {return 0; } giá trả lại; Người khác là không cần thiết. – Woot4Moo

+3

Nếu bạn muốn nhận được * REALLY * picky bạn có thể viết nó là 'return Math.max (price, 0);'. –

1

Ignacio đã giải thích nguyên nhân và giải pháp:

Thay đổi dòng

if(getprice() < 0) 

này:

if(price < 0) 
1

nhận đệ quy vô hạn của bạn, bởi vì tình trạng if bạn kiểm tra getprice() của bạn , không phải biến số price của bạn.

Nhiều trình biên dịch hiện đại sẽ cảnh báo bạn khi bạn đã mã hóa thứ gì đó dẫn đến đệ quy vô hạn.

Tôi vẫn thỉnh thoảng gặp lỗi này, đặc biệt là với IDE có intellisense.

Chúc may mắn học Java! :)

1

Khi bạn viết một bean bạn thường muốn kiểm tra xem giá được đặt là < 0, thay vì thực hiện phép tính này mỗi khi bạn cố gắng lấy biến.

+1

Một newbie có thể gặp khó khăn trong việc hiểu khái niệm 'bean';) –

1

Không phải là chữa cho vấn đề đệ quy, nhưng bạn cũng nên xem xét kiểm tra giá tại thời điểm xây dựng.
Đôi khi (hầu hết các lần?) Thì tốt hơn là hàm tạo của bạn không thành công với Ngoại lệ thay vì cho phép tạo đối tượng không nhất quán. Bằng cách này, việc bản địa hóa một Lỗi như vậy sẽ dễ dàng hơn.
Ví dụ:

public Book(String bookTitle, String bookAuthor, String bookCode, int bookPages, boolean paperback, double bookRetail) 
{ 
    if (bookRetail < 0.0) 
     throw new IllegalArgumentException("negative bookRetail: " + bookRetail); 
    ... 
} 

Nguy cơ là ứng dụng của bạn có thể thất bại khi ở trong môi trường sản xuất, có thể là một mớ hỗn độn. Để tránh điều này, bạn có thể sử dụng số assert hoặc ít nhất, đưa ra hoặc ghi lại lỗi và sử dụng một số thay thế. Kiểm tra assert phải được bật để phát triển và có thể bị tắt khi sản xuất. Đối với chi tiết thấy Programming With Assertions

public Book(String bookTitle, String bookAuthor, String bookCode, int bookPages, boolean paperback, double bookRetail) 
{ 
    assert bookRetail >= 0.0 : bookRetail; 
    ... 
} 

hoặc

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(); 
    } 
    ... 
} 
+0

Chỉ cần chắc chắn rằng khi bạn đang thực hiện một mẫu IDisposable/Finalizer, nó có thể xử lý một đối tượng được xây dựng một phần. – TToni

+0

@TToni; tại sao một phần được xây dựng đối tượng? Tôi chỉ xem xét để kiểm tra giá trị tại thời điểm xây dựng thay vì khi truy cập vào trường. Đối tượng sẽ được xây dựng hoàn toàn hoặc sẽ không có đối tượng nào cả (trong trường hợp ném ngoại lệ). –

+0

Hãy tưởng tượng ví dụ một đối tượng mở hai tập tin trong hàm tạo của nó. Một ngoại lệ trong hàm khởi tạo có thể không để lại, một hoặc hai tệp đang mở. Vì vậy, nếu một nhà xây dựng-ngoại lệ xảy ra, thời gian chạy gọi finalizer của bạn (nếu bạn có một) mà phải đối phó với tình trạng này. – TToni

0

bạn getprice đơn giản nên được viết như sau:

return price < 0 ? 0 : price; 

Btw, tốt đẹp để thấy rằng một lỗi stackoverflow được giải quyết bằng cách stackoverflow.com

+1

'reurn' không phải là từ khóa Java hợp lệ ... –

+0

Đã sửa, cảm ơn. – fastcodejava