‫お帰りなさい｡
‫このビデオでは､ 私たちが作成したバーチャルプログラムでの問題を最終的に解決します｡
‫そして､ 守備範囲の広いプログラミングも視野に入れています｡
‫つまり､ 防御的プログラミングの考え方は､ どんな問題が起こりうるかを本当にすでに考えて安全なコードを作ることです｡
‫この場合､ 起こりうる問題とは､ 例えば､ リストが空であるとか､ 友達が多すぎるから､
‫今いる友達よりも多く招待したいとかいうことです｡
‫そして今回は､ 手動で作成した超シンプルなリストです｡
‫しかし､ データベースからだと想像してください｡
‫つまり､ データベースから来るか､ ウェブから来るか､ クラウドデータベースから来るか､ そんなところでしょうか｡
‫そうすると､ この場合のリストの大きさがわからなくなるので､ 超違った話になってしまうんです｡
‫コードを見ればわかるのですが､ どこから出てくるかによってわからないことがあります｡
‫この場合､ 起こりうるさまざまな問題を想定し､ 開発時に自分たちでテストしておく必要があります｡
‫例えば､ もうやったよね？
‫リストにある友達をさらに入力しました｡
‫だから､ シンプルでいいんです｡
‫これを実行すると､ 範囲外の引数という例外が発生します｡
‫しかし､ それをどこで得ているのかが興味深いところです｡
‫つまり､ 問題は別のところにあるのに､ 私たちはget party differentのメソッドの時点で取得しているのです｡
‫だって､ 見てみると､ 最短ネームリスト・ゼロって書いてあるんだもん｡
‫つまり､ リスト､ ゲットパーティフレンドを過ぎているため､ 利用できないリスト要素にアクセスしようとしているわけです｡ そして､
‫このリストをこちらに渡しているのです｡
‫このリストをどこから入手したかを調べてみると､ 利用できないものにアクセスしようとしていることがわかるので､
‫良い出発点になるのではないでしょうか｡
‫では､ 利用できるようになったことで何が問題なのか｡
‫そこで､ この行を見て､ パーティーの友を得ることができます｡
‫というところですね｡
‫そして､ 私たちは見ることができます｡
‫よし､ これでバッファーだ｡
‫そうだろ？
‫そこで､ バッファを取得するのですが､ このリストがここにあります｡
‫つまり､ 取得するのはトップレベルからのリストということになります｡
‫このように､ 多くの人々のリストがあり､ そこから価値を得ることができるのです｡
‫リストが正しいかどうかを確認するには､ Get Party Friendsメソッドで確認するのがよいでしょう｡
‫この時点ではリストがあるので､ このリストを確認すればいいわけです｡
‫このリストが､ 私たちのやりたいことに十分かどうかを確認することができるのです｡
‫そして､ やりたいことは､ そのリストの要素のアカウントに基づいて､ カウントがリストドットカウントより大きいかどうかをチェックするために何かを書くことです｡
‫そして､ これが渡されたリストです｡
‫もしそうなら､ 私たちができることは､ それをしないでくださいとか､ エラーとか､ そういうことを表示することです｡
‫でも､ もっといいのは､ プログラムをクラッシュさせることができることです｡
‫なぜなら､ データベースに接続しているのに､ さまざまなエラーを発生させたり､ コードを読み進めているうちに､
‫このメソッドget party friendが実行され､ データベースに接続され､
‫データベースに何かを書き込んだとしたら､ またコードを実行することになるからです｡
‫そして､ なぜかデータベースの状態が変わってしまい､ 今は表示されるデータが全く無意味で､
‫作業ができないので頭を抱えています｡
‫だから､ そのバグを修正するのは本末転倒なんです｡
‫わかりました｡
‫そこで､ すでにできるだけ早い段階でそれをキャッチすることができるので､ ここでは単純に範囲外の引数例外を投げることができるのです｡
‫そのため､ 範囲外の新しい引数を例外として投げるのです｡
‫また､ 例外の引数は､ 複数のオーバーロードを持ちます｡
‫だから､ ここにあるのはパラメータ名でいいんです｡
‫例外をメッセージで表示させたり､ パラメータ名をメッセージで表示させたりすることができるのです｡
‫だから､ ここでは､ OK､ countが問題で､ countはリストの要素より大きくはできないとか､
‫そういうことを言えばいいんです｡
‫つまり､ これが表示内容の一例となるわけです｡
‫このエラーが発生したら､ 実際にこのエラーをキャッチするか､ 少なくとも範囲外の引数例外を投げることができるはずだからです｡
‫わかりました｡
‫そこで､ 処理された例外を見ると､ system argument out of range exception cannot be greater than
‫elements in list parameter count と表示されています｡
‫ここに書いてあることが結果的にそうなっているわけです｡
‫つまり､ このような例外が発生するのです｡
‫これで問題の所在がわかったわけです｡
‫少し表情が豊かになりました｡
‫直前まで､ 実は問題はここになかったのです｡
‫そこで､ その2行をコメントアウトさせていただきます｡
‫問題はこの時点では投げられなかったが､ さらにその下に投げられた｡
‫get differentメソッドで投げていました｡
‫だから42行目にあるんです｡
‫しかし､ 実際の問題はもっと前に発生していたのです｡
‫そうですね｡
‫そして､ インデックスは範囲外の例外でした｡
‫それも､ ごく一般的な発言ですよね｡
‫何でもいいんです｡
‫そうですね｡
‫だから､ 早めにキャッチすることで､ どこに問題があるのかが見えてくるのです｡
‫もちろん､ この値を入力したら､ この値はユーザーが入力したものである､
‫と言うこともできますね｡
‫だから､ ゼロからリスト要素の量まで､ どんな値でも入力できる｡
‫だから､ もっと早くからキャッチすることができたのです｡
‫ここでもテストができる｡
‫だから､ もし｡
‫友達です｡
‫ドットカウントは
‫ここに入力した値よりも小さい値で､ この値をユーザーから再び取得することができます｡
‫そうすれば､ メッセージを伝えることができるだろう？
‫私たちは例外を投げない
‫私たちは､ プログラムをクラッシュさせるようなことはしません｡
‫ユーザーに新しい値を入力してもらうだけです｡
‫しかし､ 私たちプログラマーはここに値を入力することができるので､ ここではそれを行わず､ 今､ 手動でこれらのエラーを強制的に発生させています｡
‫そうですね｡
‫だから､ それが一つの解決策というか､ 実は一つの早期発見の方法なんです｡
‫さて､ こう言いましょう｡
‫ここではマイナス1など､ くだらない値を入力する｡
‫よし､ ではもう一度実行してみよう｡
‫実際に､ もう一度実行してみましょう｡
‫そして､ 私たちのプログラムは動作しているようですが､ そこには何も表示されません｡
‫だから､ 何も表示されなかったんです｡
‫Errorsはエラーを投げなかったが､ フレンドは表示されない｡
‫このプログラムでは､ リストからマイナス1個のリスト要素を取得しようとするため､ マイナス1個で動作するように見えますが､
‫価値のある情報を得ることはできません｡
‫そこで､ もちろん､ ここに別の条件を追加することができます｡
‫カウントは0より大きくなければならない｡
‫そうでない場合は､ called cannot be greater than the elements in the list
‫or lower zeroのように書けばよいのです｡
‫というのは､ あくまで一つの表現方法なんですね｡
‫そして今､ もう一度実行すると､ このようなエラーが投げられます｡
‫このように､ 以前はプログラムが矢を放つことはなかったのですが､ 開発者としては､ 「この状態は望ましくない」ということを理解することができました｡
‫これでは仕事にならない｡
‫そして､ 先ほど言ったように､ うまく切って､ この価値をどこからか得て､ その前からキャッチするようにするのです｡
‫さて､ もっと面白い状況があるとしよう｡
‫だから､ 友達のリストが空っぽという状況になっているんです｡
‫そこで､ ここに空のリストを作成することにします｡
‫このように､ コメントアウトされ､ 空のリストができます｡
‫もう一度実行して､ 私たちのプログラムがまだ動くかどうか見てみましょう｡
‫そして今､ 私たちはまだ範囲外の引数の例外を取得しています｡
‫だから､ とてもクールなんです｡
‫つまり､ ここで作成した例外はこの問題さえも解決してくれるので､ リストが空でも手動で調べる必要はないわけですね｡
‫だから､ 友達リストを見ると､ 友達リストは空なのに､ 結局はカウントがゼロになる｡
‫つまり､ リストがNULLであっても､ リストは0である｡
‫だから､ そこで得られる値はやはりゼロなのです｡
‫しかし､ それだけでなく､ 実際にnulを強制することができるのです｡
‫つまり､ 空のリストであるFranceを渡す代わりに､ ここではNULLを渡すことができるのです｡
‫何らかの理由でデータベース接続がうまくいかず､ このリストを作成できなかったとします｡
‫その結果､ nullが得られたので､ 今度はnullを渡して､ 実際にリストを必要とするメソッドにnullを渡そうとします｡
‫では､ 実行してみて､ 今度はどんなエラーが出るか見てみましょう｡
‫そこで今度は､ オブジェクトリストのインスタンスに設定されていないヌル参照例外オブジェクト参照がヌルであったということになります｡
‫だから､ 今､ 合格したリストは今だったんです｡
‫そのため､ エラーを投げる前にこのようなエラーが発生します｡
‫では､ 私たちに何ができるかというと､ もちろんこの状況もキャッチできるわけです｡
‫そこで､ もう1つif文を書いてみましょう｡
‫listがNULLの場合､ NULLポインタを投げる｡
‫Exception throw new argument.
‫NULL例外｡
‫だからリストアップ｡
‫リストは空です｡
‫わかりました｡
‫もちろん､ ここでは､ リストは空であってはならないの代わりに､ もっと説明的であってもよい｡
‫インターネットの接続状態などをご確認ください｡
‫それはインターネット接続であったり､ データを取得する場所であったりします｡
‫では､ もう一度実行してみましょう｡
‫そして､ 今､ 私たちの引数今すぐ例外をスローする必要があります｡
‫ご覧の通り､ 空のパラメータリストです｡
‫完璧です｡
‫わかりました｡
‫さて､ なぜこのようなことをするのかと思われるかもしれません｡
‫プログラムが常にクラッシュするのは困ります｡
‫これは､ プログラムが実際にデータベースの何かを変更するような状態にならないようにするためです｡
‫私たちの小さなプログラムでは､ データベースには何の変更も加えていないのです｡
‫でも､ その時のことを想像してみてください｡
‫状況が大きく異なるので､ ここで深刻な問題を作り出すことも可能です｡
‫さて､ 最後にもうひとつお見せしたいのは､ これだけのものを揃える前は､ そうでしたよね？
‫だから､ このif文とこれとあれとか､ この友達リストができる前までは｡
‫ええ､ 実際に止められるんですよ｡
‫ええと､ 以前はここにこの友達がいて､ 向こうにも友達がいて､ パーティでは10人の友達を集めようとしたんだけど､
‫7人しか集まらなかったんだ｡
‫この状況で､ これを実行すると､ 私たちが経験したこのエラーを強制的に解決することができます｡
‫そこで､ この引数out of range exception index was out of rangeを取得します｡
‫つまり､ 修正する前の問題ですね｡
‫そうですね｡
‫しかし､ 今､ 私たちが見ることができる興味深いものは､ コールスタックです｡
‫そこで､ コールスタックと呼ばれるものがあります｡
‫そして､ ここで少し大きくしてみます｡
‫実は､ それらをすべて閉鎖させてください｡
‫では次に､ このコールスタックを見てみましょう｡
‫このコールスタックによると､ 現在46行目にいるようです｡
‫わかりました｡
‫そこで､ 私たちは
‫そこで､ ゲットパーティ・フレンド方式で｡
‫さて､ もう一歩踏み込んでみると､ ここでパーティフレンドメソッドが呼び出されたことが分かります｡
‫今､ 私たちはget party friends pluralメソッドの中にいます｡
‫また､ このメソッドがどこで呼び出されたかを知りたい場合はどうすればよいでしょうか｡
‫まあ､ 13行目で呼ばれたんですけどね｡
‫そこで､ コールスタックを使えば､ どこから呼ばれたか､ どこからまた呼ばれたか､ などがわかるのです｡
‫だから､ 最初のメソッドが呼ばれたときのレベルまで､ ずっと上がっていくことができるんです｡
‫そして､ 最初のメソッドは､ get party friendsと呼ばれるものでした｡
‫それからこのワイルドループに入り､ get party friendが呼び出され､
‫このメソッドに入り､ 最後に空のリストに基づいて変数が作成されます｡
‫さて､ これでデバッグの入門編を少しは理解していただけたでしょうか？
‫もちろん､ 他にもたくさんありますが､ 中には便利なものもありますが､
‫日常生活では必要ないものも多いでしょうから､ 詳細は割愛させていただきます｡
‫というのも､ 一般的には､ もちろん､ デバッグに進んで､ ここで得られるさまざまなウィンドウをチェックして､
‫実行中のスレッドや並列プロセスなどを見ることができます｡
‫しかし､ 今見ていただいたものが､ ソフトウェアのデバッグに必要な主なもの､
‫あるいは主なツールになるのではないかと思います｡
‫わかりました｡
‫というわけで､ 楽しんでいただけたでしょうか､ 今後の番組に活かしていただければと思います｡
‫そして､ これでようやくデバッグが解決したことがお分かりいただけると思います｡
‫ちなみに､ デバッグのセクションが足りないというご意見をいただいたので､ このような小さなセクションを作ることにしたんです｡
‫それでは､ ご感想をどうもありがとうございました｡
‫もし､ このコースに足りないものや､
‫とても悪いと思うものがあれば､ 直接悪い評価をつけないでください｡
‫それでは､ どうもありがとうございました！次のビデオでお会いできるのを楽しみにしています｡