1. masashi-sutou

    Posted

    masashi-sutou
Changes in title
+DartのtryPaseの引数にnullを渡すとnullが返らないので注意しよう
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,58 @@
+# 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
+:-: | :-:
+<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37385/a30dd4e4-0d11-807c-6dac-35098c56f98a.png width=580/> | <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37385/4aa10476-c9ec-f1c1-8c0f-12a904dc2628.png width=580/>
+
+# コメントに注意書きはあるけど...
+
+- `int.tryParse`のコメントには注意書きがあるけど、`DateTime.tryParse`には注意書きがなく、`DateTime.parse`の方にしかなかったりする
+- 一度誤って`null`を渡して痛い目をみないと気づかない可能性が高い
+
+`int.tryParse` コメント有り | `DateTime.tryParse` コメント無し
+:-: | :-:
+<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37385/965d288e-af15-06c6-13f9-5f42e2daebd8.png width=580/> | <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37385/3826914a-c847-207e-fb75-5826b565936f.png width=580/>
+
+# どうする?
+
+- null safetyは来年の春ごろらしいので今から有効にするのは時期早々でいろいろと対応が大変です
+- とりあえず、下記のような応急処置になりそう
+
+```dart:空文字にする
+final result = int.tryParse(v ?? '');
+```
+
+```dart:特定の型で制御する
+try {
+ final result = int.parse(null);
+ print(result);
+} on ArgumentError catch (e, s) {
+ print('✅ $e $s');
+} on FormatException catch (e, s) {
+ print('✅ $e $s');
+}
+```
+
+```dart:全部キャッチする
+try {
+ final result = int.parse(null);
+ print(result);
+} catch (e, s) {
+ print('✅ $e $s');
+}
+```
+
+
+# 参考
+
+- https://api.dart.dev/stable/2.10.2/dart-core/int-class.html#static-methods
+