2015-05-21 15 views
5
public class AnimalException extends Exception { 
    public AnimalException(String error) { 
     super(error); 
    } 
} 

public class Zoo { 
    private String animal; 
    private String food; 

    public Zoo (String animal, String food) throws AnimalException { 
     this.animal = animal; 
     if (findWord(animal, "wolf")) { 
      throw new AnimalException("This animal is a predator."); 
      //something ought to be done here, I reckon 
     } 
     else { 
      this.food = food; 
     } 


    } 

    public static boolean findWord(String word, String find) { 
     int total = 0; 
     int idx = 0; 
     while ((idx = word.indexOf(find, idx))!= -1) { 
      total++; 
      idx++; 
     } 
     if (total == 0) { 
      return false; 
     } 
     else { 
      return true; 
     } 
} 

Điều tôi muốn làm là khi số wolf bị bắt trong hàm tạo giá trị cho food được tự động thay đổi thành thứ khác. Tôi đã thử sử dụng getter-setters, tuy nhiên, tôi nhận được lỗi của unreachable code. Tôi phải làm gì?Ghi ngoại lệ trong hàm tạo

+0

Mã của bạn gặp sự cố ở đâu? –

+0

Ném một ngoại lệ thường có nghĩa là "hoảng sợ và thoát khỏi mã này ngay lập tức ngay từ đây, để lại những thứ như bị hỏng như họ đang ở thời điểm này". Đặc biệt, khi ném từ một hàm tạo, kết quả của toán tử 'new' sẽ không thể sử dụng được, vì luồng mã bị gián đoạn bởi ngoại lệ. Bạn ném ngoại lệ khi bạn gặp một trạng thái mà bạn không thể hoặc không muốn xử lý. Bạn có chắc đó là những gì bạn muốn làm ở đó không? – Wormbo

+0

Ném ngoại lệ không phải là cách tốt nhất để giao tiếp với người dùng. – zubergu

Trả lời

1

Vấn đề với desing của bạn, mà caling throw exception rời khỏi phạm vi của các khối và đang tìm kiếm try-catch khối mà có thể xử lý các ngoại lệ. Trong trường hợp của bạn

void foo() { 
    if (somethingbad()) { 
     throw new exception(); 
     bar(); // <-- unreachable code, since throw leaves foo function. 
    } 
} 

Nếu bạn ném một ngoại lệ trong constructor và các ngoại lệ rời khỏi chức năng, vì không có try-catch cho rằng ngoại lệ trong constructor, việc xây dựng của đối tượng đó bị lỗi. Vì vậy, nếu Zoo của bạn cấm có một con sói như một con vật, bạn nên ném ngoại lệ (do đó Zoo sẽ không bao giờ được tạo ra ở tất cả).

public Zoo (String animal, String food) throws AnimalException { 
    this.animal = animal; 
    if (findWord(animal, "wolf")) { 
     throw new AnimalException("This animal is a predator."); 
    } 
    else { 
     this.food = food; 
    } 
} 

void foo() { 
    Zoo myZoo; 
    try { 
     myZoo = new Zoo("wolf", "meat"); 
    } catch (AnimalException ex) { 
     System.out.println(ex.toString()) 
    } 
    // myZoo is still null, uninitialized. 
} 

Tuy nhiên, nếu bạn muốn có kẻ thù trong Zoo, nhưng với cảnh báo cho tất cả khách truy cập, bạn chỉ nên hiển thị một số cảnh báo.

public Zoo (String animal, String food) throws AnimalException { 
    this.animal = animal; 
    this.food = food; 
    if (findWord(animal, "wolf")) { 
     System.out.println("Beware, we have a predator in zoo"); 
    } 
} 

Ngoài ra, bạn có biết rằng Zoo chỉ có thể chứa một động vật và một thực phẩm không?

Một điều nữa. Phương pháp của bạn findWord(String, String) quá phức tạp. Java chứa rất nhiều lớp và chức năng hữu ích, do đó chúng tôi không trì hoãn việc viết mã mỗi lần lặp đi lặp lại. Tìm kiếm chuỗi con của một từ thực sự là chức năng hữu ích và yêu thích. Hãy xem indexOf(String). Nó được thiết kế chính xác cho purpouse của bạn và có thể được thực hiện tương tự.

+0

Rất đẹp và phức tạp, cảm ơn bạn rất nhiều. –

0

Có thể bạn cần đặt giá trị thực phẩm, trong câu lệnh if, trước khi bạn ném ngoại lệ, chứ không phải sau? Như thế này:

public Object (String animal) throws AnimalException { 
     this.animal = animal; 
     if (findWord(animal, "wolf")) { 
      this.food = food; 
      throw new AnimalException("This animal is a predator."); 
      //something ought to be done here, I reckon 
     } 
     else { 
      this.food = food; 
     } 


    } 
+0

Mã ban đầu của tôi không có giá trị thực phẩm, nhưng tôi không viết mã bằng tiếng Anh, tôi dịch nó khi tôi đăng lên SOF và tôi quên thêm nó vào lúc này. Ngoài ra, có, đây là loại điều tôi đang tìm kiếm - Tôi không thể đọc bất cứ điều gì như thế này trong hình thức rõ ràng từ API rằng "bạn cần phải thiết lập tuyên bố Trước khi ném ngoại lệ của bạn" et cetera et cetera. –

2

Nếu bạn muốn một số logic cụ thể được thực hiện khi bạn phát hiện "con sói", ngoại lệ không đúng cách. Bạn chỉ nên ném một ngoại lệ nếu việc xây dựng trường hợp sẽ thất bại khi bạn tìm thấy một "con sói".

public Zoo (String animal, String food) { 
    this.animal = animal; 
    if (findWord(animal, "wolf")) { 
     // put whatever logic you wish here 
    } 
    else { 
     this.food = food; 
    } 
} 
+0

Vâng, nhà xây dựng cũng chứa thực phẩm, xin lỗi, tôi đã chỉnh sửa phần đó. Vâng, tôi hiểu rằng nó không tốt để làm điều đó thông qua ngoại lệ, nhưng đây chỉ là để thực hành và nhiệm vụ đòi hỏi nó. Nó cũng được chỉ ra để làm theo hướng dẫn của bài tập cho T ngay cả khi chúng có vẻ mâu thuẫn. Đó là tất cả chỉ là giả thuyết. –

Các vấn đề liên quan