Mam pewne problemy ze zrozumieniem różnic między wyjątkami w języku Java w wersjach checked
i unchecked
.Sprawdzone i niezaznaczone wyjątki w Javie
- Po pierwsze, wyjątki od
checked
powinny wyglądać na anomalie podczas kompilacji. Przykłady przedstawione w różnych źródłach cytować łączność z bazami danych, obsługę plików, ponieważ niektóre z nich, podczas gdyunchecked
wyjątki mają szukać błędów na części programisty, jak indeksowanie poza zakres tablicy itd
nie powinno to jest na odwrót? Mam na myśli, że łączność z bazami danych odbywa się podczas pracy, prawda? To samo dotyczy obsługi plików. Nie otwierasz uchwytu pliku podczas kompilacji, więc dlaczego pojawia się potencjalny błąd podczas kompilacji? Z drugiej strony, indeksowanie tablicy poza jej zakresem jest już wykonywane w programie, co można sprawdzić podczas kompilacji (jeśli nieprawidłowy indeks jest dostarczany przez użytkownika podczas działania, to jest w porządku, aby był to czas wykonywania problem). Czego tu mi brakuje?
2 Po drugie, jak może RunTimeException
, sama będąc unchecked
, podklasa Exception
, która jest checked
? Co to oznacza?
Znalazłem przykład w książce Herberta Schildt objaśniający użycie checked
wyjątkami:
class ThrowsDemo {
public static char prompt(String str)
throws java.io.IOException {
System.out.print(str + ": ");
return (char) System.in.read();
}
public static void main(String args[]) {
char ch;
try {
ch = prompt("Enter a letter");
}
catch(java.io.IOException exc) {
System.out.println("I/O exception occurred.");
ch = 'X';
}
System.out.println("You pressed " + ch);
}
}
jest klauzula throws
konieczne tutaj? Dlaczego nie mogę zrobić, to po prostu normalnie z try-catch
oświadczeniu tak (przepraszam nie wiem jak symulować IO Exception
, więc nie mogliśmy sprawdzić to sam!):
class ThrowsDemo {
public static char prompt(String str) {
System.out.print(str + ": ");
return (char) System.in.read();
}
public static void main(String args[]) {
char ch;
try {
ch = prompt("Enter a letter");
}
catch(java.io.IOException exc) {
System.out.println("I/O exception occurred.");
ch = 'X';
}
System.out.println("You pressed " + ch);
}
}
Możliwe duplikat [Różnica pomiędzy Nierejestrowanego wyjątku lub wyjątkiem wykonawczego] (http://stackoverflow.com/questions/2699580/difference-between-unchecked-exception-or-runtime-exception) – Tom
sprawdzone wyjątki * nie * w celu wykrycia problemów podczas kompilacji. Taki jest cel błędów kompilatora. – erickson