Gradle で「詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください」と表示されたときの対処

## 「詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください」と言われる

```
$ gradle build

> Task :compileJava
注意:/Users/az/myapp/src/main/java/MyApp.javaの操作は、未チェックまたは安全ではありません。
注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。
```

## 対処方法

build.gradle に以下を追加する。

```gradle
tasks.withType(JavaCompile) {
  options.compilerArgs << '-Xlint:unchecked'
}
```

これで具体的な警告内容が表示されるようになる。

```
$ gradle build

> Task :compileJava
/Users/az/myapp/src/main/java/MyApp.java:10: 警告:[unchecked] raw型ArrayListのメンバーとしてのadd(E)への無検査呼出しです
    myList.add("Hello, world.");
              ^
  Eが型変数の場合:
    クラス ArrayListで宣言されているE extends Object
警告1個
```

## 他の警告も出力してみる

build.gradle に以下を設定する。
-Xlint の unchecked と divzero を指定。
deprecation を指定。

```gradle
tasks.withType(JavaCompile) {
  options.compilerArgs << '-Xlint:unchecked,divzero'
  options.deprecation = true
}
```

コンパイルすると指定した3種類について警告が出力される。

```
$ gradle build

> Task :compileJava
/Users/az/myapp/src/main/java/MyApp.java:11: 警告:[unchecked] raw型ArrayListのメンバーとしてのadd(E)への無検査呼出しです
    myList.add("Hello, world.");
              ^
  Eが型変数の場合:
    クラス ArrayListで宣言されているE extends Object
/Users/az/myapp/src/main/java/MyApp.java:13: 警告:[divzero] ゼロで除算
    int a = 10 / 0;
                 ^
/Users/az/myapp/src/main/java/MyApp.java:15: 警告:[removal] java.util.jarのPack200は推奨されておらず、削除用にマークされています
    Pack200.newPacker();
    ^
警告3個
```


## Gradle の tasks は TaskContainer

- [TaskContainer \- Gradle DSL Version 5\.6\.2](https://docs.gradle.org/5.6.2/dsl/org.gradle.api.tasks.TaskContainer.html)

> You can obtain a TaskContainer instance by calling Project.getTasks(), or using the tasks property in your build script.

## Gradle の options は CompileOptions

[CompileOptions \- Gradle DSL Version 5\.6\.2](https://docs.gradle.org/5.6.2/dsl/org.gradle.api.tasks.compile.CompileOptions.html)

> Main options for Java compilation.

[CompileOptions \- Gradle DSL Version 5\.6\.2](https://docs.gradle.org/5.6.2/dsl/org.gradle.api.tasks.compile.CompileOptions.html)

> compilerArgs
> Returns any additional arguments to be passed to the compiler. Defaults to the empty list. Compiler arguments not supported by the DSL can be added here.

## -Xlint:unchecked は javac コマンドのオプション

[JDK 11ドキュメント \- ツール・リファレンス \- javac](https://docs.oracle.com/javase/jp/11/tools/javac.html#GUID-AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9)

> -Xlint:[-]key(,[-]key)*
> 有効または無効にする警告をカンマ(,)で区切って指定します。指定した警告を無効にするには、キーの前にハイフン(-)を指定します。
> 
> unchecked: 無検査操作について警告します。

## -Xlint にはもっと多くのオプションがある

[JDK 11ドキュメント \- ツール・リファレンス \- javac](https://docs.oracle.com/javase/jp/11/tools/javac.html#GUID-AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9)

> -Xlint:[-]key(,[-]key)*
> 有効または無効にする警告をカンマ(,)で区切って指定します。指定した警告を無効にするには、キーの前にハイフン(-)を指定します。
> 
> サポートされているkeyの値は、次のとおりです。
> 
> all: すべての警告を有効にします。
> auxiliaryclass: ソース・ファイルでは非表示で、他のファイルから使用される補助クラスについて警告します。
> cast: 不要なキャストの使用について警告します。
> classfile: クラス・ファイルの内容に関連した問題について警告します。
> deprecation: 非推奨項目の使用について警告します。
> dep-ann: javadocで非推奨とマークされているのに@Deprecated注釈を使用していない項目について警告します。
> divzero: 定整数0による除算について警告します。
> empty: if以降が空の文であることについて警告します。
> exports: モジュールのエクスポートに関する問題について警告します。
> fallthrough: switch文の1つのcaseから次へのフォール・スルーについて警告します。
> finally: 正常に完了しないfinally節について警告します。
> module: モジュール・システム関連の問題について警告します。
> opens: モジュールのオープンに関する問題について警告します。
> options: コマンド行オプションの使用に関する問題について警告します。
> overloads: メソッドのオーバーロードに関する問題について警告します。
> overrides: メソッドのオーバーライドに関する問題について警告します。
> path : コマンド行の無効なパス要素について警告します。
> processing: 注釈処理に関する問題について警告します。
> rawtypes: raw型の使用について警告します。
> removal: 削除用にマークされたAPIの使用について警告します。
> requires-automatic: requires句内の自動モジュールの使用について開発者に警告します。
> requires-transitive-automatic: requires transitive内の自動モジュールについて警告します。
> serial: シリアル・バージョンIDを指定しない直列化可能なクラスについて警告します。また、直列化可能要素からpublic以外のメンバーへのアクセスについて警告します。
> static : インスタンスを使用したstaticメンバーへのアクセスについて警告します。
> try : tryブロック(try-with-resources)の使用に関する問題について警告します。
> unchecked: 無検査操作について警告します。
> varargs: 安全ではない可能性があるvarargメソッドについて警告します。
> none: すべての警告を無効にします。

-Xlint を指定するだけですべての警告を有効にすることもできる。

[JDK 11ドキュメント \- ツール・リファレンス \- javac](https://docs.oracle.com/javase/jp/11/tools/javac.html#GUID-AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9)

> -Xlint
> 推奨されるすべての警告を有効にします。このリリースでは、利用可能なすべての警告を有効にすることが推奨されています。

-Xlint とは別に -deprecation という省略表記オプションもある。

[JDK 11ドキュメント \- ツール・リファレンス \- javac](https://docs.oracle.com/javase/jp/11/tools/javac.html#GUID-AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9)

> -deprecation
> 非推奨のメンバーやクラスの使用またはオーバーライドのたびに説明を表示します。-deprecationオプションが指定されていない場合、javacは、非推奨のメンバーやクラスを使用またはオーバーライドしているソース・ファイルのサマリーを表示します。-deprecationオプションは-Xlint:deprecationの省略表記です。

## 今回の環境

- Gradle 5.6.2
- OpenJDK 11.0.2

## 参考資料

- [TaskContainer \- Gradle DSL Version 5\.6\.2](https://docs.gradle.org/5.6.2/dsl/org.gradle.api.tasks.TaskContainer.html)
- [CompileOptions \- Gradle DSL Version 5\.6\.2](https://docs.gradle.org/5.6.2/dsl/org.gradle.api.tasks.compile.CompileOptions.html)
- [JDK 11ドキュメント \- ツール・リファレンス \- javac](https://docs.oracle.com/javase/jp/11/tools/javac.html#GUID-AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9)
- [注意:詳細は、\-Xlint:uncheckedオプションを指定して再コンパイルしてください。 \| Androidメモ](http://droidmemo.blogspot.com/2016/06/xlintunchecked.html)
- [メモ：「詳細は、\-Xlint:deprecationオプション～」と注意が出たら \- チラシのすきま](https://monoworks.co.jp/post/android_develop_memo_20150730/)