Yomiage
メニュー

Java実践講座 16:デバッグ・性能・入力境界の調べ方

更新 2026/9/27 6:22:11 公開

投稿者: しゅりりん

到達点は、勘で直す前に再現条件と証拠を集めることです。前提は第11〜15回です。

小さな再現例から始める

不具合の報告には、期待した結果、実際の結果、入力、実行手順、環境を記録します。例外のスタックトレースでは、自分のコードが最初に現れる行を確認します。必要ならIDEのブレークポイントで、入力値と変化する直前の状態を観察します。

次のMain.javaは入力境界を小さくした例です。

public class Main {
    static int parseLimit(String input) {
        if (input == null || input.length() > 4) {
            throw new IllegalArgumentException("件数の形式が不正です");
        }
        final int value;
        try {
            value = Integer.parseInt(input);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("件数は整数です", e);
        }
        if (value < 1 || value > 1000) {
            throw new IllegalArgumentException("件数は1〜1000です");
        }
        return value;
    }

    public static void main(String[] args) {
        System.out.println(parseLimit("1000"));
        try { parseLimit("1001"); }
        catch (IllegalArgumentException e) { System.out.println(e.getMessage()); }
    }
}

出力は1000と、許容範囲を示すメッセージです。入力の長さと意味上の範囲を別々に検査しています。SQLの値はプレースホルダへ渡し、OSコマンドは文字列連結でシェルへ渡さず、必要ならProcessBuilderに引数を分けて渡します。

遅さを測って切り分ける

時間がかかる原因はCPU計算、ファイルや通信待ち、ロック待ち、GCなどに分かれます。Java Flight Recorderやjcmdを使い、どの処理が費用を占めるか確認します。経過時間の計測にはSystem.nanoTimeを使えますが、短い処理の一回だけの値はJITやウォームアップに左右されます。細かな比較にはJMHのような道具を使います。

ログには操作名、所要時間、結果、追跡用IDを残すと調査しやすくなります。パスワードやトークン、記事本文全体などを無条件に記録しないことも、ログ設計の一部です。

練習と解答

練習:処理が10秒かかり、そのうち9秒が外部API待ちでした。計算部分を2倍速くすると全体は何秒でしょうか。

解答:計算1秒が0.5秒になるので9.5秒です。支配的な待ち時間を調べず、ループの書き方だけを変えても大きく改善しません。改善後も同じ入力で測り、正しさのテストを通します。

公式資料

Javaの監視とトラブルシューティングとJMHが参照先です。


Java全20回の目次 | 前の回 | 次の回

このブラウザでは Web Speech API が利用できません。

1 / 16 · 停止中