3行で
-
tryParse
は内部でparse
を呼んでおり、 型変換に失敗するとparse
は例外(FormatException
)を返し、tryParse
は例外の代わりにnull
を返す -
tryParse
の引数にnull
を渡すと、ArgumentError(Invalid argument)
が発生するが、FormatException
ではないので、tryParse
はnull
を返さない -
tryParse
で例外処理してるので失敗ならnull
が必ず来るはずだと思い込み実装すると危険なので、null safetyが有効になるまでは注意したい
検証
- DartPadで検証した結果は以下のとおり
- null safetyだとコンパイルで気づく可能性があるので安心です
❌ null safety | ✅ null safety |
---|---|
コメントに注意書きはあるけど...
-
int.tryParse
のコメントには注意書きがあるけど、DateTime.tryParse
には注意書きがなく、DateTime.parse
の方にしかなかったりする - 一度誤って
null
を渡して痛い目をみないと気づかない可能性が高い
int.tryParse コメント有り |
DateTime.tryParse コメント無し |
---|---|
どうする?
- null safetyは来年の春ごろらしいので今から有効にするのは時期尚早でいろいろと対応が大変です
- とりあえず、下記のような応急処置になりそう
空文字にする
final result = int.tryParse(v ?? '');
特定の型で制御する
try {
final result = int.parse(null);
print(result);
} on ArgumentError catch (e, s) {
print('✅ $e $s');
} on FormatException catch (e, s) {
print('✅ $e $s');
}
全部キャッチする
try {
final result = int.parse(null);
print(result);
} catch (e, s) {
print('✅ $e $s');
}