データフローを解析した結果、到達することがないと判断されたコードを報告します。 このようなコードは、常に結果が 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 の新機能です