2014-10-25 3 views
0

저는 Android 앱을 만들고 있습니다. 나는이 구조 스레드를 가지고 : 나는 이러한 예외 중 하나가 발생할 때스레드에서 예외를 처리하려면 어떻게해야합니까?

code... 
try 
    code... 
catch 
    printexception 
code... 
try 
    code... 
catch 
    printexception 
code.. 

, 나는 내 코드의 나머지 부분이 작동하지 않고 실행되어서는 안된다는 것을 알고있다. 예외가 발생하면 어떻게 스레드를 멈출 수 있습니까? 모든 코드를 내부에 넣은 "큰 시도"를 만들어야합니까? 나는 이런 식의 코드를 얼마 동안 작업 해 왔지만 이전에는 예외를 신경 쓰지 않았다. 이것을 달성하기위한 좋은, 깨끗한 방법은 무엇입니까?

+0

첫 번째 예외가 발생할 때 스레드를 죽이지 않는 이유는 무엇입니까? –

답변

0

일반적으로 코드를 작성하려고 할 때마다 코드를 시도한 다음 catch 아래에 결과를 가져와야합니다.

의 같은 : printStackTrace에 언급함으로써

try 
{ 
int x = 5/0; 
} 
catch(Exception e) 
{ 
e.printStackTrace(); 
} 

당신이 줄 번호를 얻을 수있는 예외의 어떤 설명입니다. 나는 나의 요점을 분명히하기를 희망한다.

+0

그리고 원한다면 그 시점에서 실을 멈출 수 있습니다. – Prakhar

0

게시 한 코드가 run() 메소드 내에있는 경우 예외가 발생할 때마다 간단히 반환하여 스레드를 완료하고 뒤 따르는 코드 실행을 피할 수 있습니다.

code... 
try { 
    code... 
} catch (Exception e) { 
    e.printStackTrace(); 
    return; 
} 
code... 

예외가 발생할 때마다 플래그를 설정하고 해당 플래그를 주기적으로 검사하여 스레드가 계속 실행되어야 하는지를 결정할 수도 있습니다.

bool isCanceled = false; 

void run() { 
    while (!isCanceled) { 
     doSomeWork(); 
    } 
} 

void doSomeWork() { 
    try { 
     code... 
    } catch (Exception e) { 
     e.printStackTrace(); 
     isCanceled = true; 
     return; 
    } 
} 

물론 위의 명령문에 의존하는 모든 명령문이 try 블록 내에 포함되도록 코드를 구성 할 수도 있습니다. 예외가 발생하면 제어 흐름이 catch 블록으로 전송되고 문제가되는 줄 다음에 오는 try 블록 내의 명령문은 실행되지 않습니다. 나는 이것이 내부의 모든 코드를 가진 "큰 시도"에 의한 것이라고 가정합니다.

code... 
try 
    code... 
    try   // this try won't be executed if the line above it throws an exception 
     code... 
    catch { 
     printexception 
     return 
    } 
    code.. 
catch { 
    printexception 
    return   // return early 
} 
code.... 
1

이 매우 간단,이 시도 :

public static void main(String[] args) { 
    Thread thread = new Thread(new RunnableTest()); 
    thread.start(); 
} 

static class RunnableTest implements Runnable { 

    @Override 
    public void run() { 
     int i; 
     try { 
      i = 1/0; 
     } catch (Throwable t) { 
      t.printStackTrace(); 
      return; 
     } 
     System.out.println(i); 
    } 

} 

를 스레드를 더 잘 제어하면 java.util.Concurreent 패키지에서 ExecutorsThreadPoolExecutors을 사용할 수 있습니다!

관련 문제