【问题标题】:question mark colon switch case问号冒号开关盒
【发布时间】:2014-05-14 13:58:57
【问题描述】:
public Boolean prendiTessera(TipoTerreno tipo) {
    
    switch(tipo){
    
    case PIANURA: tesserePianura != 4 ? tesserePianura++ : return false;

    case CAMPAGNA: tessereCampagna != 4 ? tessereCampagna++ : return false;
    
    case MONTAGNA: tessereMontagna != 4 ? tessereMontagna++ : return false;
    
    case DESERTO: tessereDeserto != 4 ? tessereDeserto++ : return false;
    
    case FIUME: tessereFiume != 4 ? tessereFiume++ : return false;
    
    case BOSCO: tessereBosco != 4 ? tessereBosco++ : return false;
    
    default: return false;  
    }
    
    return true;
    
}

Eclipse 报告以下错误(针对每一行):

令牌“!=”的语法错误,无效的AssignmentOperator

令牌“return”的语法错误,删除此令牌

类型不匹配:无法从 boolean 转换为 int

变量:

private int tesserePianura;

private int tessereCampagna;

private int tessereMontagna;

private int tessereDeserto;

private int tessereFiume;

private int tessereBosco;

枚举类:

public enum TipoTerreno {

/** terreno pianura. */
PIANURA,

/** terreno campagna. */
CAMPAGNA,

/** terreno montagna. */
MONTAGNA,

/** terreno deserto. */
DESERTO,

/** terreno fiume. */
FIUME,

/** terreno bosco. */
BOSCO,

/** terreno Sheepsburg. */
SHEEPSBURG;
        
}

【问题讨论】:

  • ternary operator 不是一个语句(如 if/else),而是一个表达式。
  • @GriffeyDog,问题不在于三元运算符。表达式,如果它出现在预期语句的位置。问题是“回归”。 'return' 是一个语句,但它出现在需要表达式的地方(即,作为三元组的第三个参数。
  • @jameslarge 表达式的计算结果为一个值。你是对的,return 是问题所在,因为它本身 is 是一个语句并且不会评估为三元运算符最后一部分所必需的值。

标签: java switch-statement conditional-operator


【解决方案1】:

把你的代码改成这个,你的问题就解决了

public Boolean prendiTessera(TipoTerreno tipo) {
    boolean flag=true;
    switch (tipo) {

        case PIANURA: flag=tesserePianura != 4 ? true :false; break;

        case CAMPAGNA: flag=tessereCampagna != 4 ? true : false;break;

        case MONTAGNA: flag=tessereMontagna != 4 ? true : false;break;

        case DESERTO: flag=tessereDeserto != 4 ? true : false;break;

        case FIUME: flag=tessereFiume != 4 ? true : false;break;

        case BOSCO: flag=tessereBosco != 4 ? true : false;break;

        default: flag=false;  
    }
    if (flag)
        tessereMontagna++;
    return flag;
}

问题描述:

tesserePianura != 4 ? tesserePianura++ : return false;

你的这一行不是一个完整的陈述,这就是你得到错误的原因。 而你的 else 部分/最后一部分是一个完整的语句,不能出现在表达式中(即三元运算符)。

此外,三元运算符旨在产生一些结果,这些结果将被分配给直接间接的某个变量。

让我给你解释一下 直接分配

flag=tessereBosco != 4 ? true : false;

在这种情况下,值直接分配给变量flag

间接分配

System.out.println(tessereBosco != 4 ? true : false);

在这种情况下,将分配给函数的(即println())变量。

【讨论】:

  • 这可能会编译,但 OP 显然也希望在第一种情况下产生副作用,例如 tesserePianura++
  • 我没有看到 OP 询问此副作用?当然那是我的错误,你介意指点我吗@GriffeyDog
  • 第一个case,例如:case PIANURA: tesserePianura != 4 ? tesserePianura++ : return false;
【解决方案2】:

这是使用三元运算符纠正该问题的最简单方法

public Boolean prendiTessera(TipoTerreno tipo) {
    int test;

    switch(tipo){

        case PIANURA: test= ( tesserePianura != 4) ? tesserePianura++ : 0; break;

        case CAMPAGNA: test=( tessereCampagna != 4) ? tessereCampagna++ : 0;break;

        case MONTAGNA: test=  (tessereMontagna != 4) ? tessereMontagna++ : 0;break;

        case DESERTO: test= (tessereDeserto != 4) ? tessereDeserto++ :0;break;

        case FIUME: test= (tessereFiume != 4) ? tessereFiume++ : 0;break;

        case BOSCO:test=  (tessereBosco != 4) ? tessereBosco++ :0;break;

        default: test=0;  
    }

    return (test==1);

}

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 2021-10-21
    • 2010-12-18
    • 1970-01-01
    • 2016-11-04
    • 2019-12-23
    • 2019-09-14
    • 2012-09-25
    相关资源
    最近更新 更多