2013-08-08 47 views
22

Tôi đang bối rối về việc thực hiện thử cuối cùng khi tồn tại return; trong khối thử. Theo hiểu biết của tôi, khối cuối cùng sẽ luôn được thực thi, tức là trước khi trở về phương thức gọi điện. Khi xem xét mã đơn giản sau:java: thử cuối cùng khối thực hiện

public class TryCatchTest { 
    public static void main(String[] args){ 
     System.out.println(test()); 
    } 
    static int test(){ 
     int x = 1; 
     try{ 
      return x; 
     } 
     finally{ 
      x = x + 1; 
     } 
    } 
} 

Kết quả được in thực tế 1. Điều này có nghĩa là khối cuối cùng không được thực thi? Bất cứ ai có thể giúp tôi với nó?

+1

Tại sao bạn không thêm 'System.out.println()' vào khối cuối cùng và tự xem mình? Tôi nghĩ rằng nó được thực thi nhưng giá trị trả về là 1. –

+0

Khi sử dụng try catch, bạn có thể "bắt" các loại ngoại lệ cụ thể (ví dụ: IOException, NullPointerException v..v ..). chạy một số mã trước khi bắt anyways ... – RicardoE

+7

[Đây] (http://stackoverflow.com/questions/tagged/java+return+finally?sort=votes&pagesize=40) một cái gì đó để suy nghĩ về trong khi upvoting – keyser

Trả lời

23

Khi bạn trở về từ khối try, giá trị trả lại được lưu trữ trên khung ngăn xếp cho phương thức đó. Sau đó khối cuối cùng được thực thi.

Thay đổi giá trị trong khối cuối cùng sẽ không thay đổi giá trị đã có trên ngăn xếp. Tuy nhiên nếu bạn quay trở lại từ khối cuối cùng, giá trị trả về trên ngăn xếp sẽ bị ghi đè và số x mới sẽ được trả lại.

Nếu bạn in giá trị x trong khối cuối cùng, bạn sẽ biết rằng nó được thực thi và giá trị x sẽ được in.

static int test(){ 
    int x = 1; 
    try{ 
     return x; 
    } 
    finally{ 
     x = x + 1; 
     System.out.println(x); // Prints new value of x 
    } 
} 

Lưu ý: Trong trường hợp của một giá trị tham khảo được trả lại, giá trị của tài liệu tham khảo được lưu trữ trên stack. Trong trường hợp đó, bạn có thể thay đổi giá trị của đối tượng, sử dụng tham chiếu đó.

StringBuilder builder = new StringBuilder(""); 
try { 
    builder.append("Rohit "); 
    return builder; 

} finally { 
    // Here you are changing the object pointed to by the reference 
    builder.append("Jain"); // Return value will be `Rohit Jain` 

    // However this will not nullify the return value. 
    // The value returned will still be `Rohit Jain` 
    builder = null; 
} 

đề nghị đọc:

+0

dang, đánh tôi với nó! –

+7

Thêm vào đây: Chỉ giá trị trả về * chính nó được lưu trữ trên ngăn xếp. Nếu bạn đang trả về một tham chiếu đến một đối tượng, các sửa đổi đối với các trường của đối tượng được thực hiện trong khối 'finally' sẽ vẫn hiển thị. –

+0

@JasonC. Đúng vậy. Sẽ thêm vào câu trả lời. Cảm ơn :) –

10

Các khối finally được thực thi. Biến cục bộ được tăng lên. Nhưng giá trị của biến cục bộ đó đã được sao chép cho giá trị trả lại.

Từ ngôn ngữ Java Specification, 14.17: The return statement:

Một tuyên bố trở lại với một Expression cố gắng để chuyển điều khiển đến đoạn Invoker của phương pháp có chứa nó; giá trị của Biểu thức trở thành giá trị của lời gọi phương thức.

...

Các mô tả trước đó nói "cố gắng để chuyển giao kiểm soát" thay vì chỉ "chuyển kiểm soát" vì nếu có bất kỳ báo cáo (§14.20) trong phương pháp hoặc constructor mà thử khối hoặc thử điều khoản bắt chứa câu lệnh return, sau đó bất kỳ mệnh đề cuối cùng nào của mệnh đề try sẽ được thực thi, theo thứ tự, bên trong đến ngoài cùng, trước khi điều khiển được chuyển tới người gọi của phương thức hoặc hàm tạo. Ngừng hoàn thành mệnh đề cuối cùng là có thể làm gián đoạn việc chuyển quyền kiểm soát được bắt đầu bằng một tuyên bố trả về

+3

Vâng, tôi cho rằng * ai đó * đã thực sự đọc tài liệu. Mỗi bên có một pooper. –

0

Bạn đang quay trở lại x trước khi bạn thoát.Tôi sẽ làm điều này:

public class TryCatchTest { 
    public static void main(String[] args) { 
     System.out.println(test()); 
    } 
    static int test() { 
     int x = 1; 
     try { 
      do something with x. 
     } finally { 
      do something that will happen even in case of error; 
      x = x + 1; 
      return x; 
     } 
    } 
} 
+1

Tôi nghĩ rằng bỏ lỡ vấn đề. –