2010-02-04 29 views
5

Tôi biết sử dụng System.exit (0) có thể kết thúc một chương trình java, ví dụ, nếu tôi có cửa sổ JFrame, nó sẽ đóng và kết thúc chương trình, nhưng tôi tự hỏi có bao nhiêu cách khác, nó có thể được đóng lại và chương trình không được kết thúc? Bao gồm cả khi xảy ra lỗi, chương trình có bị tắt và JFrame được đóng không?Có bao nhiêu cách mà Chương trình java có thể kết thúc?

Trả lời

1

Một cách khác mà chương trình Java kết thúc là khi câu lệnh cuối cùng trong mã java được thực thi. Ngoài ra khi xảy ra lỗi java.lang.OutOfMemory, chương trình chấm dứt bất thường. Điều này xảy ra khi Máy ảo Java không thể cấp phát một đối tượng vì nó không có bộ nhớ và không có bộ nhớ nào có thể được bộ thu gom rác cung cấp.

+0

Chỉ khi hàm main() bị vô hiệu. – bkritzer

+0

Điều này có nghĩa là gì? Điều gì sẽ xảy ra nếu dòng mã cuối cùng đang được thực hiện bởi một chuỗi đã cho (ví dụ: bên trong một Runnable) được thực hiện nhưng có các luồng không phải là daemon khác còn sống? – Adamski

+0

ya phải, chỉ khi chính() bị vô hiệu. – Thunderhashy

0

Tôi đã trả lời câu hỏi của bạn trong ngữ cảnh của GUI Swing được đề cập đến của bạn là JFrame.

  • Với giao diện Swing, chuỗi công văn sự kiện sẽ ghi lại mọi ngoại lệ xảy ra nhưng sẽ không chấm dứt ứng dụng trong tình huống này.
  • Tương tự, nếu một chuỗi khác ném một ngoại lệ và chấm dứt chuỗi sự kiện công văn sẽ đảm bảo rằng ứng dụng được giữ nguyên (vì nó không phải là một chuỗi daemon).
  • Một điểm cuối cùng: Nếu bạn muốn ứng dụng của bạn để được chấm dứt khi một JFrame được đóng lại, bạn cần phải gọi: setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

Nếu không thì khung sẽ chỉ đơn giản là được ẩn khi bạn đóng nó lại, nhưng ứng dụng sẽ tiếp tục chạy.

2

Dưới đây là tất cả tôi có thể nghĩ ra khỏi đỉnh đầu của tôi:

  1. main() lợi nhuận (hoặc một giá trị hoặc một khoảng trống() kết thúc chính thực hiện tuyên bố cuối cùng của nó)

  2. chương trình ném một ngoại lệ uncaught

  3. System.exit (int)

  4. Nó có thể sụp đổ?

Trong trường hợp đóng JFrame, tôi tin rằng sẽ có một trình xử lý onClose() gọi System.exit (0) hoặc khiến phương thức chính trả về.

+2

Trong tham chiếu đến 1: Nếu không có chuỗi deaemon chạy, chương trình sẽ tiếp tục chạy ngay cả sau khi main() đã trả về. – jeremytrimble

+0

JFrames có một phương thức có tên 'setDefaultCloseOperation' lấy một trong các hằng số này làm đối số:' WindowConstants.HIDE_ON_CLOSE' (mặc định), 'WindowConstants.DO_NOTHING_ON_CLOSE',' WindowConstants.DISPOSE_ON_CLOSE' và 'JFrame.EXIT_ON_CLOSE' – Powerlord

+0

Vui lòng xem câu trả lời này về phần cuối của chính(): http://stackoverflow.com/questions/2070951/main-function-does-not-return-anything-why/2070968#2070968 –

3

Chương trình Java kết thúc khi Chủ đề cuối cùng không có cờ daemon kết thúc hoặc khi bạn gọi một phương thức tắt máy ảo (System.exit(), Runtime.exit(), Runtime.halt() và có thể là một ít nữa).

Bất cứ điều gì khác là tùy thuộc vào thư viện gọi System.exit() (chẳng hạn như JFrame với EXIT_ON_CLOSE).

+1

Chọn nit, nhưng nếu bạn đã đăng ký một cái móc tắt máy sẽ đi vào vòng lặp vô hạn khi nó chạy? – Adamski

-1

Bạn cũng có thể sử dụng Application.exit().

+0

Khá chắc chắn, 'Ứng dụng' là một số lớp khung công tác chứ không phải là một phần của JRE - bạn có thể cung cấp tên lớp đầy đủ không? –

4

Để thêm vào câu trả lời khác:

  • Nếu quá trình đó được lưu trữ VM được mạnh mẽ chấm dứt, chương trình của bạn sẽ tự nhiên biến mất
  • Cùng xảy ra nếu cắm được kéo trên máy lưu trữ VM :)
+1

ROFL. 1 cho rằng một trong những – DVK

+1

Tôi không hoàn toàn đùa :) Đây thực sự là một kịch bản quan trọng cho một máy chủ mà cần phải thất bại mà không làm mất dữ liệu. –

+1

+1 đó là một trong những kịch bản khó chịu nhất. Nếu không phải vậy, phần mềm khả dụng cao nhất có thể ** nhanh hơn **. –

0

Bạn có thể kết thúc chương trình Java đang chạy bên ngoài. Bằng cách giết chết quá trình java.exe từ trình quản lý tác vụ (trong trường hợp cửa sổ)

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