Ý nghĩa của lỗi Android Studio: Tham số không được chú thích ghi đè tham số @NonNull


104

Tôi đang dùng thử Android Studio. Khi tạo một dự án mới và thêm một onSaveInstanceStatephương thức mặc định vào lớp tạo MyActivity, khi tôi cố gắng xác nhận mã cho Git, tôi gặp một lỗi lạ mà tôi không hiểu. Mã này là:

Lỗi tôi nhận được là:

nhập mô tả hình ảnh ở đây

Nếu tôi cố gắng thay đổi chữ ký phương thức thành protected void onSaveInstanceState(@NotNull Bundle outState), thì IDE cho tôi biết rằng nó không thể phân giải ký hiệu NotNull.

Tôi cần làm gì để thoát khỏi cảnh báo?

Câu trả lời:


124

Đó là một chú thích, nhưng tên chính xác là NonNull:

protected void onSaveInstanceState(@NonNull Bundle outState)

(Và còn nữa)

import android.support.annotation.NonNull;

Mục đích là để cho phép trình biên dịch cảnh báo khi một số giả định nhất định bị vi phạm (chẳng hạn như tham số của một phương thức luôn có giá trị, như trong trường hợp cụ thể này, mặc dù có những giả định khác). Từ tài liệu Chú thích hỗ trợ :

Các @NonNullchú thích có thể được sử dụng để chỉ ra rằng một tham số cho không thể được null.

Nếu một biến cục bộ được biết là null (ví dụ: vì một số mã trước đó đã kiểm tra xem nó có phải không) và bạn chuyển nó dưới dạng tham số cho một phương thức mà tham số đó được đánh dấu là @NonNull, IDE sẽ cảnh báo bạn rằng bạn có một sự cố tiềm ẩn.

Chúng là công cụ để phân tích tĩnh. Hành vi thời gian chạy không bị thay đổi gì cả.


Trong trường hợp này, cảnh báo cụ thể là phương thức ban đầu bạn đang ghi đè (trong Activity) có @NonNullchú thích về outStatetham số, nhưng bạn đã không đưa nó vào phương thức ghi đè. Chỉ cần thêm nó vào sẽ khắc phục được sự cố, tức là

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}

5
mục đích của nó là gì?
IgorGanapolsky

2
@IgorGanapolsky Xin lỗi, tôi đã không đề cập đến điều đó vì tôi cho rằng câu hỏi chỉ là về sự khác biệt NotNull/ NonNull. Câu trả lời được điều chỉnh cho phù hợp.
matiash

2
Nói cách khác, IMHO, chú thích này có thể loại bỏ việc kiểm tra null cần thiết bên trong một hàm và có mã nhanh hơn.
John Pang

1
@JohnPang Bạn có thể , nhưng vì hạn chế được ngụ ý bởi chú thích không được đảm bảo thực sự được thực thi, đó có thể không phải là một ý kiến ​​hay.
matiash

nhập android.support.annotation.NonNull; tìm kiếm điều này trong 2 giờ ... không ai đề cập đến làm thế nào để nhập khẩu NonNull .. do đó upvote
Shirish Herwade

15

Gần đây, một số chú thích hỗ trợ hữu ích đã được thêm vào thư viện hỗ trợ Android. Vai trò chính của chúng là chú thích các thuộc tính của các phương thức và thông số khác nhau để giúp bắt lỗi. Ví dụ: nếu bạn chuyển nullgiá trị cho một tham số được đánh dấu bằng NotNullchú thích, bạn sẽ nhận được cảnh báo.

Các chú thích có thể được thêm vào dự án của bạn với Gradle bằng cách thêm phần phụ thuộc sau:

dependencies {
    compile 'com.android.support:support-annotations:20.0.0'
}

Bạn đang nhận được cảnh báo vì Bundletham số được đánh dấu bằng @NotNullchú thích và bằng cách ghi đè phương thức, chú thích sẽ bị ẩn. Điều đúng đắn cần làm là thêm chú thích vào tham số của phương thức ghi đè.

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}

9

Ngoài các câu trả lời khác, chú thích @NonNull(và đối thủ của nó, @Nullable) chú thích một trường, tham số hoặc kiểu trả về phương thức. IntelliJ và do đó Android Studio có thể cảnh báo bạn về những điều có thể xảy ra NullPointerExceptiontại thời điểm biên dịch.

Một ví dụ là tốt nhất ở đây:

@NonNull private String myString = "Hello";

@Nullable private String myOtherString = null;

@NonNull 
public Object doStuff() {
    System.out.println(myString.length); // No warning
    System.out.println(doSomething(myString).length); // Warning, the result might be null.

    doSomething(myOtherString); // Warning, myOtherString might be null.

    return myOtherString; // Warning, myOtherString might be null.
}

@Nullable
private String doSomething(@NonNull String a) {
    return a.length > 1 ? null : a; // No warning
}

Các chú thích này không làm thay đổi hành vi thời gian chạy (mặc dù tôi đã thử nghiệm điều này), nhưng phục vụ như một công cụ để ngăn chặn lỗi.

Lưu ý rằng thông báo bạn nhận được không phải là lỗi mà chỉ là một cảnh báo, có thể an toàn để bỏ qua nếu bạn muốn. Cách thay thế là bạn cũng tự chú thích thông số, như Android Studio đề xuất:

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.