Android Force Close 에 나타 난 이상 원인 분석 및 해결 방법
forceclose 는 강제 종료 라 는 뜻 으로 현재 프로그램 이 충돌 하고 있 습 니 다.
NullPointExection(빈 포인터),IndexOutOfBoundsException(아래 표 시 는 경 계 를 넘 었 습 니 다),Android API 가 사용 하 는 순서 오류 로 인해(예 를 들 어 setContentView()이전에 findViewById()작업 을 했 습 니 다)등 일련의 캡 처 되 지 않 은 이상 이 발생 할 수 있 습 니 다.
어떻게
Force Close 창 팝 업 을 피 하 는 방법 은 Thread.UncaughtExceptionHandler 인터페이스의 uncaughtException 방법 코드 는 다음 과 같 습 니 다.
public class MainActivity extends Activity implements Thread.UncaughtExceptionHandler,
View.OnClickListener {
private List<String> mList = new ArrayList<String>();
private Button btn;
private int pid;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("tag", "--->>onCreate");
initView();
// handler
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
*
*/
private void initView() {
btn = (Button) findViewById(R.id.main_btn);
btn.setOnClickListener(this);
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", " forceclose, :" + "
" +
arg1.toString()+" Thread:"+arg0.getId());
// finish();// activity
android.os.Process.killProcess(android.os.Process.myPid());
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (arg0.getId()) {
case R.id.main_btn:
mList.get(1) ;//
break;
default:
break;
}
}
@Override
protected void onPause() {
super.onPause();
Log.i("tag", "--》onpause");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.i("tag", "--->onstop");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("tag", "-->ondestroy");
}
}
캡 처 되 지 않 은 이상 을 처리 할 수 있 는 스 레 드 를 원 하 는 스 레 드.setDefault UncaughtExceptionHandler(this);이 코드 는 모두 그 라인 에서 한 번 실행 해 야 한다uncaughtException 방법 에서 첫 번 째 매개 변 수 는 스 레 드 이 고 두 번 째 매개 변 수 는 이상 입 니 다.
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", " forceclose, :" + "
" +
arg1.toString()+" Thread:"+arg0.getId());
// finish();// activity
android.os.Process.killProcess(android.os.Process.myPid());
}
다음은 로그 로그 의 결 과 를 보십시오.08-0918:50:27.87410739-10739/example.com.force_anrI/tag:--->>onCreate
08-0918:50:31.66410739-10739/example.com.force_anrI/tag:forceclose 를 캡 처 했 습 니 다.이상 원인 은:
java.lang.IndexOutOfBoundsException:Invalidindex1,sizeis0Thread:1
이상 을 성공 적 으로 포착 하 였 으 며,activity 도 종료 하 였 습 니 다.그러나 안전하게 종료 하 는 것 은 아 닙 니 다.다시 클릭 하여 apk 를 열 었 을 때 프로그램 이 응답 하지 않 는 것 을 발 견 했 기 때 문 입 니 다.
상술 한 문 제 를 해결 하기 위해 서,나 는 uncaughtException 방법 에서 프로 세 스 를 죽 이 고,프로 세 스 를 죽 이 는 데 여러 가지 방법 이 있 는데,여기 서 자살 식 방법 을 열거 합 니 다.
다음 과 같이 수정:
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", " forceclose, :" + "
" +
arg1.toString());
android.os.Process.killProcess(android.os.Process.myPid()); //
}
다른 절 차 는 변 하지 않 았 다.3.우 리 는 메 인 스 레 드 에서 이렇게 할 수 있 을 뿐만 아니 라 서브 스 레 드 에서 도 진행 할 수 있 습 니 다.
그리고 activity 의 수명 주기 에 하위 스 레 드 를 열 어 이상 이 발생 하지 않도록 감청 합 니 다.
class MyRunnable extends Thread implements Thread.UncaughtExceptionHandler {
@Override
public void run() {
// TODO Auto-generated method stub
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "childThread: forceclose, :" + "
" +
arg1.toString()+" Thread->"+arg0.getId()+" id->"+Thread.currentThread().getId()+" "+
Thread.currentThread().getName());
android.os.Process.killProcess(android.os.Process.myPid());
}
}
여기 문제 가 있 습 니 다.우 리 는 분명히 하위 스 레 드 에서 이상 을 잡 았 습 니 다.그런데 어떻게 Thread 의 id->1 개의 스 레 드 id->1,왜 스 레 드 가 메 인 스 레 드 입 니까?아래 에서 이 문 제 를 토론 하 다.
08-09 19:02:47.734 14483-14483/example.com.force_anr I/tag: --->>onCreate
08-09 19:02:51.304 14483-14483/example.com.force_anr I/tag: childThread: forceclose, :
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 Thread->1 id->1 main
4.세 번 째 문제 해결우 리 는 하위 스 레 드 를 다시 씁 니 다:하위 스 레 드 에 이상 을 설정 하 는 동시에 activity 에서 이상 한 코드 를 캡 처 하고 이상 한 코드 를 삭제 하 는 것 을 잊 지 마 세 요.
class MyRunnable extends Thread implements Thread.UncaughtExceptionHandler {
int a[];
@Override
public void run() {
// TODO Auto-generated method stub
Thread.setDefaultUncaughtExceptionHandler(this);
int i = a[0];//
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "childThread: forceclose, :" + "
" +
arg1.toString()+" Thread->"+arg0.getId()+" id->"+Thread.currentThread().getId()+" "+
Thread.currentThread().getName());
android.os.Process.killProcess(android.os.Process.myPid());
}
}
시작 프로그램 에서 아래 로그 보기:
08-09 19:08:20.124 16308-16308/example.com.force_anr I/tag: --->>onCreate
08-09 19:08:20.124 16308-16341/example.com.force_anr I/tag: childThread: forceclose, :
java.lang.NullPointerException: Attempt to read from null array Thread->44829 id->44829 Thread-44829
08-09 19:08:20.254 16349-16349/example.com.force_anr I/tag: --->>onCreate
08-09 19:08:20.354 16376-16376/example.com.force_anr I/tag: --->>onCreate
08-09 19:08:20.354 16376-16411/example.com.force_anr I/tag: childThread: forceclose, :
java.lang.NullPointerException: Attempt to read from null array Thread->44839 id->44839 Thread-44839
두 번 이나 시 도 를 한 것 같 습 니 다.Thread 가 변 했 습 니 다.그래서 이 방법 은 uncaughtException(Thread arg 0,Throwable arg 1)의 arg 0 은 이상 이 발생 한 Thread 를 말 합 니 다.uncaughtException 이 등 록 된 Thread 가 아 닙 니 다.위 에서 말 한 것 은 편집장 님 께 서 안 드 로 이 드 포 스 클 로즈 에 나타 난 이상 원인 분석 과 해결 방법 입 니 다.여러분 께 도움 이 되 셨 으 면 합 니 다.궁금 한 점 이 있 으 시 면 댓 글로 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.