2012-01-04 6 views
6

私は3つのクラスがalpha、beta、gammaと言っていて、3つのクラスのそれぞれがmainメソッドを持っています。finallyブロックでSytem.exit(0)を呼び出した後にコードを実行する方法

どちらもαおよびβクラスは、そのmain方法、などのtry...catch...finallyブロックの内側にいる:

public class alpha{ 

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


public class beta{ 

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

今ガンマクラスに私は

public gamma{ 

    public static void main(String[] args) { 
     try { 
      alpha.main(arg); 
      beta.main(arg1); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 
以下のように継続的に実行するために、アルファとベータのクラスの主なメソッドを呼び出します

アルファクラスのfinallyブロック内のコードにはSystem.exit(0)が含まれているため、コードに問題がありません。 アルファとベータは独立して実行されるスタンドアロンアプリケーションであるため、プログラムの最後にサービスを終了する必要があります。 これで、アルファ版とベータ版の実際の機能をあまり変更せずにbeta.main(arg1)行に到達する方法があります。

詳細が必要な場合はお知らせください。 事前のおかげで...

+1

可能重複(http://stackoverflow.com/questions/5401281/preventing-system -exit-from-api) – Mat

答えて

4

、シャットダウンフックを使用することができる:[APIからはSystem.exit()を防止]の

public class Gamma{ 

    public static void main(String[] args) { 
     try { 
     Thread hook = new Thread() { public void run() { Beta.main(args); } }; 
      hook.setDaemon(true); 
      Runtime.getRuntime().addShutdownHook(hook); 
      Alpha.main(args); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

ニース。私は、継続メカニズムとしてシャットダウンフックを使用したことはありませんでした。 –

+0

偉大な答え..おかげで多くのVlad .... :-) – coolgokul

+0

あなたはようこそ) – Vlad

2

(理想的には、モジュールの公開APIの一部であり、何が今までexitを呼び出して何もしてはならない、とクラスのmain方法は、ちょうどない何かを呼び出す小さなシムでなければなりません適切な終了コードを生成する前に、実際の作業。)

あなたがSystem.exitを防ぎたい場合は、あなたがSecurityException秒またはError秒にSystem.exitへの呼び出しに変換SecurityManagerを登録することができ、と述べました。

System.exit

SecurityExceptionを投げる - セキュリティマネージャが存在し、そのcheckExitメソッドは、指定されたステータスでの終了を許可しない場合。

System.setSecurityManager(new SecurityManager() { 
    @Override 
    public void checkExit(int exitCode) throws SecurityException { 
    throw new SecurityException("stop that"); 
    } 
}); 

ような何かそして、メインメソッドを呼び出している方法だけではSecurityExceptionをキャッチし、抑制することができます。あなた自身のExitCalledErrorを作成し、その代わりにそれを投げ、それを抑制するだけで、より頑強にすることができます。

これは、テストランナーが終了コードがゼロのテスト対象コードによってexitになったときに、単体テストランナーが誤って報告してしまうのを防ぐのに非常に役立ちます。

+0

Hm。私はこれについて何を考えているのか判断することはできません。私はSecurityManagerを使って非セキュリティのことをするのは嫌ですが、これは一種のエレガントなハックです。 –

+1

@CharlieMartin、それはハックだと私は同意します。ハックが進むにつれてかなり堅牢で、いくつかの懸念、テストランナーのフィードバックの信頼性は、IMOを保証します。もちろん、「SecurityManager」が存在するだけでは、ライブラリコードの微妙なバグをくすぐすことができ、VMが物事を最適化する方法に影響を与える可能性があります。 –

+0

まあ、私はそれをアップビートしました。まだ私がそれについて考えていることは決まっていない。 –

1

本当に、唯一の解決策は、System.exit()呼び出しを取り除くことです。これがSystem.exit()が悪い理由です。それらを置き換えるための良い方法は、例外を投げることです。システムに例外ハンドラを追加することができます(ThreadGroupsに例外ハンドラを追加して例外パスごとに追加します)。

0

System.exit(0)は、現在実行中のJava仮想マシンを終了します。 System.exit(0)を呼び出すアプリケーションだけでなく、VM上のすべてのアプリケーションを閉じます。あなたはあなたの機能のための代替案を考える必要があります。ここにそれに関するリンクがあります。このような場合にSystem.exit usage

関連する問題