Вызов основной функции Java - PullRequest
3 голосов
/ 22 марта 2010

Я пытаюсь вызвать другую основную функцию JAR. Теперь эта основная функция заключена в блок try и catch.

Но когда основной вызов возвращает «NullPointerException», программа просто падает, а не перехватывает его

Так, например

try {
    somelibary.main()
}
catch (Exception e) {
    System.out.println("Exception Caught");
}

Этот код не перехватывает исключение NullPointerException из main (). Кто-нибудь знает причину у?

Ответы [ 4 ]

5 голосов
/ 22 марта 2010

Ваш код, как показано, обязательно перехватит исключение NullPointerException, выданное somelibrary.main().Если приложение все равно останавливается из-за исключения NullPointerException, есть большая вероятность, что некоторая библиотека в какой-то момент перехватит исключение, создаст дамп стека и вызовет system.exit ()

В этом случае вопрос не в том, как перехватитьNPE, но как предотвратить фактическое завершение System.exit ().

И ответ на этот вопрос, конечно же, можно найти в StackOverflow по адресу, прямо здесь .Просто установите SecurityManager перед вызовом someLibrary и затем сбросьте securityManager.

5 голосов
/ 22 марта 2010

Возможно, что другая основная функция выполняет свою собственную обработку ошибок, например,

public static void main(String[] args) {
    try {
        ....
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(0);
    }
}

Если это то, что делает другая основная функция, то вы не сможете отловить ее исключения.У вас есть код для этой основной функции?

0 голосов
/ 22 марта 2010

Возможно, вы могли бы выполнить метод main в другом процессе, используя Runtime.exec, а затем зафиксировать результат или ошибку из потока out / err.

0 голосов
/ 22 марта 2010

С кодом, который вы показываете, вы также поймаете исключение NullPointerException. Но выполнение будет продолжено после блока catch. Таким образом, выполнение somelibary.main () в этом случае останавливается. Если ваш main () не содержит больше кода, программа завершит работу после перехвата исключения. Это то, что, вероятно, происходит. Вы можете опубликовать полный код вашего основного, чтобы проверить это.

Добавление: Вы хотите знать, как продолжить выполнение программы. Но в этом случае somelibrary.main () останавливается с помощью исключения. Единственной опцией в главном классе будет цикл, который повторно выполняет somelibrary.main (). Другая возможность состоит в том, чтобы перехватить исключение на каком-то более высоком уровне (основной цикл ввода), где вы можете игнорировать проблему и продолжить выполнение кода. Поскольку вы говорите, что выполняете другой jar-main, я подозреваю, что вы не можете изменить код другого jar. Таким образом, вам остается только выполнить еще одно основное:

boolean ended = false;
while (!ended)
{
  try {
      somelibary.main()
      ended = true;
  }
  catch (Exception e) {
      System.out.println("Exception Caught");
  }
}

Этот код перезапускает другую основную часть при исключении, но завершается, если другая основная часть завершается нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...