当前位置: 首页 > 知识库问答 >
问题:

为什么java switch语句不能处理null,因为它有一个“default”子句?[重复]

漆雕升
2023-03-14

为什么java开关语句不能处理null,因为它有一个“默认”子句?

例如,如果你有类似的东西

   switch(value){
     case VAL1: do_something1(); break;
     case VAL2: do_something2(); break;
     default: do_something3(); 
   }

“default”不应该处理任何其他值,比如null吗?

共有3个答案

鄂育
2023-03-14

不能对字符串和其他可以为null的数据类型进行切换。这种行为在Java7中已经改变,允许字符串切换。

有关更多信息,请参阅此问题:

为什么我不能打开一根绳子?

黄锋
2023-03-14

总之,这种设计选择是本着Java的精神。

当switch表达式的计算结果为null时抛出NPE的决定与Java中的其他决定类似,Java总是喜欢抛出异常,而不是以“明显”的方式静默处理null。一般规则似乎是,当有疑问时,Java设计师会选择产生更多样板代码的选项。

有些人会说这是令人沮丧和不幸的(包括我自己),而其他人会在宗教上不同意,坚持认为这是一个“更安全”的决定。

对于另一个令人沮丧的示例,请参阅enched for循环,如果集合为null,它也会抛出一个NPE,而不是好像集合为空。JDK库中还有更多示例,调用者必须勤奋地检查所有边缘情况,以便允许将它们与“正常”情况统一处理。

作为第三个臭名昭著的例子,只需看看检查异常的“语言特性”对代码造成的混乱。

苍兴怀
2023-03-14

和往常一样,它在JLS中:

以下所有条件都必须为真,否则会发生编译时错误:

  • 没有开关标签是空的

...
禁止使用null作为开关标签,防止人们编写永远无法执行的代码。如果开关表达式是引用类型,即String或盒装基元类型或枚举类型,那么如果表达式在运行时的计算结果为null,则会发生运行时错误。在Java编程语言的设计者的判断中,这是比默默跳过整个开关语句或选择在默认标签(如果有)之后执行语句(如果有)更好的结果。

 类似资料:
  • 问题内容: 为什么在DEFAULT或ON UPDATE子句中只能有一个带有CURRENT_TIMESTAMP的TIMESTAMP列? 导致的错误: 错误代码:1293 表定义不正确;DEFAULT或ON UPDATE子句中只能有一个带有CURRENT_TIMESTAMP的TIMESTAMP列 问题答案: 仅由于历史,代码遗留原因,此限制在MySQL的最新版本中已解除: MySQL 5.6.5的更改

  • 在我的应用程序(这是一个Android游戏)中,我有一个方法可以检查玩家是否还活着,如果没有,运行一个动画,游戏就结束了。 根据玩家的输球方式,目前有3种不同的动画可用。 例如,它们可能从屏幕上掉下来,撞到一只鸟,或者被从天上掉下来的东西压扁。每一个都有不同的动画。 基本上,我正在做的是: 当玩家输球时,我设置了它发生的方法,例如,如果他们被鸟击中: 然后我通过在我的check Gameover(

  • 我正在编写一个简单的游戏,在其中我使用一个枚举,CommandManager,来存储关于可能的命令以及每个命令的作用的信息。此枚举的主要目的是能够打印出可用命令的菜单,以及用于检查输入并执行与该输入相关的操作。我的问题在于第二次使用,我使用switch语句根据用户的输入确定用户想要做什么。当尝试使用枚举的属性(通过getter方法)作为案例标签时,我遇到了一个编译错误。提供的错误消息是,大小写表达

  • 只是一个普通的Java问题。为什么null变量存在?我正在给CS学生做一些介绍,其中一个最常见的错误是分号,他们不应该在分号上。例如 圆括号前面的分号放错了位置,使if语句无法正常工作,我想知道为什么空行在Java程序中会这样做。在这个例子中,null似乎是一个不利因素,并且想知道什么时候有人会在编码时使用它。

  • 我已经写了一个准备好的语句,但它给出了一个语法错误?。我不明白出了什么问题。它应该传递一个电影名称,并作为该电影的导演获得结果

  • 问题内容: 我惊讶地发现Go带有“ goto”语句。我一直被教导说,“ goto”语句已经成为过去,并且因为它阻塞了程序的实际流程,所以它变得邪恶,而函数或方法始终是控制流程的更好方法。 我肯定错过了什么。Google为什么要包含它? 问题答案: 当我们实际检查Go标准库的源代码时,我们可以看到s在哪些地方得到了很好的应用。 例如,在文件中,使用以下语句: 在从导入只是控制流使用的另一(布尔值)的