こんにちは!ぐちです。
世の中、こんなはずじゃなかった〜みたいなことってありますよね。笑
心配ごとの8割は実現せずに杞憂に終わり、残りの2割中1割は事前準備を行うことで発生を防げるという話を聞いたことがあります。何の話やねん?!ということですが、プログラムでも「こういうはずだけど、こうじゃなかった〜」ということがあると思います。笑
そこで今回は事前条件のチェックについて学んだ内容をご紹介したいと思います。
Vol.8はこちらからどうぞ。
事前条件チェック
例えば、2つの数値を引数として受け取って、除算を行うメソッドがあった場合に、割る方の数値は0ではなダメなんですが、呼び出し元に委ねていては思わぬ動作につながる可能性があります。
そういった場合に事前条件のチェックを行う構文が用意されています。例によって例のごとくコードを見比べてみましょう!
Java
Javaには事前条件のチェックを行うためのassert
という構文が用意されています。使い方は「こうであるべき」という条件をassert
に続けて記述するだけです。
下記のコードを確認してみてください。
public class Main extends Parent { public static void main(String[] args) { System.out.println(div(10, 0)); } public static int div(int a, int b) { assert b != 0; return (a / b); } }
assert
のあとに、「b
は0
でないはず」という条件分を記述しています。b
が0
の場合に、AssertionError
が発生し、プログラムが終了します。
ただし、asser
を記述しただけでは思ったように動作しません。実行オプションに-ea
を付与する必要があります。
$ java -ea Main
IntelliJ IDEAのようなIDEの場合は実行設定画面に、実行時オプションを設定する箇所があります。参考までに画像を載せておきますね。
Scala
さて、続きまして、Scalaですが、require()
という事前条件のチェック構文が用意されています。使い方はJavaのassert
と同様です。さっそくコードを見てみましょう。
object Section3 { def div(a: Int, b: Int): Int = { require(b != 0) a /b } def main(args: Array[String]): Unit = { println(div(10, 0)) }
require()
の引数に「b
は0
でないはず」という条件を記述することで、条件に合致しない場合はIllegalArgumentException
が発生しプログラムを終了させることができます。
Scalaの場合は実行時にオプションを付与する必要もなく、通常通り実行して事前条件チェックが動作します。
では今回はこの辺で。