java switch null_为什么String switch语句不支持null case?

问题

我只是想知道为什么Java 7switch语句不支持anullcase而是throwsNullPointerException?请参阅下面的注释行(示例摘自Java Tutorials文章switch):

{

String month = null;

switch (month) {

case "january":

monthNumber = 1;

break;

case "february":

monthNumber = 2;

break;

case "march":

monthNumber = 3;

break;

//case null:

default:

monthNumber = 0;

break;

}

return monthNumber;

}

这样可以避免在每个switchuse之前进行空检查的if条件。

#1 热门回答(130 赞)

正如damryfbfnetsipoints out中的评论,JLS §14.11有以下注释:

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

(强调我的)

虽然最后一句话略过了使用case null:的可能性,但这似乎是合理的,并提供了语言设计者的意图。

如果我们更倾向于查看实现细节,那么this blog post作者Christian Hujer对于为什么不允许在交换机中使用null有一些深刻的猜测(尽管它以enum开关而不是String开关为中心):

在引擎盖下,switch语句通常会编译为tablesswitch字节代码。转换的"物理"参数及其案例都是整数。要打开的int值是通过调用方法Enum.ordinal()来确定的。 [...]序数从零开始。这意味着,将null映射到0不是一个好主意。第一个枚举值的开关将与null无法区分。也许以1开始计算枚举的序数是个好主意。然而,它没有被定义为这样,并且这个定义不能改变。

在Stringswitchesare implemented differently中,enumswitch排在第一位,并为引用类型36656103时引用类型的开启行为设置了先例。

#2 热门回答(23 赞)

它不漂亮,但是String.valueOf()允许你在交换机中使用空字符串。如果找到null,则将其转换为488281515,否则它只返回你传递的相同String。如果你没有明确地处理"null",那么它将转到default。唯一需要注意的是,没有办法区分String"null"和一个实际的null变量。

String month = null;

switch (String.valueOf(month)) {

case "january":

monthNumber = 1;

break;

case "february":

monthNumber = 2;

break;

case "march":

monthNumber = 3;

break;

case "null":

monthNumber = -1;

break;

default:

monthNumber = 0;

break;

}

return monthNumber;

#3 热门回答(22 赞)

一般null令人讨厌处理;也许更好的语言可以没有null。

你的问题可能会被解决

switch(month==null?"":month)

{

...

//case "":

default:

monthNumber = 0;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Javaswitch case语句是一种常用的控制流语句,用于基于不同的输入值执行不同的操作。它由switch关键字、一个括号和一个或多个case语句组成。在Java中,switch case语句的用法如下所示: switch(expression){ case value1: // 执行语句1 break; case value2: // 执行语句2 break; // 可以有任意数量的case语句 default: // 执行默认语句 } 在上面的代码中,expression表示要测试的表达式的值。每个case语句后面跟着一个值(value),如果expression的值与某个case语句的值相等,则执行相应的语句。如果没有匹配的case语句,那么执行default语句。 例如,在下面的示例中,根据num的值执行不同的操作: public class SwitchDemo { public static void main(String[] args) { int num = 3; switch (num) { case 1: System.out.println("One"); break; case 2: System.out.println("Two"); break; case 3: System.out.println("Three"); break; default: System.out.println("Not found"); } } } 在这个示例中,num的值为3,因此会执行case 3下的语句,输出"Three"。如果num的值为1,则会执行case 1下的语句,输出"One"。如果num的值没有与任何case语句匹配,那么会执行default语句,输出"Not found"。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Java switch case 语句](https://blog.csdn.net/weixin_47477471/article/details/129334643)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Java--switch case 语句](https://blog.csdn.net/weixin_44688529/article/details/128626327)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值