Sau khi return method vẫn tiếp tục chạy

Tình hình là dạo này đang rảnh nên ngồi lê la các diễn đàn thì mình thấy có đoạn code sau

public class TryCatchFinallyDemo {
 
    public static void main(String[] args) {
 
        String text = "001234A2";
 
        int value = toInteger(text);
 
        System.out.println("Value= " + value);
 
    }
 
    public static int toInteger(String text) {
        try {
 
            System.out.println("Begin parse text: " + text);
 
            // Tại đây có thể gây ra ngoại lệ NumberFormatException.
            int value = Integer.parseInt(text);
 
            return value;
 
        } catch (NumberFormatException e) {
 
            // Trong trường hợp 'text' không phải là một số.
            // Khối catch này sẽ được thực thi.
            System.out.println("Number format exception " + e.getMessage());
 
            // Khi NumberFormatException xẩy ra, trả về 0.
            return 0;
 
        } finally {
 
            System.out.println("End parse text: " + text);
 
        }
    }
 
}

và kết quả như sau

Begin parse text: 001234A2
Number format exception For input string: "001234A2"
End parse text: 001234A2
Value= 0

Tại sao khi đã return rồi mà nó vẫn chạy tiếp được nhỉ, trong finally mình cho return ra 1 giá trị khác vẫn được, mà không hề bị deadcode?

1 Like

nhưng vấn đề là trong block try và catch đều có return cơ mà, luồng chạy như thế nào thì nó cũng đều return rồi, sau đó mới tới finnally. như vậy trong cái finnally kia phải là deadcode chư nhỉ

Finally luôn được chạy dù có văng ex hay không.

1 Like

khổ, cái đấy ai trả biết. ông đọc kỹ câu hỏi giùm.:frowning:
cứ return thì nó kết thúc method ngay chứ

thay bằng 10 rồi chạy lại sẽ biết -.-

thì có khác gì đâu. Ông không hiểu ý tôi rồi, trong try block và catch block đều có lệnh return kìa, nó chạy vào catch gặp lệnh return thì method phải dừng lại mới đúng chứ, sao vẫn chạy tiếp được.

ah hiểu ý, chắc có rule gi ở đấy liên quan đến jvm.

giả sử trong cái finally kia mà return phát nữa thì nó vẫn return lần thứ 2. mà theo mình biết thì return dùng để kết thúc method và trả về giá trị chứ nhể

Search ra này
Return trong finally sẽ được trả về.

2 Likes

A finally block is always executed after the code in the preceeding try block. It doesn’t matter if the try block throws an exception, whether or not the exception is caught, or if it executes a return statement. (The only way to prevent a finally block from running is by terminating the VM through System.exit or killing it manually.)

https://programming.guide/java/try-finally.html

2 Likes

Do bạn không nắm được rule khi sử dụng finally block thôi. Chứ return chỉ kết thúc hàm, còn finally block lúc nào cũng được run nếu đã enter khối try catch. Có thể hiểu cái block try catch finally đã wrap phần code nằm bên trong khối try lại

2 Likes

Có cái gì đâu ?
Bởi vì hàm convert nằm bên trên lệnh return của try.
Khi hàm convert trong try ăn hành thì nó dừng luôn tại lệnh gây tra exception và phang thẳng vào khối catch mà không thực thi lệnh return của try.

À đọc lại thì cũng vô lý nhỉ vì nó gặp return của catch.

2 Likes

finally luôn được gọi kể cả sau khi return trong catch để dọn dẹp rác do exception gây ra, logic vậy đúng rồi. Nếu nó chỉ đơn giản là chèn thêm dòng lệnh sau cùng thì cần gì ghi finally @_@ thêm dòng đó phía sau khối try catch cũng được?

khổ cái mang danh có ông dọn rác sẵn rồi mà vẫn phải tự tay dọn rác bằng finally nữa nên thấy hơi kì cục :flushed:

The finally Block

The finally block always executes when the try block exits. This ensures that the finally block is executed even if an unexpected exception occurs. But finally is useful for more than just exception handling — it allows the programmer to avoid having cleanup code accidentally bypassed by a return, continue, or break. Putting cleanup code in a finally block is always a good practice, even when no exceptions are anticipated.

Note: If the JVM exits while the try or catch code is being executed, then the finally block may not execute. Likewise, if the thread executing the try or catch code is interrupted or killed, the finally block may not execute even though the application as a whole continues.

3 Likes

Finally block luôn được thực thi trừ khi dùng system.exit() hoặc tắt ngang ứng dụng. @tntxtnt GC ko phải giải phóng tức thời, nên nhiều khi cần phải chủ động giải phóng resource, như thao tác trên file, hoặc làm game sẽ thấy rất rõ điều này, nếu cấu hình GC ở mức cao thì sẽ thấy bị lag khi GC thực thi.

4 Likes

JVm quy định khi gặp lệnh return ở trong try hay catch thì nó sẽ thực hiện finnally trước sau đó mới quay lại return

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