2017-03-16 3 views
0

を返す:java.lang.NullPointerExceptionが、私は次のように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を取得し、howewerの戻りコードは0ですが、アプリケーションが失敗したことをbashから理解するには、ゼロ以外の終了コードが必要です。

このようなケースを処理する適切な方法は何ですか?

アップデート:私はinner_package_classリターンコードで例外をスローしたときにここで

は、catchブロックを試してみてください「ネストされた」のexxampleですが)(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."); 
    } 
} 
+0

戻りコードはアプリケーションの機能によって異なりますが、デフォルトはここでは「return 0」です。変更できるかどうかわかりません。 – SomeJavaGuy

+0

質問を編集し、その例外のスタックトレースを含めてください。特に、メインスレッドで例外が発生するかどうかは関係ありません。そうでない場合は、メインスレッド(またはスレッドがSystem.exitを呼び出す)に障害を通知する必要があります。 – VGR

答えて

0

あなたが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); 
    } 
} 
+0

ネストされたtry-catchブロックで動作しますか? – mrgloom

+0

はい、ネストされたキャッチブロックが、障害発生時に外側のキャッチブロックに例外をスローする限りです。 **例外**を処理してプログラムを続行すると、外側のcatchブロックは戻りコードを設定できません。 – Harald

+0

これは違いはありません。メインスレッドがNullPointerExceptionをスローしていた場合、Javaはすでに0以外の終了コードを返します。 – VGR

0

をキャッチしたときのリターンコードはexitメソッドによって設定され、あなたのメインメソッドの周りのtry-catchブロックを追加し、

System.exit(1) 

を使用することができますSystemの場合:たとえば、例外の場合-1を返す場合は、Mainクラスですべてのスロー可能なものをキャッチする必要があります(可能な場合はすべて処理します)。ここに例があります

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

このコードでは、例外の場合は-1、成功の場合は0を返します。

関連する問題