Thắc mắc về cách bắt về exception?

chào các bạn !

  1. Cho mình hỏi tại sao code trong catch đã chạy, catch đã bắt được exception đáng lẽ chương trình phải dừng tại catch vì không có finally nhưng vẫn ra kết quả ?
public class Class1 {

    static void method1() throws Exception {
		URL url = new URL("http://www.google.com");
		URLConnection connection = url.openConnection();
		connection.connect();
	}

	static int method2() throws Exception {
		try {
			method1();
		} catch (IOException e) {
			System.out.println("Bắt exception nè");
		}
		
		return 99999;
	}

	public static void main(String[] args) throws Exception {
		System.out.println(method2());  
		//Bắt exception nè
		//99999
	}

}
  1. Nếu trong 1 hàm cha có gọi nhiều hàm con, mỗi hàm đều throw ra Exception nhưng không xác định rõ là Exception gì (VD ArithmaticException, NullException, IOException,…) thì catch trong hàm cha sẽ bắt exception từ throw của hàm nào ?
int methodCha(){
     try{
         method1();
          method2();
        method3(method4(method5()));
   }
    catch{
// 
         }
}

Cảm ơn các bạn đã giải thích ! :two_hearts: :heart: :heart_eyes:

  1. catch được là ổn rồi bạn :smiley: Khối finally dùng để làm những việc bắt buộc dù có bắt exception hay không.
  2. Đi lên từng cấp.
6 Likes

Đối với OOP không có “hàm”, chỉ có phương thức (method).

  1. Bạn có nghĩ sai về try - catch - finally không vậy? Có đấy, bạn nghĩ sai rồi đấy!
  2. Các phương thức sẽ thực thi theo thứ tự được gọi, khi có ngoại lệ thì quăng ngoại lệ và dừng tại dòng lệnh đó, không có chuyện tất cả cùng chạy 1 lúc đâu mà có nhiều ngoại lệ xảy ta cùng 1 lúc. Đơn luồng nhé.
4 Likes

@rogp10 dạ cảm ơn bạn đã phản hồi.
@SITUVN.gcd bạn giải thích rõ hơn giúp mình được không ạ ! trường hợp này ví dụ như không có internet thì method1() sẽ bị lỗi và throw ra exception. Khi đó mình nghĩ method2() sẽ bắt exception của method1() và dừng luôn lại đây nhưng không, nó vẫn chạy return

Bạn tìm hiểu về từ khóa “exception propagation”. Về cơ bản, khi một exception sinh ra mà không được xử lý thì nó sẽ truyền dần xuống các method trước đó (bên dưới trong stack), cho tới khi có method nào đó bắt nó.
Còn code của bạn vẫn return 9999 vì bạn đã bắt exception lại từ khối try catch trước rồi, bắt xong thì hết exception, chương trình vẫn tiếp tục normal flow nên return 9999 là đúng.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?