Завершить работу Java-программы, если утверждение не удалось - PullRequest
4 голосов
/ 09 августа 2010

Я занимаюсь разработкой многопоточной Java-программы, использую различные утверждения во всем коде и запускаю мою программу, используя флаг ea.

Могу ли я сделать так, чтобы моя программа немедленно останавливалась и выходила при сбое любого утверждения?

Ответы [ 3 ]

5 голосов
/ 09 августа 2010
try {
    code that may generate AssertionError
} catch (AssertionError e) {
       System.exit(0);//logging or any action
}  

также включает подтверждение.
, но об этом нужно позаботиться.

4 голосов
/ 09 августа 2010

Assert остановит любой поток, выдавший утверждение, при условии, что ошибка AssertionError не перехвачена. Хотя я думаю, что убийства этого потока будет достаточно, и вы не захотите убивать всю программу. В любом случае, чтобы фактически убить всю программу, просто оберните ваши запускаемые файлы

try { 
} catch (AssertionError e) { 
   System.exit(1);
} 

, которая убьет программу при поднятии утверждения.

Таким образом, вы можете сделать «CrashOnAssertionError» работоспособным, чтобы обернуть все ваши запускаемые объекты:

public class CrashOnAssertionError implements Runnable {
  private final Runnable mActualRunnable;
  public CrashOnAssertionError(Runnable pActualRunnable) {
    mActualRunnable = pActualRunnable;
  }
  public void run() {
    try {
      mActualRunnable.run();
    }  catch (AssertionError) {
       System.exit(1);
    }
  }
}

И тогда вы можете сделать что-то вроде:

Runnable r = new CrashOnAssertionError(
  new Runnable() { 
    public void run() {
     // do stuff 
    }
 });
new Thread(r).start();
1 голос
/ 09 августа 2010

Когда утверждения включены, они выдают java.lang.AssertionError при неудаче. До тех пор, пока вы не попытаетесь это перехватить, поток, генерирующий исключение, будет остановлен при сбое подтверждения.

Если вам нужно какое-либо другое поведение, вы можете catch (AssertionError) и делать все, что вы хотите внутри оператора catch. Например, позвоните System.exit(1).

Если вы хотите, чтобы AssertionError включал сообщение об ошибке, вам нужно использовать форму assert Expression1 : Expression2; assert. Для получения дополнительной информации читайте это .

...