2015-05-21 19 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; 
     } 
} 

Co chciałbym zrobić, to kiedy wolf zostaje złapany w konstruktorze wartość food zmienia się automatycznie do czegoś innego. Próbowałem jednak użyć getter-setters, jednak pojawia się błąd unreachable code. Co mam zrobić?Catching wyjątek w konstruktorze

+0

Gdzie zawiesza się twój kod? –

+0

Wyrzucenie wyjątku oznacza na ogół "panikę i natychmiast zamknąć ten kod, pozostawiając rzeczy tak zepsute, jak są w tym momencie". W szczególności, podczas rzucania z konstruktora wynik operatora 'new' nie będzie użyteczny, ponieważ przepływ kodu jest przerywany przez wyjątek. Wyrzucasz wyjątki, gdy napotkasz stan, którego nie możesz lub nie chcesz obsłużyć. Jesteś pewien, że właśnie tego chcesz tam robić? – Wormbo

+0

Wyrzucanie wyjątków nie jest najlepszym sposobem komunikowania się z użytkownikiem. – zubergu

Odpowiedz

1

problem z Desing to, że caling throw exception pozostawia zakres bloków i szuka try-catch bloku, który mógłby obsłużyć wyjątek. W twoim przypadku

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

Jeśli wyjątek w konstruktorze i wyjątek pozostawia funkcję, ponieważ nie ma try-catch dla tego wyjątku w konstruktorze, budowa obiektu nie powiedzie się. Tak więc, jeśli twoje Zoo zabrania posiadania wilka jako zwierzęcia, powinieneś rzucić wyjątek (w ten sposób Zoo nigdy nie zostanie utworzony).

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

Jednak jeśli chcesz mieć drapieżników w Zoo, ale z ostrzeżeniem dla wszystkich odwiedzających, należy po prostu wyświetlić jakieś ostrzeżenie.

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

Ponadto, jesteś świadomy, że Zoo może zawierać tylko jedno zwierzę i jedną jedzenie?

Jeszcze jedno. Twoja metoda jest zbyt skomplikowana. Java zawiera wiele użytecznych klas i funkcji, dzięki czemu nie opóźniamy pisania kodu za każdym razem w kółko. Szukanie podła słowa jest naprawdę użyteczną i ulubioną funkcją. Spójrz na indexOf(String). Jest zaprojektowany dokładnie tak, jak chcesz i prawdopodobnie jest zaimplementowany podobnie.

+0

Bardzo ładne i wyszukane, dziękuję bardzo. –

0

Może musisz ustawić wartość żywności, int instrukcji if, zanim rzucisz wyjątek, a nie po? W ten sposób:

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ój oryginalny kod ma wartość odżywczą, ale ja nie piszę kodu po angielsku, tłumaczę go, kiedy piszę do SOF i tym razem zapomniałem go dodać. Tak, to jest coś, czego szukałem - nie mogę odczytać czegoś takiego w jawnej formie z API, które "musisz ustawić oświadczenie przed swoim wyjątkiem throw" et cetera et cetera. –

2

Jeśli chcesz, aby w przypadku wykrycia "wilka" została wykonana specyficzna logika, wyjątek nie jest właściwy. Powinieneś rzucić wyjątek, jeśli konstrukcja instancji powinna zakończyć się niepowodzeniem, gdy znajdziesz "wilka".

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

Tak, konstruktor również zawiera jedzenie, przepraszam, edytowałem tę część. Tak, rozumiem, że nie jest dobrze robić to przez wyjątek, ale jest to tylko dla praktyki, a zadanie to wymaga. Wskazuje się również, aby postępować zgodnie z instrukcjami przypisania T, nawet jeśli wydają się sprzeczne. To wszystko tylko hipotetyczne. –

Powiązane problemy