W artykule opisano 10 najczęściej zadawanych pytań dotyczących wyjątków w Javie.
1. Sprawdzalne i nieweryfikowalne
Krótko mówiąc, sprawdzone wyjątki muszą zostać jawnie przechwycone w treści metody lub zadeklarowane w sekcji rzutów metody. Niesprawdzone wyjątki są spowodowane problemami, których nie można rozwiązać, takimi jak dzielenie przez 0, wskaźnik zerowy itp. Sprawdzone wyjątki są szczególnie ważne, ponieważ oczekujesz, że inni programiści korzystający z Twojego API będą wiedzieć, jak obsługiwać wyjątki. Na przykład IOException jest powszechnie używanym zaznaczonym wyjątkiem, podczas gdy RuntimeException jest niesprawdzonym wyjątkiem. Zanim zaczniesz czytać dalej, zapoznaj się z
hierarchicznym diagramem wyjątków w Javie .
2. Najlepszy sposób radzenia sobie z wyjątkami
Jeśli wyjątek można obsłużyć poprawnie, należy go przechwycić, w przeciwnym razie należy go przekazać dalej.
3. Dlaczego zmiennych zdefiniowanych w try nie można użyć w catch lub wreszcie?
W poniższym fragmencie kodu linii zadeklarowanej w bloku try nie można użyć w bloku catch. Ten kod nie zostanie skompilowany.
try {
File file = new File("path");
FileInputStream fis = new FileInputStream(file);
String s = "inside";
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println(s);
}
Powodem jest to, że nie wiadomo, gdzie w bloku try mógł zostać zgłoszony wyjątek. Możliwe, że wyjątek został zgłoszony przed zadeklarowaniem obiektu. I to jest prawdą w przypadku tego przykładu.
4. Dlaczego Double.parseDouble(null) i Integer.parseInt(null) zgłaszają różne wyjątki?
Zgadza się, zgłaszają różne wyjątki. To jest problem JDK. Zostały po prostu zaprojektowane przez różnych ludzi i nie należy się tym zbytnio przejmować.
Integer.parseInt(null);
Double.parseDouble(null);
5. Podstawowe wyjątki wykonawcze w Javie
Oto kilka z nich:
IllegalArgumentException
ArrayIndexOutOfBoundsException
Można ich użyć w instrukcji if, gdy warunek nie jest spełniony, jak tutaj:
if (obj == null) {
throw new IllegalArgumentException("obj не может быть равно null");
6. Czy można przechwycić wiele wyjątków w jednym bloku catch?
Odpowiedź brzmi tak. Dopóki klasy tych wyjątków można prześledzić w hierarchii dziedziczenia klas do tej samej nadklasy, można używać tylko tej nadklasy.
7. Czy konstruktor może zgłaszać wyjątki?
Odpowiedź brzmi tak. Konstruktor jest po prostu specjalnym rodzajem metody.
Oto przykład kodu.
8. Zgłaszanie wyjątków w ostatnim bloku
Zasadniczo możesz to zrobić całkiem legalnie:
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
FileInputStream fis = new FileInputStream(file2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
Aby jednak zachować czytelność kodu, należy zadeklarować zagnieżdżony blok
try-catch
jako nową metodę i wstawić wywołanie tej metody do bloku
finally
.
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
methodThrowException();
}
}
9. Czy możliwe jest użycie return w bloku last?
Tak, możesz.
10. Dlaczego programiści po cichu radzą sobie z wyjątkami?
Na przykład często pojawiają się takie fragmenty kodu. Jeśli właściwa obsługa wyjątków jest tak ważna, dlaczego programiści nadal piszą to w ten sposób?
try {
...
} catch(Exception e) {
e.printStackTrace();
}
Najłatwiej to zignorować. Ale nawet jeśli często się to robi, nie oznacza to, że jest to prawidłowe. Spinki do mankietów:
- Niesprawdzone wyjątki w Javie
- Korzeń hierarchicznego drzewa wyjątków w Javie
- Pytania dotyczące wyjątków w przepełnieniu stosu
Oryginalny artykuł
GO TO FULL VERSION