2014-10-25 2 views
0

Я работаю над Android-приложением. У меня есть нить с этой структурой:Как обрабатывать исключения в потоке?

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

Когда я сталкиваюсь с одним из этих исключений, я знаю, что остальная часть моего кода не будет работать и не должны быть выполнены. Как я могу остановить поток, когда сталкиваюсь с исключением? Должен ли я создать «большую попытку» со всем кодом внутри? Некоторое время я работал над кодом, подобным этому, но мне никогда не приходилось заботиться об исключениях раньше. Какой хороший, чистый способ достичь этого?

+0

Почему бы просто не убить нить при первом исключении? –

ответ

0

Как правило, всякий раз, когда вы пытаетесь закодировать, вы должны держать их в попытке, а затем под catch получить результат.

его, как:

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

Упоминая 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); 
    } 

} 

для лучшего контроля над потоками вы можете использовать Executors и ThreadPoolExecutors из java.util.Concurreent пакета!

Смежные вопросы