自作アプリのデバッグの過程を徒然なるままに書く② (ループ文の恐怖)【解決編】
こんばんは。
明日も仕事ですが、絶賛デバッグ中のにぎりめしです。
先ほどANRが発生するバグについてソースコードを貼り付けて記事にしましたが、無事に解決しました。
過去記事:
nari104.hatenablog.jp
結論からいうと、RandomクラスのnextInt(int range)の仕様の理解が間違っていました。
解決に至った手順は以下の通りです。
- ログ出力により、ANRが発生した時点でのpassword文字列の内容とpasswordBaseを比較する
- passwordBaseの一番最後の文字がどんなにループしても出力されず、結果として無限ループになっていた
- そうなれば、怪しいのはwhileの条件式で使用しているcharAt(index)だろうと当たりをつける
while (index == prevIndex || password.indexOf(passwordKey.charAt(index)) != -1) {
- そしてそのindexの値を生成しているのは以下の処理である
index = rand.nextInt(passKeyLength - 1);
- ということで以下のoracleのページにて、仕様を確認する
乱数ジェネレータのシーケンスを使って、0 から指定された値の範囲 (0 は含むが、その指定された値は含まない) で一様分布の int 型の擬似乱数を返します。
0 から指定された値の範囲 (0 は含むが、その指定された値は含まない)
完全に勘違いしていました。わざわざ-1する必要なかったのですね。
こんな簡単な仕様の認識違いを起こしてしまうなんて…
など、いろいろと反省することは出てきましたが、とりあえず前に進むことができました。
今日は心穏やかに眠ることができそうです。。。
ではではー。