assertの使い方!Javaのアサーションを使う方法【初心者向け】

初心者向けにJavaのアサーションの使い方について解説しています。アサーションを使うことによってプログラムが正しく動作するかを確認することができます。assertステートメントの書き方、実行後の結果の見かたについてサンプルで学びましょう。

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

この記事では、Javaのアサーションの使い方(assertステートメントの書き方)について解説します。

実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。

 

そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。
 

なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。

 

田島悠介

今回は、Javaに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

アサーションの使い方について詳しく説明していくね!

大石ゆかり

お願いします!

アサーションとは

アサーションとは、プログラムが正しく動作していることを確認するための手法のひとつです。日本語で「表明」と言うこともあります。

プログラムの各所にその時点で必ず真(true)となるはずの条件を宣言しておくと、実行時にその条件が満たされない状態になるとJavaが自動でそれを検出し、例外をthrowします。

例外がthrowされればプログラムに何らかの誤りがあることがわかりますので、開発者は、誤りを修正しより誤りの少ないプログラムを作成するのに役立てることができます。

 

アサーションの使い方(assertステートメントの書き方)

Javaでのアサーションは、「assert」ステートメントを使って表現します。

「assert」ステートメントの書き方は、次のいずれかです。

assert 条件;
assert 条件 : メッセージ;

「条件」には、その時点で必ず真(true)となるはずの式を書きます。例えば「価格は必ず正の値である」ということを表す「price > 0」といったものです。

この条件が満たされないことがあれば、Javaが自動で例外「AssertionError」をthrowします。

「メッセージ」には、例外「AssertionError」のコンストラクタに渡すメッセージ(String)を書くことができます。複数の「assert」ステートメントを使っている場合にどの箇所で例外が発生したのかをわかりやすく知らせるのに役立ちますね。

 

[PR] Javaで挫折しない学習方法を動画で公開中

実際に書いてみよう

例として、「価格と数量から合計金額を算出する」プログラムにアサーションを取り入れてみましょう。

次の仕様のプログラムを作成します。

  1. プログラム引数で価格と数量を受け取り、数値に変換します。
  2. 価格と数量の両方が、正の値であるかチェックします。
  3. いずれも正の値であれば、計算メソッド「sum」で計算を行い、結果を表示します。
  4. 計算メソッド「sum」では、計算処理の前に「assert」ステートメントを使って、このメソッドを呼び出した時点では価格と数量が必ず正の値である(2.でチェックしているため)、ことを表明します。
  5. いずれかが正の値でなければ、メッセージ「価格と数量には正の値を指定してください」を表示します。
class Calculator {
    public static void main(String[] args) {
        // 1.
        int price = Integer.parseInt(args[0]);
        int num = Integer.parseInt(args[1]);

        // 2.
        if (price > 0 || num > 0) {
            // 3.
            int sum = sum(price, num);
            System.out.printf("%d + %d = %d%n", price, num, sum);
        } else {
            // 5.
            System.out.println("価格と数量には正の値を指定してください");
        }
    }

    private static int sum(int price, int num) {
        // 4.
        assert price > 0 : "price: " + price;
        assert num > 0 : "num: " + num;
        
        return price * num;
    }
}

コンパイル後、次のコマンドで実行してみましょう。

java -ea Calculator 10 3

「-ea」というオプションは、「アサーションを有効にする」という意味です。これを指定しない場合はプログラム中に書かれた「assert」ステートメントは無視されます。

さて、実行すると次の結果が表示されるはずです。

java -ea Calculator 10 3

10 + 3 = 30

正しく計算できていますね。

それでは次は、価格に0を指定します。2.でチェックをしているので、メッセージ「価格と数量には正の値を指定してください」が表示されるはずです。

java -ea Calculator 0 3

Exception in thread "main" java.lang.AssertionError: price: 0
	at Calculator.sum(Calculator.java:20)
	at Calculator.main(Calculator.java:10)

想定していた動作とはならず、例外「AssertionError」が発生しプログラムが異常終了してしまいました。

プログラムのどこかに問題がありそうです。

以上のように、アサーションを利用することで、プログラムのどこかに誤りがあることが検出できました。

誤りを見つけて正しい結果が得られるよう修正してみましょう。

 

監修してくれたメンター

青柳哲夫

独立系SIerやベンチャーを経て、現在はフリーランスエンジニアとして活動しています。
PHPやJava・Rubyでの業務系Webアプリケーション開発が得意です。
TechAcademyではJavaコース・ブロックチェーンコースを担当しています。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

TechAcademyでは、初心者でも最短4週間でJavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプJava講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。