【Console Application】ファイルとデータベース 306【学習記】
今回の概略
原本を確認したら addRecord でうまいこと self.record が null でも動くように作られていた😑
それを他の List から配列への変換と勘違いして捨ててしまってその先の merge でぬるぽってた😞
前回の粗筋
addRecords で self.record が空のままなんだけど…🙄
デバグ
さて…なんで self.record に何も入ってないのん…?
addRecord 見る限りではちゃんと処理は書かれてるお😑
(ちゃんと動作するとは言ってない)
_init を見ると record を初期化してる場所が見当たらない…😑
原本を見ると同じ様に _init には特に書いて無くてフィールド宣言のところでは null を入れて終わりになってて、検索で探して new で器を作っているのが loadTable のこの箇所のみ…😑
勿論 OC 側でも loadTable で new が掛かってるから原本でも探せば -u で addRecords 呼ぶ前とかにどこかで record へ器を作っている筈なんだけど…😑
………これ以上はあれこれ考えるより動かした方が良いか🤤
……… stack には積まれるけど addRecord では self.record が nil のままで素通りしてるお…😑
どこにも self.record を初期化する処理が無い…🙄
原本の main の -u を追いかけても dba.addRecords 呼ぶまで特に new されてる形跡が無いお…🤔
_人人人人人人人人人_
> なぜ動いてるの <
 ̄Y^Y^Y^Y^Y^Y^ ̄
いいや、原本は Java なんだから動作させた時にぬるぽって絶対どこかで器確保を書き足してる筈😑
(なお OC は nil にメッセージ送っても無視されて処理が続行)
うわー…原本、めっちゃ小細工してあった🙄
record が List<Record> 「ではなく」 Record[] なので List で項目追加して Record[] へ変換して self.record の新たな値として入れ替えてる🙄
で、 OC では他でも配列のフィールドに追加する場合に一旦 List にして増やして配列に変換して差し戻す、ってやってるんだけどここも同じだと思って単純な addObject にしちゃってて…って事みたい😑
原本のここの紛らわしい点は self.record が null のままでも追加される書き方をしてるってとこ🙄
こんなん見落とすわ😞
まぁ、要するに「プロパティは init で全て初期化しましょう」という有り難い教訓😞
こういう事が起きるので口酸っぱくどの言語でもメンバーなりプロパティを初期化せよって警告やエラーを出すわけ🙄
原本作った時に未初期化の null を想定したまま作ったのが良くなかった😞
ぶほ😫
そうだったわ、 CSV から record にするの失敗して値がおかしくなってるの忘れてた🤪
件数合ってて record のデータが充填されてるから一先ず進めたんだっけ…😞
次回は
てことで csv の情報を正しく record にできない問題を解決するぽ🙄
今回は merge での障害を治したからヨシって事で🤤