2015-02-26 19 views
8

Tôi có những nghi ngờ sau liên quan đến một ứng dụng Java dòng lệnh đơn giản.Cách thức hoạt động chính xác mã thoát ứng dụng Java của phương thức main()?

Vì vậy, tôi có ứng dụng dòng lệnh này được bắt đầu bằng phương thức chính chính() được xác định trong một lớp chính.

Như thường lệ này main() phương pháp được definied với chữ ký này:

public static void main(String[] args) { 

Vì vậy, nó kiểu trả về là trống. Vì vậy, nó có nghĩa là nó không trả lại bất kỳ giá trị nào.

Nhưng tại sao khi thực thi chính xác chấm dứt, tôi nhận được thông báo này vào giao diện điều khiển IntelliJ?

Disconnected from the target VM, address: '127.0.0.1:54090', transport: 'socket' 

Process finished with exit code 0 

gì chính xác đại diện cho mã exit 0?

Tôi nghĩ rằng điều đó có nghĩa là chương trình đã hoàn thành chính xác quá trình thực thi mà không phải chịu bất kỳ lỗi nào.

Vì vậy, bây giờ tôi có 2 nghi ngờ sau:

  1. Nếu đó là sự thật tại sao nó xảy ra nếu main() phương pháp trở lại của tôi trống?

  2. Làm cách nào để trả lại mã thoát khác nếu ứng dụng của tôi kết thúc có lỗi? Tồn tại giá trị mã thoát tiêu chuẩn để kết thúc bằng lỗi?

Tnx

+2

'System.exit (1)' – Albert

+1

Vui lòng đọc tài liệu về lớp ['System', đặc biệt là' exit (int) '] (http://docs.oracle.com/javase/7/docs/api /java/lang/System.html#exit%28int%29). – RealSkeptic

+1

Mã thoát 0 chỉ bằng 0 theo quy ước được sử dụng cho java. Trong một trường hợp bình thường, một mã thoát khác thì 0 phải là một chỉ báo cho một lỗi, mà không cần phải là trường hợp nếu lập trình viên phía sau chương trình java không tuân thủ quy ước này khi sử dụng System.exit(); – SomeJavaGuy

Trả lời

15

Các VM thoát khi

  • tất cả các chủ đề phi daemon ngừng chạy, hoặc
  • System.exit(exitCode) được gọi

Trong trường hợp đầu tiên, mã thoát là 0. Trong trường hợp thứ hai, đó là mã thoát được chuyển đến số exit() tôi thod.

Đừng quên rằng ngay cả khi phương thức main() của bạn trả về, chương trình sẽ tiếp tục chạy cho đến khi không có chuỗi không phải daemon nào chạy nữa. Và bất kỳ luồng nào đang chạy trong VM có thể chọn thoát một cách rõ ràng.

Mã thoát 0 có nghĩa là mọi thứ diễn ra như mong đợi. bạn có thể chọn sử dụng bất kỳ mã thoát nào khác để báo hiệu điều kiện ngoại lệ cho môi trường.

+0

Ok, tnx. Có lẽ của tôi là một câu hỏi ngu ngốc nhưng chính xác thì "không phải là chủ đề daemon" là gì? – AndreaNobili

+2

Chủ đề daemon là một chuỗi tự động ngừng chạy khi các chuỗi "không bình thường", không phải daemon cuối cùng ngừng chạy. Đọc http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html –

3

Mã thoát của quá trình là quá trình báo cáo cho hệ điều hành làm mã lỗi của nó.

Nhà thiết kế Java có thể đặt phương thức main() để trả lại int để JVM có thể báo cáo cho OS giá trị này dưới dạng mã thoát khỏi quy trình.Nhưng họ đã quyết định tạo ra khoảng trống chính nhưng cung cấp API có thể cập nhật mã này bằng cách sử dụng System.exit(exitCode). Ưu điểm của giải pháp này là chương trình có thể quyết định thoát tại bất kỳ điểm nào và trong bất kỳ luồng nào, không chỉ trong phương thức chính và trong chuỗi chính.

3

Mã thoát của 0 có nghĩa là mã thoát hoàn toàn bình thường, đó là tiêu chuẩn cho tất cả các quy trình, không chỉ java. Giá trị không trả về từ phương thức chính (nó không có giá trị) nhưng từ chính JVM.

Có thể chỉ định một giá trị khác, ví dụ: System.exit(1) để cho biết một số điều kiện lỗi và chương trình sẽ dừng.

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