2015-04-03 32 views
5
public class CheckProg { 
    public int math(int i) { 
     try { 
      int result = i/0; 
     // throw new IOException("in here"); 
     } catch (Exception e) { 
      return 10; 
     } finally { 
      return 11; 
     } 
    } 
    public static void main(String[] args) { 
     CheckProg c1 = new CheckProg(); 
     int res = c1.math(10); 
     System.out.println("Output :" + res); 
    } 

Câu hỏi: Nếu tôi chạy đoạn mã trên, tôi nhận được kết quả như Output: 11ngoại lệ xử lý trong java sử dụng cuối cùng

Tại sao? Không nên ngoại lệ bị bắt trước đó trong khối đánh bắt và quay trở lại?

Trả lời

7

Trường hợp ngoại lệ không được bắt trước trong khối đánh bắt và được trả lại?

bị bắt, và điều đó trở lại tuyên bố được thực hiện ... nhưng sau đó giá trị trả về đang được thay thế một cách hiệu quả bằng câu lệnh return trong khối finally, mà sẽ thực hiện có hoặc không có là một ngoại lệ.

Xem JLS 14.20.2 để biết chi tiết về tất cả các khả năng. Trong trường hợp của bạn, đây là con đường:

Nếu thực hiện các khối try hoàn đột ngột vì một ném của một giá trị V, sau đó là một sự lựa chọn:

  • Nếu thời gian chạy loại V được gán tương thích với một lớp ngoại lệ có thể bắt được của bất kỳ mệnh đề catch nào của câu lệnh try, sau đó chọn mệnh đề catch đầu tiên (ngoài cùng bên trái) đầu tiên. Giá trị V được gán cho tham số của mệnh đề catch đã chọn, và khối của mệnh đề catch được thực hiện. Sau đó, có một sự lựa chọn:

    • Nếu khối catch hoàn thường [... bỏ qua, bởi vì nó không]

    • Nếu khối catch hoàn đột ngột vì lý do R, sau đó các cuối cùng khối được thực hiện. Sau đó, có một sự lựa chọn:

      • Nếu khối cuối cùng hoàn thành thường [... bỏ qua, bởi vì nó không]

      • Nếu khối cuối cùng hoàn thành đột ngột vì lý do S thì try statement hoàn thành vì lý do S (và lý do R bị loại bỏ).

Vì vậy mà mấu chốt là quan trọng một - những "lý do S" (trong trường hợp của chúng tôi, trở về giá trị 11) kết thúc lên được cách mà các tuyên bố try hoàn đột ngột .

+0

nhưng làm thế nào đến báo cáo kết quả lợi nhuận trở lại với khối finally .. –

+3

@kaustubhsinha: Bởi vì một 'finally' khối * luôn * thực hiện - đó là quan điểm của nó. –

1

Có. Nhưng khối cuối cùng luôn luôn được thực hiện sau đó và ghi đè giá trị trả về!

0

Cuối cùng khối được thực hiện có ngoại lệ hay không.

0

Nó khá tự giải thích. Khối catch đang thực thi vì có một ngoại lệ. Cuối cùng sẽ thực hiện khi việc thực thi của nó được đảm bảo bất kể ngoại lệ.

Lưu ý - Nếu bạn đã đưa ra một số (các) tuyên bố khác thay vì trả lại, cả hai câu lệnh đã được thực hiện. nhưng trong trường hợp trả lại, chỉ lần trả cuối cùng mới được thực thi.

} catch (Exception e) { 
       System.out.println("10"); 
      } finally { 
       System.out.println("11"); 
      } 
0

Các "cuối cùng" từ khóa được sử dụng để tạo ra một khối mã mà sau một khối try. Một khối cuối cùng của mã luôn luôn thực hiện, có hay không một ngoại lệ đã xảy ra.

thử {

final int x=100; 
System.out.println("The value of x is"+ x); 

}

catch(Exception e) 
{ 
    System.out.println(e); 
} 
finally 
{ 
    System.out.println("Finally Block executed"); 
}