2015-06-29 13 views
11

Tôi có một câu hỏi rất ngớ ngẩn cho bạn :)try-catch và các biến thức

Ví dụ, tôi đã sau đoạn mã:

class MyClass { 

    public static void main (String[] args) { 

     final String status; 

     try { 
      method1(); 
      method2(); 
      method3(); 
      status = "OK"; 
     } catch (Exception e) { 
      status = "BAD"; // <-- why compiler complains about this line?? 
     } 

    } 

    public static void method1() throws Exception { 
     // ... 
    } 

    public static void method2() throws Exception { 
     // ... 
    } 

    public static void method3() throws Exception { 
     // ... 
    } 

} 

Câu hỏi đặt ra là bên trong: tại sao biên dịch phàn nàn về dòng này ?

IntelliJ IDEA cho biết, Variable 'status' might already have been assigned to.

Nhưng, như tôi thấy, chúng tôi không bao giờ đạt đến dòng (nơi chúng tôi đặt status = "OK") trong trường hợp ngoại lệ. Vì vậy, biến số status sẽ là BAD và mọi thứ sẽ ổn. Và nếu chúng tôi không có bất kỳ ngoại lệ nào, thì chúng tôi sẽ nhận được OK. Và chúng tôi sẽ thiết lập biến này chỉ có một lần.

Bất kỳ suy nghĩ nào về điều này?

Cảm ơn sự giúp đỡ của bạn!

+1

trình biên dịch mà không phải là thông minh, và nếu bạn đang tuyên bố phương pháp mà có thể ném một trình biên dịch ngoại lệ sẽ không được đấu tranh để kiểm tra nó, vì vậy vì lợi ích của sự đơn giản nó không cho phép điều đó xảy ra – Toumash

Trả lời

10

Trình biên dịch Java không nhìn thấy những gì bạn và tôi thấy - rằng status được đặt thành "OK" hoặc được đặt thành "BAD". Nó giả định rằng status có thể được đặt một ngoại lệ được ném, trong trường hợp nó được gán hai lần và trình biên dịch tạo ra lỗi.

Để giải quyết vấn đề này, hãy gán biến tạm thời cho khối try - catch và gán biến số final sau đó một lần.

final String status; 
String temp; 

try { 
    method1(); 
    method2(); 
    method3(); 
    temp = "OK"; 
} catch (Exception e) { 
    temp = "BAD"; 
} 

status = temp; 
+0

Tôi nghĩ rằng đó vẫn là lỗi hợp lệ, nếu chủ đề này bị gián đoạn và ném 'InterruptedException' ngay sau khi gán –

+1

@JigarJoshi Nó không thể ném' InterruptedException' (có thể là một cái gì đó khác, nhưng không phải vậy, và có lẽ không có trong mã này). –

+0

nếu điều này là trong thread riêng biệt và được gọi là trên 'ngắt()' –

2

Điều gì sẽ xảy ra nếu mã gây ra ngoại lệ xảy ra saustatus = "OK"? Lý do bạn nhận được lỗi có vẻ khá rõ ràng.

Cầm lấy cái này ví dụ:

final String status; 

try { 
    status = "OK": 
    causeException(); 
}catch(Exception e) { 
    status = "BAD"; 
} 

void causeException() throws Exception() { 
    throw new Exception(); 
} 

này sẽ cho kết quả trong giao lại các biến, đó là lý do tại sao bạn nhận được một lỗi.

+2

Biến là cuối cùng . Chỉ định lại bị cấm. – swinkler

+4

@swinkler Đó là điểm tôi gặp phải. Lỗi xảy ra vì mã được hiển thị ở trên là có thể. Man, có gì với StackOverflow bây giờ-a-ngày .. –

Các vấn đề liên quan