Czy powyższe jest uważane za sprawdzony wyjątek? No Fakt, że są obsługi wyjątku nie sprawiają, że Checked Exception
jeśli jest to RuntimeException
.
Czy ? takRuntimeException
unchecked exception
Checked Exceptions
są subclasses
z java.lang.Exception
Unchecked Exceptions
są subclasses
zjava.lang.RuntimeException
Wywołania sprawdzające wyjątki muszą być ujęte w bloku try {} lub obsługiwane na wyższym poziomie w obiekcie wywołującym metodę. W takim przypadku bieżąca metoda musi zadeklarować, że zgłasza wspomniane wyjątki, aby osoby dzwoniące mogły dokonać odpowiednich ustaleń w celu obsługi wyjątku.
Mam nadzieję że to pomoże.
P: Czy mam wykreślić dokładny wyjątek, czy zamaskować go za pomocą wyjątku?
Odp .: Tak, to bardzo dobre pytanie i ważna uwaga dotycząca projektu. Wyjątek klasy jest bardzo ogólną klasą wyjątków i może być używany do zawijania wewnętrznych wyjątków niskiego poziomu. Lepiej utwórz niestandardowy wyjątek i zawiń w nim. Ale i duży - nigdy nie jest niejasny w pierwotnej pierwotnej przyczynie. Na przykład Don't ever
wykonaj następujące czynności -
try {
attemptLogin(userCredentials);
} catch (SQLException sqle) {
throw new LoginFailureException("Cannot login!!"); //<-- Eat away original root cause, thus obscuring underlying problem.
}
Zamiast tego wykonaj następujące czynności:
try {
attemptLogin(userCredentials);
} catch (SQLException sqle) {
throw new LoginFailureException(sqle); //<-- Wrap original exception to pass on root cause upstairs!.
}
Usunięcie pierwotnej przyczyny źródłowej powoduje, że faktyczna przyczyna nie do odzyskania jest koszmarem dla zespołów wsparcia produkcji, do których mają dostęp tylko do dzienników aplikacji i komunikatów o błędach. Chociaż ten ostatni jest lepszym projektem, ale wiele osób nie korzysta z niego często, ponieważ programiści po prostu nie przekazują podstawowej wiadomości dzwoniącemu. Zrób więc Always pass on the actual exception
wyraźną notatkę: z powrotem, niezależnie od tego, czy jest zawarty w wyjątku specyficznym dla aplikacji.
Przy próbie łapania RuntimeExceptions
RuntimeException
Z zasady nie należy próbować łapać. Zazwyczaj sygnalizują błąd programowania i należy je pozostawić w spokoju. Zamiast tego programista powinien sprawdzić stan błędu przed wywołaniem kodu, który może spowodować błąd RuntimeException
. Na przykład:
try {
setStatusMessage("Hello Mr. " + userObject.getName() + ", Welcome to my site!);
} catch (NullPointerException npe) {
sendError("Sorry, your userObject was null. Please contact customer care.");
}
To zła praktyka programowania. Zamiast tego należy wykonać kontrolę zerową, jak -
if (userObject != null) {
setStatusMessage("Hello Mr. " + userObject.getName() + ", Welome to my site!);
} else {
sendError("Sorry, your userObject was null. Please contact customer care.");
}
Ale są chwile, kiedy takie sprawdzanie błędów jest kosztowne, takie jak formatowanie liczb, rozważ to -
try {
String userAge = (String)request.getParameter("age");
userObject.setAge(Integer.parseInt(strUserAge));
} catch (NumberFormatException npe) {
sendError("Sorry, Age is supposed to be an Integer. Please try again.");
}
W tym przypadku sprawdzanie błędów przed wywołaniem nie jest warte wysiłku, ponieważ zasadniczo oznacza zduplikowanie całego kodu konwersji łańcucha na liczbę całkowitą w metodzie parseInt () - i jest podatne na błędy, jeśli zostanie zaimplementowane przez programistę. Lepiej więc po prostu zrezygnować z try-catch.
Tak więc NullPointerException
i NumberFormatException
oba RuntimeExceptions
, łapanie a NullPointerException
powinno zostać zastąpione wdzięcznym zerowaniem, podczas gdy ja polecam NumberFormatException
jawne łapanie, aby uniknąć możliwego wprowadzenia kodu podatnego na błędy.
DataSeries
klasę, która przechowuje dane, które zawsze muszą pozostawać w porządku czasowym. Istnieje metoda dodania nowegoDataPoint
na końcuDataSeries
. Jeśli cały mój kod działa poprawnie w całym projekcie,DataPoint
nigdy nie należy go dodawać na końcu, który ma wcześniejszą datę niż ta na końcu. Każdy moduł w całym projekcie jest zbudowany z tego truizmu. Sprawdzam jednak ten warunek i rzucam niezaznaczony wyjątek, jeśli tak się stanie. Dlaczego? Jeśli tak się stanie, chcę wiedzieć, kto to robi i to naprawić.