電子書籍の厳選無料作品が豊富!

教本ではtry catchのExceptionは全てのエラーを拾えるみたいに書いてあり、例えのコードであるStringの変数をIntに変換するような事態には実際に対応できます。
しかしStringの変数を四則演算するようなエラーだと対応できません。

Exceptionで対応できないコードの例:
fun main() {
var test = "inu"
try {
println(test * 3)
}catch(e: Exception){
println("エラーです")
}
}

Exceptionも実際には万能ではないということでよいのでしょうか。
また、そうだとすると万能なエラー対応の方法はありますか。

質問者からの補足コメント

  • うーん・・・

    補足です。

    例えば
    println(test * 3)

    println(test.toInt())
    にするとここは間違っていますがコードそのものは実行可能です。
    実行可能、つまりExceptionが働いてくれたイコール対応できる、です。
    文字列のInt型への変換という間違いには対応(強制的に無視して代わりの処理を)できていますが、文字列を四則演算するような間違いにすると対応できていません。
    ということはExceptionは万能ではない、あるいはそれ以外の問題なのか、がこちらの意図です。

      補足日時:2019/12/10 08:32

A 回答 (3件)

補足について


> println(test * 3)
> を
> println(test.toInt())
後者だと、プログラムには静的に(すなわちコンパイル時に)チェックできる間違いはなくなります。toIntが"inu"を整数値に変換できないことはコンパイラは知る由もないことですから。
従って、この場合はプログラムが実行され、実行時にtoIntが"inu"を整数値に変換できないということを例外を発生させて報告します。それがcatchで捕捉されて『エラーです』を表示するわけです。
一方で前者だと test * 3 が間違っていることをコンパイラが検知します。これは前の文 var test = "inu" からtestが文字列型であることを推論し、string * int の演算が定義されていないからです。この場合コンパイルエラーになってプログラムは実行されず、従ってExceptionは発生しません。
Exceptionの機能はコンパイルで静的にはチェックできない間違いをプログラムの実行時に検出するもので、コンパイル時に捕捉されるエラーは対象外です。
    • good
    • 0
この回答へのお礼

調べてみるとコンパイルエラーと実行時エラーというものがあるんですね。
なるほど。Exceptionはコンパイルエラーには対応できないということですね。

お礼日時:2019/12/10 09:51

コンパイル出来なくて実行不能なプログラムで


実行時にエラーを捕捉出来ないのは、そもそも実行出来ない
のだからあたりまえだけど
exceptionに何を期待しているのでしょう。

コンパイル出来ない、つまり何をどう実行すべきか不明なプログラム
の実行時エラ―というもの考える事自体
奇妙奇天烈だと思います。
    • good
    • 0

Kotlinは使ったことないけど静的型付け言語だよね。


質問に記載のコードだとException以前にコンパイル段階でエラーになると思うけど。
Exceptionは実行時のエラーを捉えるので実行まで行かないなら話にならない。
あるいは string * int の演算が定義されていてエラーにならず実行できる?
『Exceptionで対応できない』というのがどういう状況かで話が変わるね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!