2015-02-26 11 views
8

Mam następujące wątpliwości związane prostą aplikację Java linii poleceń.Jak dokładnie działa kod zakończenia aplikacji Java metody main()?

Więc mam tej aplikacji wiersza polecenia, które jest startd przez main() metoda zdefiniowana wewnątrz Głównego klasie.

Jak zwykle ten main() jest zdefiniowana metoda z tym podpisem:

public static void main(String[] args) { 

więc powrócić typ jest void. Powinno to oznaczać, że nie zwraca żadnej wartości.

Ale dlaczego po prawidłowym zakończeniu jego wykonywania otrzymuję tę wiadomość do konsoli IntelliJ?

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

Process finished with exit code 0 

Co dokładnie oznaczają kod exit 0?

Myślę, że oznacza to, że program poprawnie zakończył wykonywanie bez żadnych błędów.

Więc teraz mam następujące wątpliwości: 2

  1. Jeśli prawdą jest, dlaczego tak się dzieje, jeśli moje main() Sposób powrotu void?

  2. Jak mogę zwrócić inny kod zakończenia, jeśli moja aplikacja zakończy się błędem? Czy istnieje standardowa wartość kodu zakończenia dla błędów?

Tnx

+2

'System.exit (1)' – Albert

+1

Proszę przeczytać dokumentację klasy ['System', w szczególności' exit (int) '] (http://docs.oracle.com/javase/7/docs/api /java/lang/System.html#exit%28int%29). – RealSkeptic

+1

Kod wyjścia 0 jest równy 0 zgodnie z konwencją używaną dla języka Java. W normalnym przypadku kod wyjścia inny niż 0 powinien być wskaźnikiem błędu, co nie musi mieć miejsca, jeśli programista za programem java nie zastosował się do tej konwencji podczas korzystania z System.exit(); – SomeJavaGuy

Odpowiedz

15

VM wychodzi kiedy

  • wszystkie non-demona wątków przestają działa, lub
  • System.exit(exitCode) nazywa

W pierwszym przypadku, kod zakończenia wynosi 0. W drugim przypadku kod wyjścia został przekazany do exit() thod.

Nie zapominaj, że nawet jeśli zwrócona zostanie twoja metoda main(), program będzie działał do momentu, gdy wątek inny niż demon nie będzie już działać. Każdy wątek uruchomiony w VM może zdecydować się na wyjście z niego.

Kod wyjścia 0 oznacza, że ​​wszystko przebiegło zgodnie z oczekiwaniami. możesz użyć dowolnego innego kodu wyjścia, aby zasygnalizować wyjątkowy stan dla środowiska.

+0

OK, tnx. Może moje pytanie jest głupie, ale czym dokładnie są "wątki non daemona"? – AndreaNobili

+2

Wątek demona jest wątkiem, który automatycznie zatrzymuje się, gdy ostatnie "normalne" wątki nie będące demonami przestają działać. Przeczytaj http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html –

3

Kod zakończenia procesu jest tym, co proces raportuje do systemu operacyjnego jako jego kod błędu.

projektanci Java mógłby zrobić main() metodę powrotu int tak że JVM mogła zgłosić do OS tę wartość jako kod zakończenia procesu.Zdecydowali się jednak na unieważnienie, ale zapewniają interfejs API, który może zaktualizować ten kod za pomocą System.exit(exitCode). Zaletą tego rozwiązania jest to, że program może zdecydować się na wyjście w dowolnym punkcie i dowolnym wątku, nie tylko w głównej metodzie i wątku głównym.

3

Kod wyjścia wynoszący 0 oznacza, że ​​jest normalnie zakończony, co jest standardem dla wszystkich procesów, a nie tylko java. Wartość nie powraca z głównej metody (jest nieważna), ale z samej maszyny JVM.

Można podać inną wartość, np. System.exit(1) w celu wskazania jakiegoś błędu i program się zatrzymuje.

Powiązane problemy