Helpex - Trao đổi & giúp đỡ Đăng nhập
33

Theo như tôi hiểu về Java 8 JLS thì biểu thức (1/0)được coi là một biểu thức hằng số, nhưng khi tôi cố gắng biên dịch chương trình sau với OpenJDK 8, tôi gặp lỗi

public class Switch {
    public static void main(String[] args) {
        switch(42) {
            case (1/0):
                return;
            default:
                return;
        }
    }
}

Lỗi cho biết (1/0)không phải là một biểu thức hằng số

Switch.java:4: error: constant expression required
            case (1/0):
                 ^
1 error

Tui bỏ lỡ điều gì vậy? Hay đó là một lỗi trong OpenJDK 8?

33 hữu ích 5 bình luận 1.6k xem chia sẻ
35

Trình biên dịch đang thực hiện việc gấp liên tục (tính toán trước các biểu thức chữ tầm thường). Đây là trường hợp biểu thức "hoàn thành đột ngột", để sử dụng nguyên văn JLS, không cho phép nó đáp ứng định nghĩa của "biểu thức hằng". Vì vậy, nó không phải là một lỗi, nó phù hợp với JLS.

Và có, biểu thức cũng không đánh giá thành một giá trị (cảnh báo người dùng đang cố gắng làm điều gì đó như vậy rằng kết quả sẽ không phải là một biểu thức hằng), nhưng trình biên dịch không biết điều đó cho đến khi nó thử. Không đánh giá đến một giá trị và hoàn thành đột ngột dường như đi đôi với làm.

Thêm một khai báo biến như

int x = 1 / 0;

không gây ra lỗi trình biên dịch, đó là công tắc buộc biểu thức được đánh giá tại thời điểm biên dịch.

Bằng cách tôi đã kiểm tra rằng điều này xảy ra cho phiên bản 7 của Oracle và IBM JDK, nó không phải là OpenJDK hoặc JDK8 cụ thể.

35 hữu ích 2 bình luận chia sẻ
15

Một biểu thức hằng phải có thể đánh giá thành một giá trị, vì trình biên dịch phải khôi phục lại biểu thức đó thành một giá trị.

1/0 không có bất kỳ giá trị nào.

Từ JSL §15.28:

Biểu thức hằng số thời gian biên dịch là một biểu thức biểu thị giá trị của kiểu nguyên thủy hoặc một Chuỗi không hoàn thành đột ngột và chỉ được tạo bằng cách sử dụng như sau:

15 hữu ích 5 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java compiler-errors java-8 openjdk jls , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading