2010-02-26 6 views

답변

33

예 : 나는 실제로이를 구현하기 위해 (너무 final 있습니다 static 변수를)하려고 할 때, 나는 아래의 스크린 샷에 표시된 오류 그러나

, static final 변수가 될 수 있습니다 정적 블록 에서 초기화되었지만 ....이 예제에서는 암시적인 GOTO가 있습니다 (try/catch은 본질적으로 입니다. '나쁜 일이 생기면 GOTO를 잡습니다' ').

예외가 발생하면 final 변수가 초기화되지 않습니다.

정적 구성의 사용은 객체 지향 교리에 위배됩니다. 테스트가 복잡해지고 디버깅이 더 어려워 질 수 있습니다.

+1

'정적 초기화 블록'에서 예외를 throw 할 수 있습니까? '정적 초기화 블록 '의 코드가 처리하고 싶지 않은 예외를 던지면 무엇을 할 수 있습니까? –

+0

예를 들어 try catch 블록 외부의 변수를 초기화 할 수 있습니다. try catch에서 코드를 던져 예외를 던지고 finally에서 초기화하면 ... – awk

+3

@awk : 예외를 throw하는 코드가 getString (...) 메서드 호출 인 경우 그는 로컬 작업을 수행해야합니다. –

17

이렇게 할 수는 있지만 예외를 throw하여 정적 블록을 종료해야합니다. catch 된 예외 또는 새 예외를 다시 throw 할 수 있습니다. 일반적으로이 예외는 RuntimeException이어야합니다. 일반적인 Exception을 잡아서는 안되며 try 블록에서 발생할 수있는 더 자세한 예외가 있습니다. 마지막으로, 정적 이니셜 라이저가 예외를 throw하면 JVM이 클래스를 한 번만 초기화하려고하기 때문에 특정 실행 중에 클래스를 사용할 수 없게 렌더링합니다. 이후에이 클래스를 사용하려고 시도하면 NoClassDefFoundError과 같은 또 다른 예외가 발생합니다.

static { 
    try { 
     ... 
    } catch (Exception e) { 
     e.PrintStackTrace(); 
     throw new InitializationFailedException("Could not init class.", e); 
    } 
} 

InitializationFailedException 사용자 정의 RuntimeException이라고 가정하지만, 기존 하나를 사용할 수 있습니다

그래서, 당신의 이니셜이 같은 뭔가를 읽어야 작동합니다.

+0

이유가 확실하지 않은 이유를 설명하십시오. –

0

finally 블록에 선언을 넣을 수 있습니까?

try { 
    //load file 
} catch(IOException e) { 
    // horay 
} finally { 
    HOST=config.get...... 
} 
+1

이것은 불가능합니다. – pvorb

8
public class MyClass 
{ 
    private static final SomeClass myVar; 

    static 
    { 
     Object obj = null; // You could use SomeClass, but I like Object so you can reuse it 
     try 
     { 
      obj = new SomeClass(...);  
     } 
     catch(WhateverException err) 
     { 
      // Possibly nested try-catches here if the first exception is recoverable... 
      // Print an error, log the error, do something with the error 
      throw new ExceptionInInitializerError(err); 
     } 
     finally 
     { 
      myVar = (SomeClass) obj; 
     } 
    } 
} 

상류 잡을 수있는 위치에있는 경우없는 어느 쪽 ExceptionInInitializationError 또는 일반 예외 다음 프로그램이 어느 myVar에를 사용하려고하지 말아야 가정. 그러나 이들이 잡히면 프로그램이 종료되지 않으면 myVar이 null인지 (또는 NullPointerExceptions이 나오기를 기쁘게 생각합니다) 처리하고 처리하도록 코딩해야합니다.

나는 이것을 처리하는 좋은 방법이 있는지 모르겠습니다.

+1

>>> _ 그러면 myVar이 null인지 알아보기위한 코드를 작성해야합니다. null_ 여기에서 정적 초기화 프로그램은 클래스가 전혀로드되지 못하도록 (즉, 변수를 초기화 할 수 없으므로) 걱정할 필요가없는 예외를 throw합니다. NPE (널 포인터 예외) – sactiw

관련 문제