2009-10-01 17 views
42

Jako programista java, który chce doskonalić swoje umiejętności programistyczne, często napotykam sytuacje, w których muszę utworzyć wyjątek środowiska wykonawczego. Wiem, że to dobra praktyka, jeśli ktoś używa mądrze.Jakie są najczęściej używane wyjątki środowiska wykonawczego w java?

Osobiście NullPointerException i IllegalStateException są najczęściej stosowane w oprogramowanie, które stworzyłem. Jak o tobie?

Do jakich często używasz wyjątków czasu wykonywania? W jakich sytuacjach ich używasz?

Odpowiedz

66

Nigdy nie wyrzucam NullPointerException. Dla mnie jest to ten, który pojawia się naturalnie w kodzie, gdy coś idzie nie tak i wymaga od programisty przyjrzenia się temu, co się dzieje. Następnie naprawia przyczynę i nie dzieje się to ponownie.

Używam IllegalStateException do sygnalizowania, że ​​obiekt jest nieprawidłowo skonfigurowany lub że połączenia są w nieprawidłowej kolejności. Wszyscy jednak doskonale wiemy, że obiekt powinien upewnić się, że nie może być w złym stanie i że nie można go wywołać w niewłaściwej kolejności (zrobić konstruktora i wynikowy obiekt ...).

Używam dużo IllegalArgumentException, gdy metoda wykryje, że jej parametry są nieprawidłowe. Jest to obowiązkiem każdej publicznej metody, aby przerwać przetwarzanie (aby uniknąć pośrednich błędów, które są trudniejsze do zrozumienia). Również kilka if s na początku metody służy celowi dokumentacji (dokumentacji, która nigdy nie odbiega od kodu, ponieważ jest to kod :-)).

 public void myMethod(String message, Long id) { 
     if (message == null) { 
      throw new IllegalArgumentException("myMethod's message can't be null"); 
      // The message doesn't log the argument because we know its value, it is null. 
     } 
     if (id == null) { 
      throw new IllegalArgumentException("myMethod's id can't be null"); 
      // This case is separated from the previous one for two reasons : 
      // 1. to output a precise message 
      // 2. to document clearly in the code the requirements 
     } 
     if (message.length()<12) { 
      throw new IllegalArgumentException("myMethod's message is too small, was '" + message + "'"); 
      // here, we need to output the message itself, 
      // because it is a useful debug information. 
     } 
    } 

Używam również szczególne wyjątki Runtime sygnalizować wyższy poziom wyjątkowe warunki.

Na przykład, jeśli moduł mojej aplikacji nie można uruchomić, mogę mieć ModuleNotOperationalException rzucony (najlepiej za pomocą kodu generycznego niczym kolektora, inaczej określonym kodem), gdy inny moduł nazywa. Po tej decyzji architektonicznej, każdy moduł musi poradzić sobie z tym wyjątkiem w operacjach, które wywołują inne moduły ...

+1

Wielkie punkty człowiek !! –

+8

Wielka lista; Dodałbym UnsupportedOperationException, którego używam cały czas z konkretnymi implementacjami interfejsów kolekcji. – Carl

+0

Świetna odpowiedź. Zwrócę większą uwagę na wyjątek IllegalStateException w przyszłości! – reef

3

Stosuję stosunkowo często IllegalArgumentException. W większości przypadków spróbuję zwrócić wartość domyślną, gdy tylko będzie to logiczne, ale w niektórych przypadkach nie było, więc używam tego.

Kolejny, którego używam to ArrayIndexOutOfBoundsException.

11

Zawsze uważałem, że wyjątki w czasie wykonywania powinny reprezentować błędy programistyczne (np. null referencja przekazywana, gdy nie jest oczekiwana, indeks tablicy poza zakresem itp.), Podczas gdy sprawdzane wyjątki powinny reprezentować wyjątkowe warunki w środowisku, które nie mogą być "kodowane" away "(np. IOException, SQLException).

Jednym z nich jest to, że czasami trzeba owinąć to, co powinno być zaznaczonym wyjątkiem w RuntimeException, aby spełnić definicję interfejsu. Jako krótki przykład, możesz mieć trochę snazzy implementację java.util.List, która zarządza rozproszoną listą między wieloma komputerami.Oczywiście to rzuciłoby sprawdzone wyjątki (prawdopodobnie niektóre podklasy IOException), jeśli zdefiniowano je samodzielnie, ale korzyści z uczynienia tej klasy implementacją List polega na tym, że klienci mogą używać jej prawie w sposób przejrzysty, gdziekolwiek używają innej listy.

To może prowadzić do tego, co Joel określa jako leaky abstraction, więc ważne jest, aby w dokumentacji było jasne, jakie wyjątki można rzucać i co oznaczają! W tym przypadku znajduję niestandardową podklasę o numerze RuntimeException, aby generalnie lepiej wyjaśnić główną przyczynę, niż próbować zrzucić ją do istniejącej klasy wyjątków środowiska wykonawczego.

+0

Jesteś zgodny z oryginalnym myśleniem dla Javy, dotyczącym CheckedExceptions. Właściwie jest to znane jako jedyna oryginalna cecha Javy (wszystkie inne zostały zaczerpnięte z udanych innych języków). Ale toczy się o to wiele dyskusji i uważam, że obecnym trendem jest uznanie tej różnicy za błąd w Javie. Dokładne problemy byłyby tutaj nie na temat, można google ... – KLE

2

UnknownException, bardzo przydatne: P

lubię też org.apache.commons.lang.NotImplementedException

+13

Używam 'throw new UnsupportedOperationException (" Jeszcze nie zaimplementowane "); dla części mojej aplikacji, które nie zostały jeszcze zaimplementowane. – Jesper

2

Głównie ja nie rzucać wyjątek czasu wykonywania. Zamiast sprawdzać określone warunki, należy zgłaszać wyjątki zdefiniowane przez użytkownika. Ale kilka używanych przeze mnie jest - IllegalAccessException, ArithmeticException, NumberFormatException i SecurityException.

0

Według Joshua Bloch w Skuteczne Java,

Najczęściej ponownie wykorzystane wyjątkami:

  1. IllegalArgumentException
  2. IllegalStateException
  3. NullPointerException
  4. IndexOutOfBoundsException
  5. ConcurrentModificationException
  6. UnsupportedOperationException
Powiązane problemy