Java问题:是否可以在另一个语句中包含一个switch语句?

问题描述 投票:0回答:5

我有一个是或否的问题和答案。如果答案是“是”,我想再问一个是或否的问题。我的老师希望我们使用 charAt(0) 作为答案的输入。

是否可以在另一个语句中包含一个 switch 语句(如嵌套的 if 语句)?

编辑:这是我的伪代码示例=

display "Would you like to add a link (y = yes or n = no)? "
input addLink

switch (link)
    case 'y':
        display "Would you like to pay 3 months in advance " + "(y = yes or n = no)?"
        input advancePay

                switch(advPay)
                        case 'y':
                linkCost = 0.10 * (3 * 14.95)

                case 'n'
                linkCost = 14.95            
    case 'n'
        linkCost = 0.00
java switch-statement
5个回答
18
投票

是的,但不要。如果您需要这样的更高级别的逻辑,请将第二个 Switch 放置在其自己的方法中,并使用描述性名称。

编辑:根据您添加的示例,您有两个布尔条件。我建议完全不要使用 switch,而是使用

if
else
条件语句。使用
(STRING.charAt(0) == 'y')
作为测试用例,或者像
boolean isY(final String STRING) { return (STRING.charAt(0) == 'y' || STRING.charAt(0) == 'Y'); }

这样有条理的东西

2
投票

是的。 Switch 打破了语言块语句模式,但这主要是因为 Java 使用的 switch 语句是基于 C/C++ 的。

在所有三种语言中,switch 语句采用以下形式:

switch(variable) {
     case n:
        statement 1;
        statement n;
        (optional) break;
     case n+1:
        statement 1;
        statement n;
        (optional) break;
     // Optionally more statements
     (optional) default:
        statement 1;
        statement n;
}

由于 switch 语句打破了传统的语言模式,因此许多程序员使用传统的块样式将多个语句包装在一个 case 中:{ }

这是因为所有三种语言中的大多数构造都允许将块样式语句视为一个语句,但 switch 语句不需要块样式在单个情况下执行多个语句。

如果没有break语句分隔每个case,就会出现“失败” - 如果case n匹配并且没有break,则它下面的代码(case n + 1)将被执行 - 如果case n + 1没有有break并且匹配,则执行default代码,如果都没有break,匹配case n时,会执行case n、case n+1和default的代码。

default 是可选的,指定 switch 语句执行的默认操作。通常,默认条件要么是通用处理程序,要么是抛出异常的好地方(如果该值在逻辑上不能是 switch 语句中的值之外的任何值)。

为了说明 switch 语句在 switch 语句内执行,请看一下这个人为的示例:

String message = null;
int outerVariable = getOuterVariable();
switch(outerVariable) {
     case n:
        statement 1;
        statement n;
        break;
     case n+1:
        int innerVariable = getInnerVariable();
        switch(innerVariable) {
            case 1:
                message = "IT WAS 1";
                break;
            default:
                message = "WHY WOULD YOU DO THIS?  OH THE HUMANITY!";
        }
        break;
     // Optionally more statements
     (optional) default:
        statement 1;
        statement n;
}

1
投票

这是可能的,但这会非常复杂且难以阅读。几乎肯定有更好的方法,例如在第一个 switch 语句中调用一个方法,并在该方法中进行任何更多必要的处理(如果需要,包括另一个 switch)。


0
投票

自 Java 14+ 起,人们可能希望受益于

yield
嵌套开关表达式的功能,例如:

switch (num) {
  case 1, 2 -> "one or two";
  case 3 -> {
    switch (character) {
       case 'a': {
          yield "3 and a"
       }
       case 'b': {
          yield "3 and b"
       }    
    }
  }
}

-1
投票

大多数编程语言都是正交的。这意味着,如果有意义的话,使用某个功能通常不依赖于位置。

例如,您不能将局部变量声明为 public。

© www.soinside.com 2019 - 2024. All rights reserved.