2012-06-13 4 views
17

나는 잡는 것이 java.lang.Error이 나쁜 습관이라고 생각합니다. 현재 PATH에있을 수 없다는 .dll을로드 중입니다. 그렇지 않은 경우 사용자가 구성한 위치로 전환하고 싶습니다.Java 오류 잡기

try { 
    System.loadLibrary("HelloWorld"); 
} catch(UnsatisfiedLinkError ule){ 
    System.load("C:/libraries/HelloWorld.dll"); 
} 

더 좋은 방법이 있나요? 또는 여기 UnsatisfiedLinkError을 수락하고 있습니까?

+5

올바른 convetion에 대해서는 잘 모르겠지만, 시도해보기 전에 파일이 존재하는지 테스트 할 수 있습니다 ... ['new File ("path/helloworld.dll") .exists()'] (http : // docs. oracle.com/javase/7/docs/api/java/io/File.html#exists%28%29) .... (편집 : 잘못된 제안, 내가 코드를 잘못 읽었습니다.) –

+5

나는 그것을 받아 들일 수있는 해결 방법이라고 생각합니다. –

+0

@Slanec 당신은'java.library.path'에있는 모든 디렉토리를 검색해야 할 것입니다. –

답변

16

기술적으로 문제를 해결하는 방법에 대한 조언을주는 것 이외에는 잠시 시간을내어 첫 번째 장소에서 "나쁜 습관"으로 간주되는 이유를 설명하고자합니다.

Error 클래스가 무엇인지 명확히 설명해 보겠습니다.


java에서는 오류 및 예외 (기본 유형)가 발생합니다. 위의 중 하나를 던지는 것은 throw 키워드를 사용하여 수행됩니다. 기본 클래스 인 java.lang.Throwable을 확장하는 모든 클래스가 throw 될 수 있습니다.

기본 Throwable 클래스를 상속하는 클래스는 ExceptionError입니다. 그 둘 사이의 차이점은 문서화에 설명되어 있습니다 :

오류는 합리적 응용 프로그램이라면 파악하려고 시도해서는 안되는 중대한 문제를 나타내는 것을 의 Throwable의 서브 클래스입니다. 과 같은 오류는 비정상적인 조건입니다. [...]

Source

클래스 예외와 그 서브 클래스는 보통의 어플리케이션 캐치 될 가능성이있는 조건을 나타내는 것을 의 Throwable 의 한 형태 .

Source


이상 설명한 바와 같이, 오류와 예외로 인해 서로 다른 기원 분리된다. Error은 일반적으로 에서 응용 프로그램을 복구 할 수없는 문제를 나타냅니다. 그러므로, 그들은 잡히면 안된다.

RuntimeException에 대해서도 마찬가지이지만, 상위 계층의 문제 (예 : 메소드)를 나타내는 데 사용됩니다. Error은 낮은 수준의 문제 (예 : 런타임)를 나타냅니다.


그래서, 지금 당신은 당신이 예외는 복구 할 수있는 오류를 포착해야 단지 것을 이해하는 것이, 질문에 대한 대답은 명확해야한다.

예, 응용 프로그램에서 복구 할 수 있기 때문에 UnsatisfiedLinkError을 잡는 것이 매우 합리적입니다.


는 I 위 (보다 구체적으로 예로) 및 article on my Blog 일부 확장 정보 덮여있다.

+0

이 패러다임을 위반해야했던 한 번은 예외를 지정하지 않은 클래스에서 정상적인 오류를 던져야 할 때였습니다. 그래서 나는'RuntimeException'에서 파생되어 언어 요구 사항을 골머랐다. 여전히 더 나은 방법이 있었으면 좋겠다. – djechlin

+0

응용 프로그램에서 오류를 복구 할 수 없다면 잡기가 더 안 좋을 것입니다. 그렇습니까? – simon

+0

@simon 오류에서 진정으로 복구 할 수 없다면 잡을 때 무엇을 할 것입니까? 응용 프로그램이 더 이상 작동하지 않으면 왜 계속 실행합니까? –

0

loadLibrary는 도움이 될만하지만 보호되었으므로 가장 좋은 방법은 ClassLoader를 확장하는 자신 만의 클래스를 작성하는 것입니다. 클래스 로더에는 라이브러리 경로를 반환하는 findLibrary()라는 보호 된 메서드가 있거나 존재하지 않으면 null이 있습니다. 그렇게하면 오류를 잡는 대신 null을 확인할 수 있습니다. 이것이 실제로 더 나은지 확실하지 않지만 try catch에 대한 필요성을 제거합니다.

+0

라이브러리는 검사 후로드 전에 삭제 될 수 있으므로 try catch가 여전히 필요할 수 있습니다. –

0

방어 적으로 코딩 중이며 문제를 복구 할 수있는 경우 Java Error이 아닙니다. 그러한 문제가별로 발생하지 않으면 Exception의 하위 클래스를 만들고 그 클래스를 던져 잡아라. 그러한 문제가 발생할 가능성이 있다면 Exception을 던져서도 안됩니다. 그러나 정규 코드 흐름의 일부 여야합니다.

try { 
    if (config.hasCustomDLL()) { 
    System.load(config.getCustomDLL()); 
    } else { 
    System.loadLibrary(Config.DEFAULT_DLL); 
    } 
} catch (UnstatisfiedLinkError e) { 
    System.out.println("Error loading DLL: " + e); 
} 

Errors가 정말 나쁜 실패에 대한 의미, 적절한 해결 방법이 있다면 정말도 실패하지 복구 할 수 없습니다 "실패". 장애를 처리하도록 설계된 시스템에 시스템을 여러 가지 방법으로 구성하는 데 과부하가 걸리지 않도록하십시오.

0

아주 특별한 경우에만 오류를 잡아야합니다. 다른 모든 가능성을 탐색 한 경우에만 잡기와 오류가 발생합니다. 나는 Lukas Knuth가 말한 모든 것에 완전히 동의한다. 그러나 나는 하나의 작은 추가가있다. 어떤 종류의 오류라도 잡을 경우 가능한 범위를 좁혀서 오류를 포착해야합니다. 또한 가능한 경우 오류를 포착하는 메서드가 final로 선언되어 있는지 확인하십시오. 그 이유는 오류 잡기가 대개 매우 불안정한 프로그램으로 이어질 수 있기 때문입니다. 나중에 다른 메서드를 호출하기 위해 확장되는 메서드에서 오류가 발생한다고 생각해보십시오. 이러한 기본 메서드는 모두 위에있는 catch에 의해 (실수로) catch 된 오류를 갖게됩니다.

오류를 잡을 필요가있는 경우, 좁은 통제 된 전장에서하십시오.