zoukankan      html  css  js  c++  java
  • .Net转Java.04.踩到switch的坑

    今天线上有个NullPointerException 的异常,我翻了一下代码,抛异常的竟然是switch语句

    我有种不祥的预感,本地做了实验

    结果是

    Java的switch如果传入null值,会抛出 java.lang.NullPointerException 的异常

    看下面的代码,不要指望会跳到default分支,实际情况是在switch语句就抛异常了。

            // Java代码
            String s = null;
            switch (s) { //因为s=null 所以这里妥妥的会抛异常
                case "a":
                    System.out.println("a");
                    break;
                default:
                    System.out.println("default");
                    break;
            }

    但是C#,程序会跳入到default

                // C#代码
                String s = null;
                switch (s)
                {
                    case "a":
                        Console.WriteLine("a");
                        break;
                    default:
                        Console.WriteLine("default"); // 在C#中这行代码会正常输出
                        break;
                }

    另外总结一下C#和Java的switch的其他区别

    为了防止误操作,C#如果某个case里边有语句,必须也要有break;但是Java没有这个限制,一直遇到break才退出。

    否则会编译错误  Control cannot fall through from one case label ('case "a":') to another

                // C#代码
                switch (s)
                {
                    case "a": // 这个地方编译失败 因为a下面有一个语句 Console.WriteLine("a");
                        Console.WriteLine("a");
                    case "b": // 这个地方可以编译通过,b下面没有语句
                    case "c":
                        Console.WriteLine("b or c");
                        break;
                    default:
                        Console.WriteLine("default");
                        break;
                }

    但是Java编译器没有这个防护措施

            // Java代码
            String s = "a";
            switch (s) {
                case "a":
                    System.out.println("a");
                case "b":
                    System.out.println("b");
                default:
                    System.out.println("default");
            }

    这段代码可以正常执行,返回结果是

    a
    b
    default

    因为缺少break,导致三个case一个没拉下,全部执行了。。

    除非你确实想这样,否则就是个bug了

    Java到1.7switch才支持了String类型,1.6仅仅支持char,byte,short,int,另外枚举类型也是没有问题的

  • 相关阅读:
    修复PLSQL Developer 与 Office 2010的集成导出Excel 功能
    Using svn in CLI with Batch
    mysql 备份数据库 mysqldump
    Red Hat 5.8 CentOS 6.5 共用 输入法
    HP 4411s Install Red Hat Enterprise Linux 5.8) Wireless Driver
    变更RHEL(Red Hat Enterprise Linux 5.8)更新源使之自动更新
    RedHat 5.6 问题简记
    Weblogic 9.2和10.3 改密码 一站完成
    ExtJS Tab里放Grid高度自适应问题,官方Perfect方案。
    文件和目录之utime函数
  • 原文地址:https://www.cnblogs.com/wormday/p/8094590.html
Copyright © 2011-2022 走看看