结合assert和switch语句

时间:2014-10-18 13:56:29

标签: java switch-statement assert

我正在回答Java测试并遇到问题:

  

以下哪项陈述属实?

     

一个。在断言语句中,冒号(:)之后的表达式可以   是任何Java表达式。

     

B中。如果开关块没有默认值,则认为添加断言默认值是合适的。

     

℃。在断言语句中,如果冒号(:)之后的表达式没有   值,assert的错误消息将为空。

     

d。使用catch子句处理断言失败是合适的。

正确的答案是B。说实话,我通过排除另一个明显错误的案例回答了这个问题,但实际上我无法理解这个问题。谁能解释为什么这是真的?它在哪里可以提供帮助?

3 个答案:

答案 0 :(得分:9)

我想这意味着你应该保护自己不要错过开关盒。

假设您在代码中有enum Color {red, green}和此开关:

switch(color) {
   case red: 
       doSomethingRed();
       break;
   case green: 
       doSomethingGreen();
       break;
}   

如果将来添加新颜色blue,您可能会忘记在交换机中添加一个案例。 将失败的断言添加到默认情况下将抛出AssertionError,您将发现错误。

switch(color) {
   case red: 
       doSomethingRed();
       break;
   case green: 
       doSomethingGreen();
       break;
   default: 
       assert false : "Oops! Unknown color"
}   

答案 1 :(得分:4)

这取决于案例,但取决于我看待它的方式

// Consider expecting only 1,2 or 3 as switch case
switch(x) 
{  
    case 1:
        // operations 
        break;  
    case 2:
        // operations 
        break;  
    case 3:
        // operations 
        break;  
    default: assert false : "Input should be between 1-3";  
}  

可能很方便,因为您可能收到的任何其他输入都可能被视为错误的输入。

答案 2 :(得分:2)

在切换块的默认值中使用assert false适用于公共方法上下文,例如

public void methA(int x) throws Exception {

if(x!=1 && x!=2 && x!=3) 
    throw new IllegalArgumentException("from Exception: x should be between 1,2 and 3");

switch(x) 
{  
    case 1: doSomething(); break;  
    case 2: doSomething(); break;  
    case 3: doSomething(); break;  
    default: assert false : "from default: x should be between 1,2 and 3";  
} 
}

如果在公共方法中使用了switch块,那么检查参数x的值已经在switch语句之前由异常处理。

因此,即使您在默认情况下使用assert false,也永远无法访问该代码,因为假设x为1,2或3始终为真。如果不是,则在交换机默认之前已由IllegalArgumentException处理。所以基本上,永远不会达到switch-default的假设总是如此。因此,它适用于公共方法。