2012-12-15 39 views
9

Thao tác này không biên dịch và cung cấp lỗi sau: Illegal start of expression. Tại sao?Tại sao tôi không thể ném ngoại lệ trong khi sử dụng toán tử bậc ba

public static AppConfig getInstance() { 
     return mConfig != null ? mConfig : (throw new RuntimeException("error")); 
    } 
+4

vì 'throw' không phải là một biểu hiện –

+0

"trở lại (ném RuntimeException mới (" lỗi ")) ; " - bạn không thể trả lại một ngoại lệ ném mới() –

+0

Mẫu đối tượng Null đáng nhắc đến ở đây. –

Trả lời

11

Điều này là do một toán tử bậc ba trong java có dạng expression ? expression : expression và bạn đang đưa ra một tuyên bố là phần cuối cùng. Điều này không có ý nghĩa như một tuyên bố không đưa ra một giá trị, trong khi biểu thức làm. Java có nghĩa là làm gì khi tìm thấy điều kiện sai và cố gắng đưa ra giá trị thứ hai? Không có giá trị.

Toán tử bậc ba được thiết kế để cho phép bạn nhanh chóng lựa chọn giữa hai biến mà không sử dụng câu lệnh if đầy đủ - đó không phải là những gì bạn đang cố gắng làm, do đó, không sử dụng nó, giải pháp tốt nhất đơn giản là :

public static AppConfig getInstance() { 
    if (mConfig != null) { 
     return mConfig; 
    } else { 
     throw new RuntimeException("error"); 
    } 
} 

Nhà điều hành ternary không được thiết kế để tạo ra các tác dụng phụ - trong khi nó có thể được thực hiện để tạo ra chúng, người đọc nó sẽ không hy vọng rằng, vì vậy nó là tốt hơn để sử dụng một if tuyên bố thực để làm cho nó rõ ràng.

0

Bạn đang cố trả lại throw new RuntimeException("error"). Đó là lý do tại sao bạn nhận được lỗi. Vì trong số true trường hợp bạn đang trả lại AppConfig và trong false trường hợp bạn đang trả lại exception.

14

Bạn có thể viết một phương pháp hữu ích

public class Util 
{ 
    /** Always throws {@link RuntimeException} with the given message */ 
    public static <T> T throwException(String msg) 
    { 
     throw new RuntimeException(msg); 
    } 
} 

Và sử dụng nó như thế này:

public static AppConfig getInstance() 
{ 
    return mConfig != null ? mConfig : Util.<AppConfig> throwException("error"); 
} 
+0

Tại sao không khai báo 'throwException' khi trả về' Object'? – Navin

+0

@Navin Object yêu cầu truyền tại người gọi. 'T' không cần cast (ít nhất một vài lần ... tùy thuộc vào trình biên dịch). Trong Java 8 thậm chí là ' 'là không cần thiết (trình biên dịch có thể tìm ra nó) –

+0

Ah ok, đó là thuận tiện :) – Navin

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