2010-03-12 2 views
3

나는 둘 다 대답하려고합니다, 저를 수정하시기 바랍니다 호출하는 메서드의 반환 형식을 변경하더라도 동일한 메서드가 여전히 호출됩니다.JVM이 입력 메소드 main (String args [])의 반환 유형이 무효인지 확인하는 이유는 무엇입니까?</p> <p><strong>어디 : 정적 방법 (<em>클래스 이름</em> .method 사용) 또는 반사를 사용하여 호출되는 경우</strong> 다음은 문제가되지 않습니다 만약 내가 잘못

그래서 JVM은 아마 jvm.cpp

methodHandle m (THREAD, init_klass->find_method(vmSymbols::object_initializer_name(),> vmSymbols::void_method_signature()));

if (m.is_null()) { ------ THROW_MSG_0 ………..

의 기본 방법 중 하나에서이 문제를 확인 이유 : 하지만 그와 자바 아무것도하지 않는 한, 주에서 값을 반환 할 쓸모 그것은하지만 우리는 예를 들어 int로 주요의 반환 형식을 변경하려고하면, JVM이 발생

public static int main(String[] args) { return 1;
}

java.lang.NoSuchMethodError: main Exception in thread "main"

자바 동일한 서명의 사용을 의무화 그래서 될 수있다

입력 메소드 main()은 대칭을 모든 Java 프로그램에서으로 유지합니다. "왜"에 관해서는

답변

0

: (맥에는 명령 줄 없었기 때문에) 나는 맥 (OS 7 정도)에 옛날에 기억

, 맥 JVM은 인수가없는 static void main()을 받아 들일 것 . 이제 사라졌습니다.

엄격하고 모호하지 않은 행동이 도움이된다고 가정합니다. 그렇지 않으면 어떤 플랫폼에서 작동하는 프로그램으로 끝나고 다소 어리석은 이유로 다른 플랫폼에서 작동하지 않게됩니다. 여러분이 지적한대로 main의 모든 반환 값은 무시됩니다.

+1

@Thilo Java에서 main의 반환 값은 삭제되지 않고 main에서 값을 반환 할 수 없습니다. – akjain

+0

"Where"에 대한 답변을 아직 기다리고 있습니다. – akjain

3

내가 수집 할 수있는 이유는 이 Java에서 void을 반환하는 이유는 스레드입니다.

C와 C++ 모두 멀티 스레딩이 공통 관용구가되기 전에 설계되었으며, 스레드는 개념 상 자바에서 없어서는 안될 부분이었습니다. 사소한 (멀티 스레드) 프로그램의 종류에는 스레드가 두 개 이상 있으므로 실제 프로그램은 메인의 처음부터 끝까지 선형 적으로 실행되지 않습니다.

데몬이 아닌 모든 스레드 이 실행을 마칠 때까지 JVM이 실행을 중지하지 않으므로 주 방법에서 돌아와도 사용자의 프로그램이 종료 된 것은 아닙니다.

실제로이 점을 염두에두고 void은 실제로 메인에 가장 적합한 리턴 유형 인 것처럼 보입니다.

+0

@JRL (main returns void, reason is threads)이 개념을 조금 더 자세히 설명하거나이 개념에 대해 더 많이 읽을 수있는 링크를 가르쳐 주시겠습니까? – akjain

+0

@akjain : stackoverflow 및 velocityreviews를 포함한 여러 위치에서 읽었습니다. 나는 책이나 표준과 같은 권위있는 링크를 가지고 있지 않습니다. – JRL

+2

@akjain : 다른 예 : NetBeans의 기본 데스크톱 응용 프로그램 템플릿. 모든 주요 메소드는 EDT 스레드의 GUI 클래스를 새로 작성한 후 즉시 종료됩니다. 앱은 여전히 ​​실행 중입니다. 메인에서 값을 반환하면 어떤 의미가 있습니까? – JRL