最近、Kotlin初めてみました。 (Javaもそこまでたくさんは触ったことはありません。)
そんな中、電卓を作成していたら初めて知りました。
0除算の結果が型によって変わるんですね。
// テスト用メソッド。 // 記述は省略していますが、画面上のボタンを押すとこのメソッドが呼ばれます。 private fun testMethod(){ // Floatで0除算をしてみます。 try { Log.d("DivideTest1", "TEST1 ~Float~") var value1 :Float = 3F var value2 :Float = 0F var result1 = value1 / value2 // 計算自体は何事もなく完了しますが、resultは"Infinity"となります。 Log.d("DivideTest", "RESULT: $result1") // ついでにInfinityが何の型なのか見てみました。Float型でした。当たり前か。 Log.d("DivideTest", "CLASS: ${result1::class.java}") } catch(ex: ArithmeticException){ // Floatの場合は例外が発生せず、ここは通りません。 Log.d("DivideTest2", "ArithmeticException") } // Intで0除算をしてみます。 try { Log.d("DivideTest", "TEST2 ~Int~") var value1: Int = 3 var value2: Int = 0 var result1 = value1 / value2 // 1つ上の行の0除算で例外が発生するため、この行は実行されません。 Log.d("DivideTest", "RESULT: $result1") } catch(ex: ArithmeticException){ // Intの場合は例外が発生してこちらを通ります。 Log.d("DivideTest", "ArithmeticException") } }
結果ログ
D/DivideTest1: TEST1 ~Float~ D/DivideTest: RESULT: Infinity D/DivideTest: CLASS: float D/DivideTest: TEST2 ~Int~ D/DivideTest: ArithmeticException
結論、Floatの場合は if(value2 == 0F)
等、直接0じゃないかを確認する処理を行う必要があるようです。
参考サイト
変数をdouble型にしたら例外処理が動作しない:JavaTips 〜Javaプログラミング編 - @IT
Infinity=無限大!
Infinityと聞くと、映画ベンジャミンバトンの陽気な船乗りかつアーティストのおじさんを思い出します。
インフィニティーー!って大きな声で言いたくなります(笑)