Thứ tự là bất kỳ thứ gì khớp trước, được thực hiện (as the JLS clearly explains).
Nếu lần bắt đầu khớp với ngoại lệ, nó sẽ thực hiện, nếu nó không khớp, lệnh tiếp theo sẽ được thử và bật cho đến khi một kết quả khớp hoặc không có.
Vì vậy, khi bắt ngoại lệ, bạn muốn luôn bắt đầu cụ thể nhất trước và sau đó là chung nhất (như RuntimeException hoặc Ngoại lệ). Ví dụ, hãy tưởng tượng bạn muốn để bắt StringIndexOutOfBoundsException ném theo phương pháp String.charAt(index) nhưng mã của bạn cũng có thể ném một NullPointerException, dưới đây là cách bạn có thể đi để bắt các ngoại lệ:
String s = null;
try {
s.charAt(10);
} catch (NullPointerExeption e) {
System.out.println("null");
e.printStackTrace();
} catch (StringIndexOutOfBoundsException e) {
System.out.println("String index error!");
e.printStackTrace();
} catch (RuntimeException e) {
System.out.println("runtime exception!");
e.printStackTrace();
}
Như vậy, với lệnh này, Tôi đảm bảo rằng các ngoại lệ được bắt chính xác và chúng không bị vấp ngã lẫn nhau, nếu đó là một số NullPointerException nó đi vào lần bắt đầu tiên, nếu StringIndexOutOfBoundsException nó đi vào thứ hai và cuối cùng nếu nó là cái gì đó khác là RuntimeException (hoặc thừa kế từ nó, như một số IllegalArgumentException) nó đi vào bắt thứ ba.
Trường hợp của bạn là chính xác như IOException thừa kế từ Ngoại lệ và RuntimeException cũng được thừa hưởng từ Ngoại lệ, do đó, chúng sẽ không đi qua nhau.
Nó cũng là một lỗi biên dịch để đón một ngoại lệ chung đầu tiên và sau đó một trong đó là con cháu sau này, như trong:
try {
// some code here
} catch (Exception e) {
e.printStackTrace();
} catch (RuntimeException e) { // this line will cause a compilation error because it would never be executed since the first catch would pick the exception
e.printStackTrace();
}
Vì vậy, bạn nên có những đứa trẻ đầu tiên và sau đó là trường hợp ngoại lệ cha mẹ.
'Muốn' không liên quan gì đến nó. Trình biên dịch thực thi đúng thứ tự. – EJP