IntelliJ IDEA 2023.2 ヘルプ

データフローを分析する

大きなコードベースで作業する場合、データの処理方法とワークフローを改善してコードのパフォーマンスと可読性を向上させる方法を理解することが難しい場合があります。これを容易にするために、IntelliJ IDEA データフロー分析では、プログラムを実行せずに、考えられるすべてのデータ変換を追跡できます。この情報は、アプリのデザインを改善し、バグが現れる前にバグを診断するために使用できます。

データフロー分析は、次の情報を提供します。

  • メソッドまたは式の下流のデータに何が起こるか: コンシューマーとは何か、生成される可能性のある値は何か。

  • メソッドが持つことができるすべての可能な入力値と、特定の値の取得元。

  • 変数が null になる可能性があるかどうか。この情報を使用すると、予期しない NullPointerException を防止し、冗長な null チェックと @Nullable アノテーションを削除してワークフローを最適化できます。

分析結果を表示する

  1. 分析するデータを表す識別子にキャレットを置きます。宣言、ステートメント、メソッドのパラメーターなどでシンボルを分析することを選択できます。

    Dfa caret
  2. メインメニューから、コード | コードの解析 | ここまでのデータフローを選択して上流(生産者)のデータを分析するか、コード | コードの解析 | ここからのデータフローを選択して下流(消費者)のデータを分析します。

  3. 分析の範囲を指定します。テストを除外する場合は、テストソースを含めるチェックボックスをオフにします。

    また、特定の値または式の結果に関心がある場合は、それをフィルターフィールドで指定して、関連する結果のみを表示できます(ここまでのデータフローで使用可能)。

    フィルターの例

    null/null 以外の値

    null !null

    文字列

    "Hello"

    列挙型

    SPRING SUMMER FALL WINTER

    boolean

    true false

    int/long

    0 >0 <=100 !=9

    Dfa scope

分析の結果を含むツールウィンドウが開きます。それらはノードに編成され、それぞれがデータフローステップを表します。

Dfa results

例では:

  • getComplete() メソッドは、complete 変数の値を返します。

  • complete 変数には、初期化中に null を割り当てるか、setComplete メソッドで任意の値を取得できます。

  • setComplete() メソッドは行 17 および 48 で呼び出され、値 false および true をそれぞれ割り当てます。

結果をリフレッシュ

  • コードが変更され、同じ式を再度分析する場合は、分析ツールウィンドウでリフレッシュをクリックします。

可能な値を分析する

ここまでのデータフローを表示する場合、ノードを値でグループ化して、可能な値の概要を取得したり、ノードの起源を分析したりできます。

  • 特定の値に関する情報を取得するには、分析ツールウィンドウの左側にあるリーフ式でグループ化をクリックします。

  • null/null 以外の値に関する情報を取得するには、分析ツールウィンドウの左側にあるリーフ式の nullness によるグループ化をクリックします。

ファイルにエクスポート

分析の結果をテキスト形式で共有する場合は、エクスポートオプションを使用します。

  1. エクスポートする分析タブを選択します。

  2. 分析ツールウィンドウの左側にあるテキストファイルにエクスポート App toolbar decorator export をクリックします。

  3. 結果をクリップボードにコピーする場合は、コピーをクリックします。結果をファイルにエクスポートするには、ファイルにエクスポートフィールドでファイルを選択し、保存をクリックします。

スタックトレースの分析

プログラムが例外でクラッシュした場合、スタックトレースをデータフロー分析の入力として使用できます。これは、不適切な値の原因を追跡できます。

public class ArrayTest { static int[] ints = new int[5]; public static void main(String[] args) { ArrayTest arrayTest = new ArrayTest(); int a = arrayTest.getRandomElement(ints); System.out.println(a); } private int getRandomElement(int[] array) { int index = new java.util.Random().nextInt(20); return array[index]; } }

上記のコードは固定サイズの配列を作成し、そこからランダムな要素にアクセスしようとします。インデックスが配列の長さより大きい場合があるため、ArrayOutOfBoundsException がスローされることがあります。

  1. スタックトレースで、例外をスローしたフレームのソース参照をクリックします。

    Dfa stacktrace

    エディターがソースの対応する行に移動します。

  2. ポップアップをクリックして、例外の原因となった値のソースを見つけます。

    Dfa stacktrace 2

ここまでのデータフローが開き、フィルターが適用されます。