2012-06-11 2 views
9

Java는 특정 키워드 뒤에 명령문이나 명령문 블록이 오도록 허용합니다. 예를 들어 :Java에서 try/catch 또는 synchronized가 명령문 블록을 필요로하는 이유는 무엇입니까?

if (true) 
    System.out.println("true"); 

do 
    System.out.println("true"); 
while (true); 

이 그러나, 일부 키워드는 이것을 허용하지 않는 for, while

또한 같은 키워드에 대한 사실뿐만 아니라

if(true) { 
    System.out.println("true"); 
} 

do { 
    System.out.println("true"); 
} while (true); 

로 컴파일합니다. synchronized에는 block 문이 필요합니다. try ... catch ... finally과 동일합니다. 키워드 뒤에 적어도 두 개의 block 문이 필요합니다. 예를 들어 :

try { 
    System.out.println("try"); 
} finally { 
    System.out.println("finally"); 
} 

synchronized(this) { 
    System.out.println("synchronized"); 
} 

작동하지만 다음과 같은 컴파일되지 않습니다 : 다른 사람이 하나뿐만 아니라 블록 문을 허용하면서 자바에서 몇 가지 키워드, 블록 문을 필요로 왜 이렇게

try 
    System.out.println("try"); 
finally 
    System.out.println("finally"); 

synchronized (this) 
    System.out.println("synchronized"); 

을 성명서? 언어 디자인에있어 모순이 있습니까? 아니면 이에 대한 이유가 있습니까?

+5

단일 문장 접근법이 frowned되고 c에서 비슷한 점이 있기 때문에 사용 된 것 같습니다. c는 동기화되지 않았거나 시도하지 않았기 때문에 아마도 "안전한"옵션을 사용했을 것입니다. –

+1

이것이 구문입니다. AFAIK는 자동으로 생성 될 수 있기 때문에 블록이 있어야한다는 기술적 인 이유가 없습니다. –

+0

내 추측은 FWIW입니다. 언어 디자이너는 학습을 돕기 위해 다른 언어와 비슷한 구문을 유지하기를 원했습니다. 그러나 새로운 언어 기능이 추가 된 곳에서 느껴지는 것은 더 나은 코딩 표준이라는 느낌을 강요 할 것입니다. 또는 덜 자주 사용되는 언어 기능의 경우 더 나은 코딩에 대한 아이디어를 얻었습니까? – Marvo

답변

4

중괄호를 사용하지 않으려는 경우 애매 모호함이 발생합니다. 이것은 매달아 다른 것과 비슷한 방식으로 해결 될 수 있지만, 그렇지 않은 경우가 가장 좋습니다.

그 (잘못 될 수있다) 나는 CLU 믿고

try 
    try 
     fn(); 
    catch (GException exc) 
     g(); 
    catch (HException exc) 
     h(); 
catch (IException exc) 
    i(); 

또는

try 
    try 
     fn(); 
    catch (GException exc) 
     g(); 
catch (HException exc) 
    h(); 
catch (IException exc) 
    i(); 

는, catch 블록 주위에 하나의 문이었다 뜻
try 
try 
fn(); 
catch (GException exc) 
g(); 
catch (HException exc) 
h(); 
catch (IException exc) 
i(); 

을 고려하십시오.

+1

좋은 답변입니다. +1 – EJP

+0

if/else 블록과 비슷한 문제가 있습니다. 나는 디자이너들이 공통적 인 문제를 피하기를 원한다고 생각한다. –

+0

좋은 예를 들어 주셔서 감사합니다, 톰. 그러나이 동기화 된 식에 관한 내 질문에 설명하지 않습니다. – Bob

2

언어의 디자인 결정과 컴파일러 역학입니다.

나는이 결정에 동의합니다. 코드 블록을 필요로하지 않으면 코드가 짧아 질 수 있지만 혼란을 야기하고 예기치 않은 결과를 초래하는 것은 확실합니다.

+0

컴파일러의 설계를 언급했지만, 컴파일러가 없어도 작동하지는 않습니다. 자바 컴파일러는 그것을 받아들이지 않습니다. 아마도 더 나은 표현은 "컴파일러 디자인 결정"이었을 것입니다. –

+0

Possessive. 결정된. –

+0

@ Jonathan : 아, 알겠습니다. :-) –

1

혼동이있을 수있는 진술에도 {}을 사용하지 않으면 문제가 있습니다. 이 문제를 해결하는 방법은 코드 포맷터를 엄격하게 사용하는 것입니다. 많은 곳에서 항상 문제를 피하기 위해 {}이 (가) 필요합니다.

if (condition) 
    if (condition2) 
     statement 
    else // which if 
    statement 

do 
    statement 
    while (condition) // is it do/while or an inner loop? 
     statement 
    while (condition2) 
    statement 

난 당신이 C에서 C.에서 일부 문장이 아닌 다른 사람을 위해이 작업을 수행 할 수있는 이유는 당신이 사용할 수있는 믿는다면/수행/동안/문장 블록이없는합니다. 그러나 try/catch와 synchronized는 Java에 추가되었습니다. 이것들에는 {} 블록 만있는 두 가지 이유가 있습니다.

  • 은 그것이 가장 좋은 방법은
  • 단지 하나의 옵션을 허용하는 간단 여겨졌다.

Java는 기능이 희박한 언어이며, 이전 버전보다 훨씬 많거나 더 많은 것으로 판단됩니다.

관련 문제