2014-04-09 4 views
1

을 던지는 소개 나는 예외에 새로 온 사람이 내가 지금까지 알고있는 것입니다 :는 IllegalArgumentException

  • 가 던져 던져

  • 내가 아마 추가해야 ', IllegalArgumentException를 던져'하고 다른

  • IllegalArgument 예외가 체크되지 않은 예외 "그 처리

  • 컴파일 시간 동안 확인되지 않은 예외의 메소드 서명 ', IllegalArgumentException를 발생'

출처 : http://javarevisited.blogspot.com/2011/12/checked-vs-unchecked-exception-in-java.html#ixzz2yM5jNFeg, 이것은 숙제 질문은 http://www.tutorialspoint.com/java/java_exceptions.htm

는 : IllegalArgumentException가이 프로그램을 즉시 종료 할 던지는 무엇입니까?

질문이 약간 일반적이고 틀릴 가능성이 있지만, IllegalArgumentException에 대해서도 완전히 명확하지 않습니다. 소식통은 간단한 방법으로 '던지기'를 실제로 예시하지 않았으므로 여전히 혼란 스럽습니다. 이것에 간단한 설명이있을 수 있다면 좋을 것입니다.

+0

특정 입력이 필요한 메소드를 호출했지만 순종하지 않으면 IllegalArgumentException이 발생합니다. 예외가 발견되지 않으면 프로그램이 종료됩니다. 그것이 콜 스택 위로 누군가에 의해 잡히면, 그것을 처리하는 방법에 대한 포수의 몫입니다. 따라서 호출이 예상되면 IllegalArgumentException이 발생하여 두 가지 방법으로 처리 할 수 ​​있습니다. 1) 전화를하기 전에 변수를 확인하여 변수가 양호한 지 확인하십시오. 2) try 블록을 사용하여 호출을 포위하고 IllegalArgumentException을 catch하고 발생하면 적절한 작업을 수행하십시오. –

+0

두 가지 유형의 예외가 있습니다. "확인 된 예외"및 "런타임 예외". 메서드가 확인 된 예외를 throw하는 경우에만 메서드 시그니처에'throws' 절을 선언하면됩니다. 런타임 예외 (즉, IllegalArgumentException)의 경우, 메소드 서명에 throws 절을 선언 할 필요가 없습니다. 예외를 던지더라도 프로그램이 즉시 종료되지는 않습니다. 그것을 잡아 예외를 처리 할 수 ​​있습니다. – anonymous

+0

@stvcisco 그냥 'try IllegalArgumentException'을 호출하고 try-catch 블록을 수행하지 않는다고 가정합니다. 그것은 현재 방법을 종료합니까? 아니면 전체 프로그램? 내 생각 엔 그렇지 않니? – user3511965

답변

2

현재 방법 즉시 종료 아니라 전체 프로그램을 만든다. 게다가 예외는 호출하는 메소드에서 던져진 채 계속 될 것이다. 이를 전파라고합니다. 이 시점에서 계속 진행되는지 여부는 호출 메소드가 예외를 포착하는지 여부에 따라 달라집니다. 아무 것도 예외를 잡아 내지 않으면 main 메쏘드 (이것은 단순한 단일 쓰레드 애플리케이션을 가정하고있다.)로 다시 전파 될 것이고, 그 메쏘드가 던져도 이면 프로그램이 종료 될 것이다.

void callee() { 
    if (someTrueCondition()) { 
     throw new IllegalArgumentException("whatever"); 
    } 
    System.out.println("this will never get called"); 
} 

void caller() { 
    calle(); // the IllegalArgumentException propagates from here 
    System.out.println("this will also never get called"); 
} 

어떤 예외 사실이다. IllegalArgumentException이 다른 것과 다른 점은 체크되지 않았기 때문에 던질 수있는 메서드의 throws 절에서 선언 할 필요가 없다는 것입니다. 귀하의 질문에 당신은 아마도 throws IllegalArgumentException을 신고해야한다고 말했지만, 검사되지 않은 예외이기 때문에 실제로 그렇지 않습니다.)

확인 된 예외 (예 : throw new SQLException())를 던지려면 calleecaller 모두 예외를 선언해야합니다. callee은 예외를 직접 throw하므로이를 선언해야하며 caller은 전파를 통해 간접적으로 예외를 throw 할 수 있으므로 callee에서 선언해야합니다.

이 전파를 중지하는 유일한 방법은 (런타임시 예외 사항과 컴파일시 throws 절 모두) 주어진 예외를 try-catch으로 catch하는 것입니다.

+0

경우에만 주요 기능이 있고 우리는 진술을 호출? 프로그램이 종료 되겠습니까? – user3511965

+0

예; 'main'이 예외를 던지면 프로그램은 멈 춥니 다 (다시 한번, 단일 쓰레드 응용 프로그램을 가정 할 때). – yshavit

+0

중단은 정지와 동일합니까? 그리고 그것이 프로그램을 즉시 종료하게하는지에 대한 질문이 너무 광범위하고 일반적이라고 생각합니까? – user3511965

1

잡히지 않은 예외 단일 스레드 응용 프로그램을 종료합니다. 아래에있는 foo/bar 예제를 자바 애플리케이션에 드롭했다면 캐치되지 않은 예외로 인해 실행 상태가 종료됨을 알 수 있습니다.

차이

/** 
* This is my foo method 
* @throws IllegalArgumentException if argument is wrong! 
*/ 
public void foo(String s) throws IllegalArgumentException { 
    // Some code 
    if (!s.equals("bar")) { 
     throw IllegalArgumentException("something not quite right here..."); 
    } 
} 

던져 & 발생 사이에 당신은 거의있다 - @throws는 방법 던져 가능한 예외를 나타 내기 위해 메소드 서명에 주석뿐만 아니라 사용 설명서를 목적으로합니다. 여기에는 직접 또는 간접적으로 발생하는 예외도 포함됩니다. 동일한 사물이나 다른 사물/클래스에서 사용하는 모든 방법에서 던져 질 수있는 사슬이나 걸리지 않는 사슬을 추가하는 것이 좋습니다.

구현 코드는 Throw입니다. IllegalArgumentException는 일반적으로 런타임에 인자의 잘못된 클래스 유형을 메소드에 보내려고 할 때 발생합니다. 위에서 설명한 것처럼 수표가 실패 할 때마다 수작업으로 던져 넣을 수도 있습니다.

또한 메서드 시그니처에서 선언 할 필요는 없지만 선언 할 경우 구현 코드는 try/catch 블록에 래핑해야합니다.

간접 예외의 예 : 어떤 예외를 발생

class foo { 
    /** 
    * @throws IllegalArgumentException when s != foo 
    */ 
    public void foo(String s) throws IllegalArgumentException { 
     if (!s.equals("foo")) { 
      throws IllegalArgumentException("argument did not equal 'foo'"); 
     } 
    } 
} 

class bar { 
    protected foo foo; 
    public bar() { 
     this.foo = new foo(); 
    } 

    public void bar(String s) throws IllegalArgumentException { 
     this.foo.foo(s); 
    } 
} 
+1

OP가 문서화를 위해'@ throws '에 관해 묻고 있다고 생각하지 않습니다. 메소드 시그니처에'throws' 절이 필요한 시나리오는 메소드가'checked exception'을 throw 할 때입니다. throws 절없이 새로운 IOException ("")'을 던져보십시오. 그러면 문제가 나타날 것입니다. – anonymous

+0

별로 사양을 던지지 말고 주석이 아닙니다. – djechlin

+0

내 잘못, 그 대답에 따라 수정 된 –

관련 문제