• .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,另外枚举类型也是没有问题的

  • 相关阅读:
    Lc617_合并二叉树
    Lc257_二叉树的所有路径
    Lc222_完全二叉树的节点个数
    记github下载上传遇到的各种问题
    Lc101_对称二叉树
    Lc222_翻转二叉树
    二叉树的dfs 与 bfs (递归遍历)
    全球最火的程序员学习路线!没有之一!3天就在Github收获了接近1w点赞
    大二逃课总结的1.2w字的计算机网络知识!扫盲!
    「IDEA插件精选」安利一个IDEA骚操作:一键生成方法的序列图
  • 原文地址:https://www.cnblogs.com/wormday/p/8094590.html
Copyright © 2020-2023  润新知