Вызов основной функции Java

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

Но когда главный вызов возвращает "NullPointerException", программа просто сработает, а не ловит ее.

Итак, например

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

Этот код dosent catch NullPointerException из main(). Кто-нибудь знает причину y?

4 ответа

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

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

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


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

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

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


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


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

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

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

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

licensed under cc by-sa 3.0 with attribution.