王垠 一道 Java 面试题

  • f
    flowerszhong

    http://www.yinwang.org/blog-cn/2020/02/13/java-type-system

    关于程序员对 Java 类型系统的理解,比较高级的一个面试问题是这样:

    public static void f() { String[] a = new String[2]; Object[] b = a; a[0] = "hi"; b[1] = Integer.valueOf(42);}



    Hi_200217_0043.png




    这段代码里面到底哪一行错了?为什么?

    如果某个 Java 版本能顺利运行这段代码,那么如何让这个错误暴露得更致命一些?




    注意这里所谓的「错了」是本质上,原理上的,而不一定是 Java 编译器,IDE 或者运行时报给你的。

    也就是说,你用的 Java 实现,IDE 都可能是错的,没找对真正错误的地方,或者没告诉你真正的原因。





    如果你知道哪里错了,并且知道「为什么」错了,可以联系我。

  • j
    jn13lh
    联系他能得到啥。。。。
    跟他一起绝世而独立吗。?
  • k
    kkzxak47
    他自己变成自己敌人了
  • k
    kurt_yan
    第二行错了 Object[]与String[]是不同的类型 其实例不能互相赋值 iOS fly ~
  • f
    flowerszhong
    回复4#kurt_yan请联系垠神
  • 某雷
    估计是招人了
  • l
    lovedzc
    奖励5.12美元,必须比高德纳要多一倍奖金。
  • j
    jn13lh
    回复4#kurt_yan

    不懂编程。只从逻辑上看的话。我感觉第五行更奇怪一点。。。倒不是说正整数赋值给数组中的一个有啥问题。而是。。。b到底是个啥。这样赋值结果会是啥。

    不过我都不懂编程了。在这说啥呢。。。
  • 郭德纲
    有答案了吗?
  • s
    sonybp
    最后一行错了。在Object[] b = a;的时候,b已经成为String[]实例了。则在最后一行不能接受Integer类型。
  • z
    zjy1993
    作为一个大学自学过 谭浩强C语言 的半吊子爱好者,我要说,这段代码应该应该是直接被编译器优化掉了,什么错都不会报的吧?
  • H
    Haisea
    我试了,编译可以通过, 运行时调用f()会出错
    Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer
    Java的运行时异常
  • 寒冰炫
    Integer前加一个String.valueOf(或者""+可破
  • s
    songco
    最后一行类型错误.

    这个问题就不好回答了: 如果某个 Java 版本能顺利运行这段代码,那么如何让这个错误暴露得更致命一些?
    这问题描述很奇怪
  • j
    jckimi
    回复11#zjy1993


    Java编译器,好像没这个功能吧?
  • s
    songco
    不过按他问题的意思应该是 Object[] b = a; 就错了

    可能真要去hw
  • z
    zjy1993
    回复16#jckimi


    不懂java,见笑见笑。
  • 大马
    他刚说了永不去hw
  • l
    lumi
    据说他在编译器方向经验丰富
  • x
    x8blaze
    非Java从业者,object是所有类的父类,第二行没有错。第二行中指向string类型最后一行赋值的是integer预计会遇到运行时错误。暴露类型错误可以强转b[1]为string
  • z
    zhenyue
    第五行在逻辑上是错的,为啥要这么写

    第五行,在编译器上,低版本不支持拆箱和封箱会报错,高版本支持,不会报错

    所以
  • 7
    77880099