2012-01-04 12 views
6

Tôi có ba lớp nói alpha, beta, gamma và mỗi lớp trong số ba lớp này có phương thức main.Làm thế nào để chạy mã sau khi gọi đến Sytem.exit (0) trong một khối cuối cùng

Cả alpha và lớp beta đã, bên trong phương pháp main của họ, một khối try...catch...finally như:

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); 
     } 
    } 
} 

Bây giờ trong lớp gamma tôi gọi các phương thức chính của lớp alpha và beta chạy liên tục như dưới đây

public gamma{ 

    public static void main(String[] args) { 
     try { 
      alpha.main(arg); 
      beta.main(arg1); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 

Sự cố là mã beta.main(arg1) không bao giờ đạt được do số System.exit(0) bên trong khối finally của lớp alpha. Vì alpha và beta là các ứng dụng độc lập khi chúng được thực hiện riêng nên chúng phải chấm dứt dịch vụ ở cuối chương trình. Vì vậy, bây giờ điều này có bất kỳ cách nào để đạt được dòng beta.main(arg1) mà không thay đổi nhiều chức năng thực tế của các lớp alpha và beta.

Vui lòng cho tôi biết nếu bạn cần thêm chi tiết. Cảm ơn trước ...

+1

thể trùng lặp của [Ngăn chặn System.exit() từ API] (http://stackoverflow.com/questions/5401281/preventing-system -exit-from-api) – Mat

Trả lời

4

Trong trường hợp này, móc tắt máy có thể được sử dụng:

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

Rất đẹp. Tôi đã không bao giờ mặc dù sử dụng móc tắt máy như là một cơ chế tiếp tục. –

+0

Câu trả lời tuyệt vời .. Cảm ơn rất nhiều Vlad .... :-) – coolgokul

+0

Bạn đang chào đón) – Vlad

2

(Lý tưởng, không có gì là một phần của API công khai của mô-đun nên làm bất cứ điều gì gọi là exit và phương thức main của một lớp học. công việc thực tế trước khi sản xuất mã lối ra thích hợp.)

Điều đó nói rằng, nếu bạn muốn ngăn chặn System.exit, bạn có thể đăng ký một SecurityManager có thể chuyển đổi các cuộc gọi đến System.exit vào SecurityException s hoặc Error s.

System.exit:

ném

SecurityException - nếu một người quản lý an ninh tồn tại và phương pháp checkExit của nó không cho phép thoát với trạng thái được quy định.

Something như

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

Sau đó phương pháp được gọi phương pháp chính chỉ có thể bắt và ngăn chặn mà SecurityException. Bạn có thể làm cho nó mạnh mẽ hơn bằng cách tạo của riêng bạn ExitCalledError và ném mà thay vào đó và chỉ đàn áp đó.

Tôi thấy điều này rất hữu ích trong việc ngăn chặn người chạy thử nghiệm đơn vị từ thành công báo cáo giả mạo khi người thử nghiệm là exit được mã theo thử nghiệm với mã thoát số 0.

+0

Hm. Tôi không thể quyết định những gì tôi nghĩ về điều này - Tôi ghét sử dụng SecurityManager để làm những việc không an toàn, nhưng đây là một loại hack thanh lịch. –

+1

@CharlieMartin, tôi đồng ý rằng đó là một hack. Đó là khá mạnh mẽ như hack mặc dù, và một số mối quan tâm, độ tin cậy của thông tin phản hồi Á hậu thử nghiệm, đảm bảo nó IMO. Tuy nhiên, có những vấn đề của khóa học - sự hiện diện đơn thuần của một 'SecurityManager' có thể gây ra những lỗi nhỏ trong mã thư viện và có thể ảnh hưởng đến cách VM tối ưu hóa mọi thứ. –

+0

Vâng, và tôi đã bình chọn nó. Tuy nhiên vẫn chưa quyết định những gì tôi nghĩ về nó. –

1

Thực sự, giải pháp duy nhất là loại bỏ cuộc gọi System.exit(). Đây là lý do tại sao System.exit() là ác. Một cách tốt để thay thế chúng là bằng cách ném một ngoại lệ - bạn có thể thêm một trình xử lý ngoại lệ vào hệ thống (xem thêm chúng vào ThreadGroup để thêm một cho mỗi đường dẫn ngoại lệ) và sau đó quyết định những gì bạn muốn làm.

0

System.exit(0) chấm dứt Máy ảo Java hiện đang chạy. Nó đóng tất cả ứng dụng trên máy ảo, không chỉ ứng dụng gọi System.exit(0).Bạn cần phải suy nghĩ thay thế cho chức năng của bạn. Đây là một liên kết về nó. System.exit usage

Các vấn đề liên quan