search
LoginSignup
1

More than 1 year has passed since last update.

diverseDiverse Advent Calendar 2020 Day 2

posted at

updated at

Organization

DartのtryParseの引数にnullを渡すとnullが返らないので注意しよう

3行で

  • tryParseは内部でparseを呼んでおり、 型変換に失敗するとparseは例外(FormatException)を返し、tryParseは例外の代わりにnullを返す
  • tryParseの引数にnullを渡すと、ArgumentError(Invalid argument)が発生するが、 FormatExceptionではないので、tryParsenullを返さない
  • 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');
}

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1