データフロー分析に応じて、到達されることがないコードを報告します。 これは、前述の常に true または常に false になる条件、到達不可能な loop 本体または catch セクションによる可能性があります。 通常 (常にではありません)、到達不可能なコードは前の警告の結果であるため、原因をより良く理解するために "null 許容性とデータフローの問題"、"定数値"、または "空のコンテナーでの冗長な操作" からのインスペクションの警告を確認します。

例:


  void finishApplication() {
    System.exit(0);
    System.out.println("Application is terminated"); // 到達不可能なコード
  }

このインスペクションはメソッドのコントラクト推論に依存することに注意してください。 特に、常に例外をスローする static または final メソッドを 呼び出す場合、「常に失敗」コントラクトが推論され、メソッド呼び出し後のコードは 到達不可能と見なされます。 例:


  void run() {
    performAction();
    System.out.println("Action is performed"); // 到達不可能なコード
  }
  
  static void performAction() {
    throw new AssertionError();
  }

これにより、使用されるコード後処理がどんな種類のものであれ、例えば、アノテーションプロセッサーが後でメソッド本体を何か役立つものに置換する場合でも、 誤検知が引き起こされる可能性があります。 誤検知の警告を回避するには、org.jetbrains:annotations パッケージの明示的な @org.jetbrains.annotations.Contract アノテーションを使用すると自動コントラクト推論を抑止できます。


  void run() {
    performAction();
    System.out.println("Action is performed"); // 警告はありません
  }

  @Contract("-> _") // 実装は置換されます
  static void performAction() {
    throw new AssertionError();
  }

2024.1 の新機能です