0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

例外の際、waiting for debuggerが再表示されLogcat例外が見れない問題がある

Last updated at Posted at 2020-06-08

・問題の解決には至っていませんが、原因までは突き止められたので、もしよかったらご参照頂ければと思います。
・アプリ開発の実績があまり無い人間が書いているので間違っている内容かもしれないという事は十分考慮の上ご参照下さい

Android studioで例外が出た際、waiting for debuggerが出てしまって、その時例外を見ようと思ってもLogcatが消えてしまって見れないという問題がありました。

このwaiting for debuggerですがデバッグを開始する時に毎回でます。

出る時でない時があるので、少しどのような条件で出るか試してみたところ下記の様な条件で出ました。
例外は

  int[] i = null;
  for(int a:i){
  }

とnullのint配列に拡張forでアクセスしRuntimeExceptionを発生させました。

Logcatが見える時と見えない時がある為、どのような条件の時見えて、どのような条件の時見えないのか試したところ、下記の様な条件でした。
前提
1.Activityを3つ作成(Activity1、Activity2、Activity3とする)
2.Activity1,Activity2にボタンを作り、ボタンを押すと画面遷移するようにする(Activity1→Activity2→Activity3)。

見える時:Activity1,Activity2で例外発生。
見えない時:Activity3で例外発生。
具体的なソースを示します(waiting for debuggerが出てきてLogcatが見えないパターン)。

Activity1

public class Activity1 extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ConstraintLayout constraintLayout =findViewById(R.id.baseLayout);

        Button button = new Button(this);
        button.setText("2ndへ");
        button.setOnClickListener((v)->{
            Intent intent = new Intent(this,Activity2.class);
            startActivity(intent);
        });
        constraintLayout.addView(button);
    }
}

Activity2

public class Activity2 extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ConstraintLayout constraintLayout =findViewById(R.id.baseLayout);

        Button button = new Button(this);
        button.setText("3ndへ");
        button.setOnClickListener((v)->{
            Intent intent = new Intent(this,Activity3.class);
            startActivity(intent);
        });
        constraintLayout.addView(button);
    }
}

Activitiy3

public class Activity3 extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        int[] i = null;
        for(int a:i){//ここで例外を発生させている
        }
    }
}

この例外個所をActivity1,Activity2に持ってくると、waiting for debuggerが出てこずLogcatが見えるようになります。(冗長になる為そのソースは割愛)

そして、waiting for debuggerが出るという事は例外で落ちた後、アプリがまた立ち上がっているという事に築きました。

waiting for debuggerばかりに目が行ってましたが、よくみてみるとActivity3で例外が発生した際は、落ちてまたActivity1の画面が立ち上がっていました。

その為、「このアプリが再起動する事に問題がある」というところに辿り着き、「android 例外 再起動してしまう」等で検索したところ、テラテイルのこちらの質問に辿り着き、

1.例外が発生すると一旦Processが消滅しアプリが終了するが、Taskは生き残る。
2.例外が発生したActivityはTaskから消え、残りのActivityがTaskの記録順にしたがって開かれる

という書き込みにより、これに関連しているんじゃないかと思いました。
そしてActivity1で例外が発生すると「ActivityはTaskから消える」のでActivityがなくアプリが落ちるのはわかるのですが、Activity2に例外を置いても落ちるのはどういうこっちゃと思いました。

そしてさらにぐぐったところ、例外が発生した場合、呼び出し元のActivityも破棄させるという事がわかり、全て今回陥っている状況に合点がいきました。

まとめると
Activity(Activity4)をもう一つ追加して説明しますが
Activity1で例外発生→アプリ終了
Activity2で例外発生→アプリ終了(呼び出し元と呼び出し先が破棄される)
Activity3で例外発生→Activity1へ(呼び出し元と呼び出し先が破棄される)
Activity4で例外発生→Activity2へ(呼び出し元と呼び出し先が破棄される)

そして原因はわかったのですが、それをどう対処するかというところでもうダウンm(_ _)m したので、備忘録としてまとめておきます。

機会があったら、アプリ再起動せずにLogcatがしっかり見れる事まで対処するかもです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?