2013-05-16 9 views
4

break 키워드를 사용하지 않고 switch 문을 종료 할 때도 사용할 수 있습니까? 왜 쉬는 대신 던지기를 사용합니까?switch 문에서 break 대신 사용할 수 있습니까?

switch(number) 
{ 
    case 1: 
     throw new RuntimeException("Exception number 1"); 
    case 2:  
     throw new RuntimeException("Exception number 2"); 
} 
+12

하지 않아야합니다. 흐름을 제어하는 ​​데 예외를 사용해서는 안됩니다. 예외에 예외를 사용하십시오. 스위치 내부에서 예외가 발생하면 괜찮습니다. – NilsH

+5

당신이 입력 한 문자 수만큼 돈을 받고 있기 때문에 –

+0

switch 문 안에 던질 수있는 적당한 장소는 기본 경우입니다. 이 경우에 도달하면 유효하지 않은 입력을 나타내는 경우 예외가 발생합니다. – Aurand

답변

1

당신은 switch 블록하지만 좋지 않은 코딩/디자인 연습에 throw를 사용할 수 있습니다. throw은 명령의 실행을 제어하지 않는 코드의 예외/오류 상황을 제어하기위한 것입니다.

throwswitch에 사용할 수 있지만 switch에는 사용하지 않는 것이 좋습니다. :)

0

예외를 던질 필요가있는 시나리오는 하나뿐입니다. 스위치는 케이스를 돌리고 깨뜨릴 수 있도록 설계되었습니다. 메서드에 있고 throw를 사용하는 경우 메서드에서 값을 반환하는 방법은 무엇입니까? 간단히 말해서 throw는 메서드를 반환하지만 break는 반환하지 않습니다. 당신은 코드가 중단 된 후에도 계속 실행될 수 있습니다. 당신이 스위치의 흐름을 방해하는 throw를 사용할 수있는 두 가지 경우가 있습니다

9

:

  1. 흐름 제어가; 일반적으로 이것은 입니다. 연습 - 프로그램에서 다음으로 가기로 결정한 예외적 인 동작을 원하지 않습니다.

  2. 가능성은 낮지 만 그럴듯한 기본 사례; 어떤 경우에는 기본값 에 도달해야이되어야하지만 어쨌든 발생합니다. 어쩐지. 기적적으로. 또는 엄격한 코딩 표준이있는 경우 스위치 문에 기본 사례가 있어야합니다.

    예 : 당신이 예외를 던질 때

    public class Test { 
        public static enum Example { 
         FIRST_CASE, 
         SECOND_CASE; 
        } 
        public void printSwitch(Example theExampleCase) { 
         switch(theExampleCase) { 
          case FIRST_CASE: 
           System.out.println("First"); 
           break; 
          case SECOND_CASE: 
           System.out.println("Second"); 
           break; 
          default: // should be unreachable! 
           throw new IllegalStateException(
         "Server responded with 724 - This line should be unreachable"); 
        } 
    } 
    
0

휴식은 다음의 경우에를 통해 떨어지는 것을 방지하는 데 사용됩니다, 그것은 일반적으로 의미가 더는

case 1: 
     throw new UnsupportedOperationException(); 
     break; <-- compile error, unreachable code 

통해 떨어지는 없을 것 그렇지 않다면 절을 던져야한다.

switch (op) { 
    case 1: 
     // do something 
     break; 
    ... 
    default: 
     throw new UnsupportedOperationException(); 
    } 
0

break 대신 throw를 사용하는 데는 몇 가지 문제가 있습니다.

1) 일부 예외를 throw하면 나머지 함수 실행이 중단됩니다.

예 :

int m=0; 
    switch (m) { 
    case 0: 
     y=10; 
     break; 
    case 2: 
     y=11; 
     break; 
    default: 
     break; 
    } 
    System.out.println(y);//this y will never be printed if Exceptions are thrown 

2) 예외는 일반적으로 약간의 오류 상태를 나타내며, 예외를 생성해야하지 때마다 전환합니다.

3)는 라이트 catch 블록에있는 전자를 호출

throw new RuntimeException("Exception number 1"); 

에서 값이 "예외 번호 1"을 얻으려면.getMessage();

처럼 :

catch(RuntimeException e){ 
     String str=e.getMessage(); 
    } 

이 더욱 오버 헤드 또한 전달할 수있는 데이터는 문자열 개체입니다.

결론 : - 정상적인 휴식 시간을 사용하는 것이 더 좋습니다.

1

switch 문을 던지는 데는 몇 가지 이유가 있습니다.

1 일 : 휴식 대신에 default 사례의 본문으로.

pubic enum E { 
    A, 
    B 
} 

처음처럼 보이는 기록으로 당시의 스위치 :

E e = ...; 
switch (e) { 
    case A: 
    ... 
    break; 
    case B: 
    ... 
    break; 
    default: 
    throw new IllegalStateException("Unknown enumeration value " + e); 
} 

던져는 향후 확장을위한 대체하는 스위치가 열거에 정의 된 다음의 예를 고려 열거 형 E.

두 번째 : 때로는 스윙 테이블 모델과 같이 작은 게터 기능이있는 곳이 있습니다. 내가 대신 휴식 시간을 사용합니다.

public String getColumnName(int col) 
{ 
    switch (col) 
    { 
    case 0: return "Column 0"; 
    case 1: return "Column 1"; 
    ... 

이것은 간략 함 또는 압축을위한 것입니다. 이러한 수익률로 인해 통제 흐름이 깨지기도합니다. 이것은 사실입니다. 그러나, 나는 그것이 compactness 이유를 위해 그것이 여기에서 허락 될지도 모른다라고 생각한다.

이 경우 break 대신 return을 수락하면 여기 throw을 수락 할 수 있습니다.

+0

나는 이것에 동의하는 경향이있다. 스위치 "case"섹션에서 가능한 모든 케이스를 다루는 경우, "default"섹션에서 예외를 던지면 들어오는 매개 변수가 잘못되었음을 먼저 나타내야하고, 두 번째는 스위치 구성의 향후 확장을 막기 위해 왜 예외를 던지십시오. – GeertVc

-1

throw switch 문에서 break 대신 사용할 수 없습니다. 스위치가 조건부 목적으로 사용되는 동안 throw가 예외로 사용되기 때문에 ...

+0

'switch'에서'return' 또는'break'와 함께'throw'를 사용할 수 있습니다. 왜냐하면 세 개의 명령 모두가 갑자기 완료되기 때문에 (즉, 현재 실행중인 메소드가 아닌 다른 곳으로 제어권을 되돌려 놓기 때문입니다). – Makoto

관련 문제