文系出身システム屋の技術日記

自分がつまづいたテクニカルなこと、役に立ったことをまとめます。

自作アプリのデバッグの過程を徒然なるままに書く② (ループ文の恐怖)【解決編】

こんばんは。

明日も仕事ですが、絶賛デバッグ中のにぎりめしです。

先ほど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のページにて、仕様を確認する

Random (Java Platform SE 6)

乱数ジェネレータのシーケンスを使って、0 から指定された値の範囲 (0 は含むが、その指定された値は含まない) で一様分布の int 型の擬似乱数を返します。

0 から指定された値の範囲 (0 は含むが、その指定された値は含まない)

完全に勘違いしていました。わざわざ-1する必要なかったのですね。

こんな簡単な仕様の認識違いを起こしてしまうなんて…

など、いろいろと反省することは出てきましたが、とりあえず前に進むことができました。

今日は心穏やかに眠ることができそうです。。。



ではではー。