Java 언어에 대한 나의 이해를 바탕으로 정적 변수는 static initialization block
으로 초기화 될 수 있습니다. 물론Java - 최종 변수를 정적 초기화 블록에서 초기화 할 수 있습니까?
답변
예 : 나는 실제로이를 구현하기 위해 (너무 final
있습니다 static
변수를)하려고 할 때, 나는 아래의 스크린 샷에 표시된 오류 그러나
, static final
변수가 될 수 있습니다 정적 블록 에서 초기화되었지만 ....이 예제에서는 암시적인 GOTO가 있습니다 (try/catch
은 본질적으로 입니다. '나쁜 일이 생기면 GOTO를 잡습니다' ').
예외가 발생하면 final
변수가 초기화되지 않습니다.
정적 구성의 사용은 객체 지향 교리에 위배됩니다. 테스트가 복잡해지고 디버깅이 더 어려워 질 수 있습니다.
이렇게 할 수는 있지만 예외를 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
이라고 가정하지만, 기존 하나를 사용할 수 있습니다
이유가 확실하지 않은 이유를 설명하십시오. –
finally 블록에 선언을 넣을 수 있습니까?
try {
//load file
} catch(IOException e) {
// horay
} finally {
HOST=config.get......
}
이것은 불가능합니다. – pvorb
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
이 나오기를 기쁘게 생각합니다) 처리하고 처리하도록 코딩해야합니다.
나는 이것을 처리하는 좋은 방법이 있는지 모르겠습니다.
>>> _ 그러면 myVar이 null인지 알아보기위한 코드를 작성해야합니다. null_ 여기에서 정적 초기화 프로그램은 클래스가 전혀로드되지 못하도록 (즉, 변수를 초기화 할 수 없으므로) 걱정할 필요가없는 예외를 throw합니다. NPE (널 포인터 예외) – sactiw
- 1. 정적 최종 변수 초기화
- 2. Javascript 개체 - '정적 초기화'
- 3. 초기화 후 초기화 스타일로 변수를 설정할 수 있습니까? C#
- 4. C 정적 변수 초기화
- 5. C++에서 클래스의 정적 변수를 초기화 하시겠습니까?
- 6. 개체 정적 멤버 초기화
- 7. 스트림 초기화/초기화에 대한 java 초기화 변수
- 8. 정적 필드/속성 초기화
- 9. PHP의 정적 멤버 초기화
- 10. 정적 속성 초기화
- 11. 정적 클래스 멤버의 초기화
- 12. Java 클래스 재 초기화
- 13. new는 윈도우에서 정적 전역 변수를 초기화 할 때 NULL을 반환합니까?
- 14. 정적 배열 문제 초기화
- 15. 종속성의 경우 정적 초기화
- 16. 스프링의 정적 초기화 스프링
- 17. 일반 정적 필드 초기화
- 18. 정적 변수 초기화 자바
- 19. JAVA 데이터베이스 환경 초기화
- 20. 어떻게 WebDriver의 참조 변수를 초기화 할 수 있습니까?
- 21. 함수 호출 결과로 전역 변수를 초기화 할 수 있습니까?
- 22. 변수를 사용하여 jQuery 데이터 테이블을 초기화 할 수 있습니까?
- 23. 어떻게 배열을 MIPS로 초기화 할 수 있습니까?
- 24. Java 초기화 블록
- 25. Java 초기화 질문
- 26. 어떻게 구조를 초기화 할 수 있습니까?
- 27. 세마포어를 여러 번 초기화 할 수 있습니까?
- 28. 어떻게 NVelocity를 올바르게 초기화 할 수 있습니까?
- 29. 어떻게 시작시 서버를 초기화 할 수 있습니까?
- 30. 어떻게하면 NSMutableArray를 초기화 할 수 있습니까?
'정적 초기화 블록'에서 예외를 throw 할 수 있습니까? '정적 초기화 블록 '의 코드가 처리하고 싶지 않은 예외를 던지면 무엇을 할 수 있습니까? –
예를 들어 try catch 블록 외부의 변수를 초기화 할 수 있습니다. try catch에서 코드를 던져 예외를 던지고 finally에서 초기화하면 ... – awk
@awk : 예외를 throw하는 코드가 getString (...) 메서드 호출 인 경우 그는 로컬 작업을 수행해야합니다. –