2010-01-15 11 views
11

C/C++의 경우 main()은 항상 정수 (성공을 나타 내기 위해 0, 실패를 나타 내기 위해 0이 아닌 값)를 반환해야합니다. 프로그램이 실행될 때이를 이해할 수 있으며 프로세스가되고 모든 프로세스는 종료 상태를 가져야합니다.이 상태는 echo $를 수행하여 얻을 수 있습니까? 프로세스가 끝나면 쉘에서.주 기능은 아무 것도 반환하지 않습니다. 왜?

이제 주 방법이 Java에서 아무 것도 반환하지 않는다는 것을 이해할 수 없습니까? 프로그램이 JVM에서 실행되고 JVM 프로세스가 종료 상태를 반환 할 수 있다는 사실과 관련이 있습니까?

명확히하십시오.

감사합니다,
로저

답변

14

주요 방법가 종료 단일 스레드 자바 응용 프로그램의 , 당신은 아마 오류를 나타 내기 위해, 또 다른 종료 코드가 필요하면 종료 코드 0으로 종료됩니다 응용 프로그램은, 당신이 배치 할 수있는 경우

System.exit(yourNumberHere); 

코드의 어디에서나 (특히 메인 메소드 외부).

멀티 스레드 응용 프로그램 의 경우에는 System.exit 내부에서 kill -9 내부까지 JVM을 중지해야합니다.

public static void main(String args[]) { 
    Thread iWillSurvive = new Thread(new Runnable() { 
    public void run() { 
     while(true) { 
     // heat the CPU 
     } 
    } 
    }); 
    iWillSurvive.start(); 
} 

비고 : : 물론, 쓰레드가이 방법을 실행할 때 종료됩니다 (또는

여기에 주요 종료 응용 프로그램 (일반적인 서비스 나 데몬 동작을) 중지하지 않는 간단한 예제입니다 주 스레드의 경우 main 메소드)가 종료됩니다. 이 경우 모든 스레드가 종료되면 JVM이 종료 코드 0으로 종료됩니다 (초기 질문으로 되돌아갑니다). 모두가 행복하기를 바랍니다.

+0

내 프로그램에 System.exit()이 없으면 JVM이 0을 추가합니다. 내 프로그램에 0이 아닌 값이 포함 된 명시 적 호출이 있으면 exit로 사용됩니다 상태? – gameover

+0

main 메소드가 종료되면 Java 프로세스가 반드시 종료하지 않으므로 main 메소드에서 프로세스의 종료 코드를 반환하는 것이 부적절합니다 (kai1968가 지적했듯이). – jarnbjo

+0

아직도 틀립니다. kill 또는 System.exit과 같은 도구를 사용하여 다중 스레드 Java 응용 프로그램을 중지하지 않아도됩니다. 힌트 : 가장 간단한 "Hello world"Java 애플리케이션조차도 mutlithreaded (Java VM은 다른 관리 문제에 대해 자체 스레드를 시작 함)이며, 기본 메소드가 완료되면 종료됩니다. – jarnbjo

7

자바는 그 목적을 위해 System.exit(int) 있습니다.

기본적으로 Java 프로그램은 프로그램 흐름이 주 방법의 끝에 도달하면 종료 코드 0으로 종료됩니다 (대략적으로 스윙과 스레딩으로는 더 이상하지 않지만 충분해야합니다).

System.exit() 어딘가에 (실제로, 어디서나) 또는 Runtime.getRuntime().exit() 전화를 걸면 System.exit()이 즉시 호출되고 프로그램이 즉시 종료됩니다.

Java가 암시 적으로 System.exit(0)을 주 방식의 맨 끝에 추가하는 것처럼 사진을 찍을 수 있지만 더 미묘한 차이가있을 수 있습니다. 지금 당장 내 머리 속에 JVM 종료에 대한 자세한 내용은 나와 있지 않습니다.

+0

모든 Java 프로그램이 끝날 때 작성하지 않습니다. – gameover

+0

비정상적으로 반환하고 싶지 않다면 아니오. 평소와 같이 암시 적 종료 코드는 '0'입니다. – Joey

+0

내 프로그램에 System.exit()이 없으면 JVM이 0을 추가합니다. 내 프로그램에 0이 아닌 값이 포함 된 명시 적 호출이 있으면 exit로 사용됩니다 상태? – codaddict

0

아마도 System.exit(int exitCode)이 값을 반환하지 않았기 때문일 수 있습니다.

+0

기존 게시물을 답변으로 보지 못했기 때문에 게시물을 편집하여 질문보다 답변을 더 많이 만들었습니다. –

16

멀티 스레딩이 이미 공통적 인 경우에 설계된 java는 'main'이 프로그램을 반환 할 때 "good bye"이라는 생각으로 말했습니다. 그것이 반환 가치가없는 이유입니다. 다른 사람들이 반환 코드로 끝내고 싶을 때 System.exit을 사용했다.

+0

요약하면 꽤 많이 있습니다. – McDowell

+0

+1 큰 설명 : – atv

4

사소한 하찮은 일로 괴로워 - C++, 당신은 메인에서 아무것도 반환 할 필요가 없습니다 :

int main() { 
} 

이 완벽하게 합법적 C++ 프로그램입니다 - 당신이 가진 것처럼 그것은 역할 :

return 0; 

로 main의 마지막 명령문.

+0

나는 이것을 말하기 위해 여기에왔다. 항상 표준은 당신이이 경우에 무효로 돌아갈 것을 요구하지 않는다는 것을 저에게 놀라게합니다. 그리고 사실 당신은 그런 식으로 선언 할 수 없습니다. 그러나 그것이 작동하는 방법입니다. – jcoder

0

int를 반환하는 C/C++의 이유는 그 언어에서 함수/메서드/프로그램 성공/실패를 나타내는 규칙이기 때문에 의심 스럽습니다.

성공 사례에서는 0을, 실패하면 0이 아닌 예외를 사용하여 예외에 대한 예외 계층 구조를 사용하고 예외가 발생하지 않았을 때만 성공하여 예외를 반환하지 않아도됩니다. 값.

+0

'main()'에서 예외를 throw하는 것이 유용하지 않을 뿐이며 유일한 출력은 리턴 코드 여야합니다. C 프로그램에서 예외를 지원하지 않고 Java 프로그램에서 Java가 예외를 지원한다고해서 운영 체제와 상호 작용하는 방식에는 영향을 미치지 않습니다. –

0

요즘에 쓰는 대부분의 프로그램은 사용자 인터페이스의 일부 형식을 갖고 있으며 유용하게 반환 할 수있는 기능이 거의 없으며 모든 경우에 상태 코드가 필요할 가능성이 적습니다.

그럼 왜 모든 프로그램을 강제로 돌려 주어야합니까? 다른 사람들이 말했듯이 상태 코드를 반환하면 ...

+0

프로그램이 상태 코드를 반환하도록하는 것은 무엇입니까? –

1

종료 값은 bash 스크립트 또는 명령 행 작업과 같은 스크립팅에 유용합니다. 이러한 경우 System.exit()을 사용하십시오.

관련 문제