导入 NotNull 或 Nullable,Android Studio 将无法编译

当我将@NotNull 或@Nullable 注释添加到参数 Android Studio 时,它会自动帮助我添加/lib/annotations.jar 和导入

import org.jetbrains.annotations.NotNull
import org.jetbrains.annotations.Nullable;

但在此之后,项目将不会编译。如果我也删除注释,但保留导入语句,项目仍然不会编译。如果我删除导入语句的 但是为 NotNull 和 Nullable 的项目编译 好吧

Android Studio 给出了一个通用错误:

Gradle:
FAILURE: Build failed with an exception.


* What went wrong:
Execution failed for task ':Bugtester:compileDebug'.
> Compilation failed; see the compiler error output for details.


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

从 cmd 运行 gradlew compileDebug给出了一个小小的提示:

:Bugtester:compileDebug FAILED


FAILURE: Build failed with an exception.


* What went wrong:
Execution failed for task ':Bugtester:compileDebug'.
> Cannot find System Java Compiler. Ensure that you have installed a JDK (not just a JRE) and configured your JAVA_HOME system variable to point to the according directory.


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.


BUILD FAILED

所以我检查了我的环境变量,它们被设置为:

JAVA_HOME=C:\Program Files (x86)\Java\jre7
JDK_HOME=C:\Program Files\Java\jdk1.7.0_21\

有人对此有什么想法吗? (我对 Java 和 android 编程都是新手)

117724 次浏览

At the moment, there is no NonNull/Nullable annotations in the Android API or in the support library. You also cannot use the IntelliJ one since they are not on the compilation classpath when building with Gradle.

However, you can easily create your own. It's very simple:

@Documented
@Retention(RetentionPolicy.CLASS)
@Target({METHOD,PARAMETER,LOCAL_VARIABLE,FIELD})
public @interface NonNull {
}

Once this is down, you can configure IntelliJ (or Android Studio) to recognize this one (and the matching @Nullable) to be the default annotation used for Null-checks.

To do this, go in the IntelliJ preferences, under Inpections, and then find the @NotNull/@Nullable problems entry under Probable Bugs in the inspection tree.

Select the item, and in the bottom right you'll have a button to "Configure Annotations". This will allow you set your own annotations as the one intelliJ will use for this inspection.

The best way is to use the maven dependency

  1. set the repository path, by adding

    repositories {
    maven {
    url "https://repository.jboss.org/nexus/content/repositories/thirdparty-releases"
    }
    }
    
  2. add the dependency

    dependencies {
    compile 'org.jetbrains:annotations:7.0.2'
    }
    
  3. PROFIT!

I guess, the right way is using original JetBrains library from MavenCentral repository in your build.gradle dependencies (latest available version in this example):

dependencies {
implementation 'com.intellij:annotations:+@jar'
...
}

You can also use android's own @NonNull & @Nullable:

  • Add the following to build.gradle:

    dependencies {
    ...
    // For @Nullable/@NonNull
    compile 'com.android.support:support-annotations:+'
    }
    
  • Go to File / SettingProject SettingsInspections and search for "nullable".

    In Constant conditions & exceptions and @NotNull/@Nullable problems, click Configure annotations and select Android's annotations.

    You may also want to check out Suggest @Nullable annotations… under Constant conditions & exceptions, or possibly tweak other options.

In 2015, you would have used annotations from android.support.annotation package. I am just not sure when they added them as in the docs there isn't that typical sentence "Added in API level X" and I don't feel like reading blogs, etc. >]

import android.support.annotation.NonNull;


...


public void fooFighter(@NonNull Object honeyBunny){
...
}

For using Android support anotation like - @Nullable, @NonNull etc.. In your project must be imported android support annotations library. Just add this line to dependensies in gradle file

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

And import package to class.
For using @Nullable annotation:

import android.support.annotation.Nullable;

For @NonNull

import android.support.annotation.NonNull;

More info you can find here Android developers

I am facing that problem for gradle-5.1.1 - Android Studio 3.4 and the error like that - Compilation failed; see the compiler error output for details. Execution failed for task ':app:compileDebugJavaWithJavac'. etc. In this case I use

implementation 'org.jetbrains:annotations:16.0.2'

and above all error will be clear.

For Maven add dependency:

<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>16.0.1</version>
</dependency>

Just import androidx.annotation.Nullable for that purpose