assertについて:簡単に説明すると
assert とは、Java の
キーワード
の一つで、アサーションという機能を利用する際に使用します。
assertについて:もっと詳しく
アサーションとは、プログラムが仮説通りに処理が正しく動作しているかを検証するための機能のことで、
バージョン 1.4 から導入された新しい機能です。
この機能を利用する場合、コンパイル方法や実行方法が通常とは少し異なるのでしっかりおさえておきましょう。
まずはassertの書式を以下に示します。
assert (条件式);
assert (条件式):(メッセージ式);
条件は boolean 型もしくは結果が boolean 型になる式でなければなりません。
メッセージ式は String 型に変換可能な式である必要があります。
この条件式が true と評価されたの場合、このコードは無視されます。
条件式が false と評価された場合、AssertionErrorが送出されます。
つづいてコンパイル方法と実行方法です。
コンパイル方法:
javac -source 1.4 ソースファイル名
実行方法:(どちらか一方)
java -enableassertions クラス名
java -ea クラス名
コンパイル時には -source オプションによりソースコードがバージョン 1.4 であることを
明示的に示す必要があります。
これは 1.4 よりも前のバージョンでは、assert はキーワードとして予約されていないため、
assert が識別子として利用されている可能性に配慮したものです。
そのため、オプションでバージョンを 1.4 に指定しなければ assert はキーワードとして認識されず、
識別子として利用することもできます。
(コンパイル時に警告は発生しますが、きちんとコンパイルされます。)
また、実行時にはアサーション機能がデフォルトでオフになっているので、オプションで明示的に
オンにする必要があります。
このオプションは「-enableassertions」か、その省略形の「-ea」が使用することができます。
それでは具体的なコードで確認しましょう。
class Test{
public static void main( String args[] ){
int num = -5;
int sum;
sum = getSum( num );
System.out.println( "sum == " + sum );
}
static int getSum( int num ){
assert ( num >= 0 );
int price = 300;
int sum = price * num;
return sum;
}
}
>javac -source 1.4 Test.java
>java -ea Test
Exception in thread "main" java.lang.AssertionError
at Test.getSum(Test.java:10)
at Test.main(Test.java:5)
このプログラムの例では getSum( ) が呼び出される際に、引数が
0以上であるかをチェックしています。
期待通り0以上であれば assert 文は何もしませんが、条件に合わず条件式が
false になった場合、 AssertionError が送出されます。
これにより開発者は仮説通りにプログラムが動作していないことを知ることができます。
ちなみに、実行時に「-ea」または「-enableassertions」オプションを付けないと
デフォルトではアサーション機能はオフなので assert 文は完全に無視されます。
>javac -source 1.4 Test.java
>java Test
sum == -1500
このように実行時にオプションの指定の有無でアサーションを有効化、無効化を選択できます。
これにより開発時にはアサーションを有効化しておいて、完成品ではアサーションを無効化すれば
完成後にassert文を削除する必要がないのです。
また、デバッグのために有効なメッセージを assert 文に含めることができます。
class Test{
public static void main( String args[] ){
int num = -5;
int sum;
sum = getSum( num );
System.out.println( "sum == " + sum );
}
static int getSum( int num ){
assert ( num >= 0 ) : "num ==" + num;
int price = 300;
int sum = price * num;
return sum;
}
}
>javac -source 1.4 Test.java
>java -ea Test
Exception in thread "main" java.lang.AssertionError: num == -5
at Test.getSum(Test.java:10)
at Test.main(Test.java:5)
仕込んでおいたメッセージがAssertionErrorの後ろに表示されていますね。
こうしておけばデバッグの際に原因追及がやりやすくなります。
ところで assert 文の条件式では副作用のある式を指定してはいけません。
副作用があるとはどういうことか、次のコードを見てください。
class Test{
public static void main( String args[] ){
int num = 0;
int sum;
sum = getSum( num );
System.out.println( "sum == " + sum );
}
static int getSum( int num ){
assert ( ++ num >= 0 ) : "num ==" + num;
int price = 300;
int sum = price * num;
return sum;
}
}
このコードでは、assert 文を有効にした場合と無効にした場合で異なる結果が返されてしまいます。
>javac -source 1.4 Test.java
>java -ea Test
sum == 300
>javac -source 1.4 Test.java
>java Test
sum == 0
これは assert 文の中で処理が実行されてしまっているからです。
このように、assert 文を有効にするか否かで結果に違いが出てしまうような、副作用を伴うアサーションは
利用してはいけません。
|
SJC-P対策問題集
Java認定試験( SJC-P/310-035 )対策のメルマガ問題集も好評発刊中!
もちろん無料です。
またバックナンバーも見やすくしてオンライン問題集として随時アップしていきます。
受験しない人でも Java の基礎知識を学習するのに最適です。
SJC-P対策参考書
現在、Java認定試験(SJC-P/310-035)対策の参考書は本当にたくさん出版されてます。
ここでは、その中から厳選した本当に役立つ参考書を紹介します。
無駄な出費を抑えるためにも、ぜひ参考にして下さい。
SJC-P対策Java用語集
Java認定試験( SJC-P/310-035 )合格のために必要な Java の用語を集めました。
試験対策にはもちろん、試験以外で Java を学習する際にもご活用下さい。
更新履歴
このサイトの最新情報はここで確認できます。
また、今までこのサイトがどのような軌跡を辿ってきたのかも知ることができます。
Javaを始める人へ
これからJavaを始めようとしているあなたへ。
Javaの勉強を始めるにはどうしたら良いのかを説明しています。
また、初心者に役立つ情報を提供していきます。
Java認定資格の概要
Java認定資格にはどのようなものがあるのか。
資格取得のためにはどのような知識が必要なのか。
その他、資格を取得することのメリットなど、Java認定資格の概要を説明します。
LINK
Javaの勉強に役立つリンク。
その他のプログラミングに関するリンク。
ソフトウェアに関するリンクなど、管理人の主観で集めたリンク集です。
相互リンクも常時募集中!
詳細は以下のページで確認して下さい。
このサイトについて
このサイト「1発合格★Java認定試験!」についての説明です。
サイトで掲載しているソースコードや問題や免責事項などについて説明しています。
初めての人は一度のぞいてみて下さい。
ちょっとひと息
仕事や試験勉強に疲れたら、ここでちょっと一息つきませんか。
一生懸命に打ち込むのも良いけど、たまには何も考えずにゆっくり休むのも良いものです。
たまにはのんびり脳みそをリフレッシュしましょう。
|