Poprawiam się, bo bzdurę napisałem.
• Dzielenie przez zero rzuca wyjątkiem, a nie Errorem. Zatem to działa bez problemu:
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
try{
int x = 10/0;
}catch (Exception e) {
System.out.println("dziwne... u mnie dziala");
}
}
}
https://ideone.com/HmlYYj
• Error natomiast jest rzucany np. jeśli zażądasz więcej pamięci, niż możesz dostać. Zatem w tym programie poleci niewyłapany Error:
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
try {
int[] tab = new int[2147483647];
} catch (Exception t) { // tutaj co wpisać by łapać każdy błąd
System.out.println("dziwne... u mnie dziala");
}
// System.out.println(x);
}
}
https://ideone.com/STqE2T
Podczas gdy teraz wyłapiesz błąd:
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
try {
int[] tab = new int[2147483647];
} catch (Error t) { // tutaj co wpisać by łapać każdy błąd
System.out.println("dziwne... u mnie dziala");
}
// System.out.println(x);
}
}
https://ideone.com/cSz2PH
Oczywiście catch(Throwable t)
zadziała tym bardziej, bo Throwable
łapie i wyjątki, i błędy.
• Poza bardzo szczególnymi przypadkami łapanie Error
ów nie jest dobrym pomysłem. Z dokumentacji: https://docs.oracle.com/javase/8/docs/api/java/lang/Error.html
An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions.