我正在读https://developer.android.com/studio/write/annotations.html

在我的示例中,我使用注释@ NonNull,@ IntegerRes和@IntRange。这是我的代码:

package com.example.maksim.myapplication;

import android.os.Bundle;
import android.support.annotation.IntRange;
import android.support.annotation.IntegerRes;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("MyAnnotation", "" + getStr(null));
        setAlpha(12000);
        Log.d("MyAnnotation", "" + getRes(12));
    }

    public static boolean getStr(@NonNull String s) {
        return s.contains("a");
    }

    public static int getRes(@IntegerRes int s) {
        return s;
    }

    public void setAlpha(@IntRange(from=0,to=255) int alpha) {
        alpha *= 2;
        Log.d("MyAnnotation", "setAlpha=" + alpha);
    }
}

这是我的模块的build.gradle:
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"

    defaultConfig {
        applicationId "com.example.maksim.myapplication"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:25.0.0'
    testCompile 'junit:junit:4.12'
}

当我将null传递给getStr或将[0,255]中的整数传递给setAlpha并运行./gradlew app:assembleRelease时,它将被构建。但是,当我用不是整数资源ID的整数调用getRes()时,构建失败。

那么,为什么不中止@NonNull和@IntegerRes的构建呢?

最佳答案

Documentation

例如,如果将包含空值的局部变量作为参数传递给带有附加到该参数的@NonNull批注的方法,则构建代码会生成警告,指示非空冲突。另一方面,尝试引用由@Nullable标记的方法的结果而不先检查结果是否为空会生成空警告。如果对方法的每次使用都应进行显式的空检查,则仅应在方法的返回值上使用@Nullable。

它应该只是

10-07 19:21
查看更多