教本ではtry catchのExceptionは全てのエラーを拾えるみたいに書いてあり、例えのコードであるStringの変数をIntに変換するような事態には実際に対応できます。
しかしStringの変数を四則演算するようなエラーだと対応できません。
Exceptionで対応できないコードの例:
fun main() {
var test = "inu"
try {
println(test * 3)
}catch(e: Exception){
println("エラーです")
}
}
Exceptionも実際には万能ではないということでよいのでしょうか。
また、そうだとすると万能なエラー対応の方法はありますか。
No.2ベストアンサー
- 回答日時:
補足について
> println(test * 3)
> を
> println(test.toInt())
後者だと、プログラムには静的に(すなわちコンパイル時に)チェックできる間違いはなくなります。toIntが"inu"を整数値に変換できないことはコンパイラは知る由もないことですから。
従って、この場合はプログラムが実行され、実行時にtoIntが"inu"を整数値に変換できないということを例外を発生させて報告します。それがcatchで捕捉されて『エラーです』を表示するわけです。
一方で前者だと test * 3 が間違っていることをコンパイラが検知します。これは前の文 var test = "inu" からtestが文字列型であることを推論し、string * int の演算が定義されていないからです。この場合コンパイルエラーになってプログラムは実行されず、従ってExceptionは発生しません。
Exceptionの機能はコンパイルで静的にはチェックできない間違いをプログラムの実行時に検出するもので、コンパイル時に捕捉されるエラーは対象外です。
調べてみるとコンパイルエラーと実行時エラーというものがあるんですね。
なるほど。Exceptionはコンパイルエラーには対応できないということですね。
No.3
- 回答日時:
コンパイル出来なくて実行不能なプログラムで
実行時にエラーを捕捉出来ないのは、そもそも実行出来ない
のだからあたりまえだけど
exceptionに何を期待しているのでしょう。
コンパイル出来ない、つまり何をどう実行すべきか不明なプログラム
の実行時エラ―というもの考える事自体
奇妙奇天烈だと思います。
No.1
- 回答日時:
Kotlinは使ったことないけど静的型付け言語だよね。
質問に記載のコードだとException以前にコンパイル段階でエラーになると思うけど。
Exceptionは実行時のエラーを捉えるので実行まで行かないなら話にならない。
あるいは string * int の演算が定義されていてエラーにならず実行できる?
『Exceptionで対応できない』というのがどういう状況かで話が変わるね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- Java すみません。助けてください。 javaについての質問です。 integerに変換できない数値をエラー 5 2022/05/18 19:16
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- オープンソース Try Kotlinで readLine()を使うには 1 2023/03/27 21:06
- Ruby pythonエラー 4 2022/11/11 19:12
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java Javaについて質問です。 勉強し始めたばかりの初心者です。 相続税について課税額を算出するコードを 1 2022/05/31 19:02
- JavaScript [再掲]指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードについて 1 2023/05/10 15:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
End Sub が必要です。
-
対応する関数ヘッダーがありません
-
DLL内からの外部変数の参照
-
フォートランのエラーについて...
-
intel fortranのエラーで困って...
-
Excel VABについて 下記記述が...
-
python numpy.linalg.inv()での...
-
VBAコードのインデント表示
-
配列数式の解除
-
Excel・Word リサーチ機能を無...
-
メッセージボックスのOKボタ...
-
特定のPCだけ動作しないVBAマク...
-
教えて下さい
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
一つのTeratermのマクロで複数...
-
マクロで"#N/A"のエラー行を削...
-
ファイルが見つからない時、ス...
-
実行時エラー'-2147467259(8000...
-
UserForm1.Showでエラーになり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
フォートランのエラーについて...
-
intel fortranのエラーで困って...
-
C言語のプログラムが実行できま...
-
対応する関数ヘッダーがありません
-
Excel VABについて 下記記述が...
-
VBでエラー'ActiveX component ...
-
他クラスからForm1内コントロル...
-
Makefile と <math.h>
-
VB.NETのStructureの使い方を教...
-
43:syntax error at end of input
-
フォートラン(fortran)のエラー...
-
AccessVBAでVLookupを使いたい
-
(fortran) run-time erro M620...
-
解説サイトに従ったfortran並列...
-
verilogでデマルチプレクサの作...
-
Excel VBA: UserForm.Show で実...
-
構造体のポインタ参照
-
【ルネサスのマイコン】E8aから...
-
typedef による2重定義
おすすめ情報
補足です。
例えば
println(test * 3)
を
println(test.toInt())
にするとここは間違っていますがコードそのものは実行可能です。
実行可能、つまりExceptionが働いてくれたイコール対応できる、です。
文字列のInt型への変換という間違いには対応(強制的に無視して代わりの処理を)できていますが、文字列を四則演算するような間違いにすると対応できていません。
ということはExceptionは万能ではない、あるいはそれ以外の問題なのか、がこちらの意図です。