10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DiverseAdvent Calendar 2020

Day 2

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

Last updated at Posted at 2020-12-01

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');
}

参考

10
1
2

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
  3. You can use dark theme
What you can do with signing up
10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?