

現在のJavaでnull安全にするためには`@Nullable`/`@NonNull`をいちいち設定しなければいけませんが、IDE(今回の場合はIntelliJ
IDEA)にはデフォルトで`@Nullable`として扱う設定があります。  
[![IntelliJ
IDEAのデフォルトで@Nullableとして扱う設定](https://i.stack.imgur.com/9ZyiZ.png)](https://i.stack.imgur.com/9ZyiZ.png)  
しかし、自分では書き換えられない外部ライブラリに対しても適用されてしまうため、エラーと表示するようにすると問題のないプログラムでもエラーがあるように見えてしまいます。  
「スコープ」を「プロジェクトファイル」のみにすれば解決できるかとも思いましたがダメでした。

外部ライブラリに対しては`@Nullable`として扱わないように設定する方法は無いでしょうか。あるいはこれ以外の方法でデフォルトでnull安全を実現する方法は無いでしょうか。


CC BY-SA 4.0
2023-03-23T04:44:15.600
94282
2023-03-23T08:55:04.240
816
question
java intellij-idea
IntelliJ IDEAで外部ライブラリを除きデフォルトでnull安全を設定する方法


> 外部ライブラリに対しては@Nullableとして扱わないように設定する方法は無いでしょうか。

IntelliJ IDEAを調べてみましたが、そのような方法は見つかりませんでした。おそらくないのだと思います。

> あるいはこれ以外の方法でデフォルトでnull安全を実現する方法は無いでしょうか。

null安全を必要としているならば、設定はこのままで呼び出し側で一つ一つnullチェックをするのがよいと思います。

**対象とするコードの例**

[code]

    InputStream stream = socket.getInputStream();
    
[/code]

**修正例1**

NullPointerExceptionを発生させたくなく、固有のエラー処理を行いたいなら、

[code]

    if (socket != null) {
        InputStream stream = socket.getInputStream();
        if (stream != null) {
            reader = new BufferedReader(new InputStreamReader(stream));
        } else {
            //エラー処理
        }
    } else {
        //エラー処理
    }
    
[/code]

Assertionでよいなら、

**修正例2**

[code]

    assert socket != null;
    InputStream stream = socket.getInputStream();
    assert stream != null;
    reader = new BufferedReader(new InputStreamReader(stream));
    
[/code]

`Objects.requireNonNull`を使う方法もあります。この方法はIntelliJ IDEAの修正案をそのまま適用したものです。

**修正例3**

[code]

    reader = new BufferedReader(new InputStreamReader(Objects.requireNonNull(Objects.requireNonNull(socket).getInputStream())));
    
[/code]


CC BY-SA 4.0
2023-03-23T08:55:04.240
94284
2023-03-23T08:55:04.240
35558
94282
answer