【问题标题】:java.lang.NullPointerException and return codejava.lang.NullPointerException 和返回码
【发布时间】:2017-08-07 10:43:50
【问题描述】:

我正在从 bash 中运行一些 java 二进制文件,例如:

run_me.sh

$JAVA_HOME/bin/java -Djava.library.path=path1/libs/opencv/lib -jar path2/bin/application.jar
echo "Exit code: "$?

但是在应用程序内部我得到java.lang.NullPointerException,但是返回码是 0,但是我需要一些非零退出码才能从 bash 中了解应用程序失败。

处理此类情况的正确方法是什么?

更新:

这是“嵌套”try catch 块的示例,当我在inner_package_class 中抛出异常时,返回码为 0。那么从 inner_package_class.method1() 获取异常的正确方法是什么?

public static void main(String[] args) {

    try {
        inner_package_class.method1();
        System.out.printf("After inner method!\n");
    } catch (Throwable t) {
        System.exit(1); 
    }
}

public class inner_package_class {

    public static void method1() {

        System.out.printf("From inner method!\n");

        try
        {
            throw new Exception("Some exception 2.");
        } catch (Throwable t) {

        }

    }
}

更新 1: 这按预期工作(返回非零退出代码)。

public class inner_package_class {

    public static void method1() throws Exception {
        System.out.printf("From inner method!\n");

        throw new Exception("Some exception 2.");
    }
}

【问题讨论】:

  • 返回码取决于应用程序的功能,这里默认为return 0,我不知道你是否可以更改它。
  • 请编辑您的问题并包含该异常的堆栈跟踪。尤其是异常是否发生在主线程是相关的;如果没有,您将需要通知主线程(或调用 System.exit 的任何线程)失败。

标签: java linux bash opencv


【解决方案1】:

返回码由 System 的 exit 方法设置:顺便说一下,如果您想在异常情况下返回 -1,您可以执行以下操作:在您的 Main 类中,您必须捕获所有可抛出的 (所以你将处理所有可能的情况)。这是一个例子

public static void main(String[] args) {
try { YOUR CODE 
} catch(throwable t){
System.exit(-1);
}
System.exit(0);
}  

代码向您展示了如何在异常情况下返回 -1,在成功情况下返回 0。

【讨论】:

    【解决方案2】:

    您可以在 main 方法周围添加一个 try-catch-block 并使用

    System.exit(1)
    

    当你抓住一个 Throwable

    public static void main(String[] args) {
      try {
         ... // your original code
      } catch (Throwable t) {
         // log the exception 
        t.printStacktrace(); // or use your logging framework 
        System.exit(1); 
      }
    }
    

    【讨论】:

    • 是的,只要嵌套的catch块在失败的情况下向外部的catch块抛出异常。如果他们处理异常并继续程序,则外部 catch 块无法设置返回码。
    • 这不会有什么不同。如果主线程抛出 NullPointerException,Java 将已经返回一个非零退出代码。
    • 我已经用“嵌套”案例的例子更新了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2023-04-04
    • 1970-01-01
    • 2012-07-09
    • 2017-10-27
    相关资源
    最近更新 更多