생성자가 Java에서 예외를 발생시킬 수 있습니까?
생성자가 예외를 던질 수 있습니까?
예, 생성자는 예외를 던질 수 있습니다. 일반적으로 이것은 새 객체가 가비지 수집에 즉시 적합하다는 것을 의미합니다 (물론 한동안 수집되지 않을 수도 있음). "반으로 구성된"객체가 생성자에서 미리 볼 수 있다면 (예를 들어 정적 필드를 할당하거나 컬렉션에 자신을 추가하여) 고정시킬 수 있습니다.
생성자에서 예외를 던질 때주의해야 할 한 가지 : 호출자가 (일반적으로) 새 객체를 사용할 방법이 없기 때문에 생성자는 관리되지 않는 리소스 (파일 핸들 등)를 획득 한 다음 예외를 발생시키지 않도록주의해야합니다. 그들을 풀어주지 않고. 예를 들어, 생성자가 a FileInputStream
및 a 를 열려고 시도 FileOutputStream
하고 첫 번째는 성공하지만 두 번째는 실패하면 첫 번째 스트림을 닫으려고합니다. 물론 예외를 던지는 하위 클래스 생성자라면 더 어려워집니다. 물론 조금 까다로워집니다. 자주 문제는 아니지만 고려해 볼 가치가 있습니다.
예, 그들은 예외를 던질 수 있습니다. 그렇다면 부분적으로 만 초기화되고 최종이 아닌 경우 공격을받습니다.
다음은 보안 코딩 지침 2.0 에서 가져온 것 입니다.
최종 클래스가 아닌 클래스의 부분적으로 초기화 된 인스턴스는 종료 자 공격을 통해 액세스 할 수 있습니다. 공격자는 하위 클래스에서 protected finalize 메서드를 재정의하고 해당 하위 클래스의 새 인스턴스를 만들려고 시도합니다. 이 시도는 실패하지만 (위의 예에서는 ClassLoader 생성자의 SecurityManager 검사에서 보안 예외가 발생 함) 공격자는 예외를 무시하고 가상 머신이 부분적으로 초기화 된 객체에서 종료를 수행 할 때까지 기다립니다. 이런 일이 발생하면 악의적 인 finalize 메소드 구현이 호출되어 공격자에게 이에 대한 액세스 권한이 부여됩니다. 개체가 부분적으로 만 초기화되었지만 공격자는 여전히 개체에 대해 메서드를 호출 할 수 있습니다 (따라서 SecurityManager 검사를 우회).
물론.
생성자가 유효한 입력을받지 못하거나 유효한 방식으로 객체를 생성 할 수없는 경우 예외를 발생시키고 호출자에게 경고하는 것 외에 다른 옵션이 없습니다.
예, 예외가 발생할 수 있으며 아래 예제와 같이 생성자의 서명에서도 선언 할 수 있습니다.
public class ConstructorTest
{
public ConstructorTest() throws InterruptedException
{
System.out.println("Preparing object....");
Thread.sleep(1000);
System.out.println("Object ready");
}
public static void main(String ... args)
{
try
{
ConstructorTest test = new ConstructorTest();
}
catch (InterruptedException e)
{
System.out.println("Got interrupted...");
}
}
}
예, 생성자는 예외를 던질 수 있습니다.
그러나 예외를 확인하거나 선택하지 않은 예외를 선택하는 것이 매우 현명합니다. 점검되지 않은 예외는 기본적으로 RuntimeException의 서브 클래스입니다.
거의 모든 경우 (이 경우에는 예외를 낼 수 없었습니다), 확인 된 예외를 던져야합니다. 확인되지 않은 예외 (예 : NullPointerException)는 일반적으로 프로그래밍 오류 (입력의 유효성을 충분히 검사하지 않는 등)로 인해 발생합니다.
확인 된 예외가 제공하는 장점은 프로그래머가 인스턴스화 코드에서 예외를 잡아야하므로 객체 인스턴스를 만들지 못할 수 있다는 점입니다. 물론 코드 검토만으로는 예외를 삼키는 열악한 프로그래밍 방식을 포착 할 수 있습니다.
예.
생성자는 특별한 메소드에 지나지 않으며 다른 메소드와 마찬가지로 예외를 발생시킬 수 있습니다.
예, 다른 방법과 마찬가지로 예외를 던질 수 있습니다
참고 URL : https://stackoverflow.com/questions/1371369/can-constructors-throw-exceptions-in-java
'Programing' 카테고리의 다른 글
CSS : before / : after pseudo-elements에서 이미지의 높이를 변경할 수 있습니까? (0) | 2020.04.21 |
---|---|
배경색을 기준으로 글꼴 색 결정 (0) | 2020.04.21 |
데몬 스레드 설명 (0) | 2020.04.21 |
Rails에서 상대 시간은 어떻게합니까? (0) | 2020.04.21 |
SSL 핸드 셰이크 경고 : Java 1.7.0으로 업그레이드 한 후 unrecognized_name 오류 (0) | 2020.04.21 |