Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用Java主函数_Java_Exception - Fatal编程技术网

调用Java主函数

调用Java主函数,java,exception,Java,Exception,我试图调用另一个JAR的主函数。现在,这个主要函数被封装在一个try-and-catch块下面 但是当主调用返回“NullPointerException”时,程序只是崩溃而不是捕获它 比如说 try { somelibary.main() } catch (Exception e) { System.out.println("Exception Caught"); } 此代码从main()捕获NullPointerException。 有人知道原因吗?另一个主函数可能正在执行

我试图调用另一个JAR的主函数。现在,这个主要函数被封装在一个try-and-catch块下面

但是当主调用返回“NullPointerException”时,程序只是崩溃而不是捕获它

比如说

try {
    somelibary.main()
}
catch (Exception e) {
    System.out.println("Exception Caught");
}
此代码从main()捕获NullPointerException。
有人知道原因吗?

另一个主函数可能正在执行自己的错误处理

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

如果另一个主函数就是这样做的,那么您将无法捕获它的异常。您有此主函数的代码吗?

通过显示的代码,您还将捕获NullPointerException。但是执行将在catch块之后继续。因此,在本例中,somelibary.main()的执行将停止。如果main()不包含更多代码,则程序将在捕获异常后结束。这就是可能发生的事情。您可以发布main的完整代码,以验证这一点

添加:您想知道如何继续执行程序。但是在本例中,somelibrary.main()会通过抛出异常而停止。main类中唯一的选项是一个循环,它重新执行somelibrary.main()。另一种可能是在某个更高级别(主输入循环)捕获异常,您可以忽略问题并继续执行代码。正如您所说,您执行另一个jars main,我怀疑您无法更改另一个jar的代码。因此,您只剩下重新执行另一个主:

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

此代码会在异常时重新启动另一个main,但如果另一个main正常结束则会结束。

如图所示,您的代码肯定会捕获由
somelibrary.main()引发的NullPointerException。如果应用程序因NullPointerException而停止,则很有可能某个库在某个点捕获异常,转储堆栈跟踪并调用system.exit()

在这种情况下,问题不是如何捕获NPE,而是如何防止System.exit()实际退出


当然,这个问题的答案可以在StackOverflow上找到。只需在调用someLibrary之前安装SecurityManager,然后重置SecurityManager。

也许您可以使用
Runtime.exec在另一个进程中执行main方法,然后从out/err stream中捕获结果或错误。

这个问题不是完全由您回答了吗?您捕获的java.lang.Exception的完整包是否与导入中看到的一样?你肯定是在那条线上抛出了NPE吗?也许粘贴你的stacktrace。问题的标题不准确。不,我用的是一个罐子。是否有任何解决方法可以捕获main()引发的异常?@Sunny main没有引发异常,否则您会捕获它。正如威尔所说,可以捕获异常并调用退出,但这是不同的。