当前位置: 代码迷 >> J2SE >> 想问一下java中java实现了数组安全检查了吗?解决办法
  详细解决方案

想问一下java中java实现了数组安全检查了吗?解决办法

热度:77   发布时间:2016-04-24 02:30:00.0
想问一下java中java实现了数组安全检查了吗?
我今天看core java 里边有一节给出了如下类似代码(这我做实验的,书上的跟我这个原理一样)
Java code
class SuperC {    int i = 1;}class SubC extends SuperC{    }public class InhTest {    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub              SubC[] subc = new SubC[10];        SuperC[] superc = subc;        superc[0] = new SuperC();        System.out.println();    }}

这println()中如果调用subc.i就会出错
然后书中突然来了一段话:为了确保不发生这类错误,所有数组都要牢记创建它们的元素类型,并负责监督仅将类型兼容的引用存储到数组中。例如,使用new managers[10]创建的数组是一个经理数组(我例子中就是SubC类)。如果试图存储一个Employee类型的引用就会引发ArrayStoreException异常。(然后就下一节内容了)---汗!!
【问】:那java中的数组到底是实现了这种检查了吗?看他这段话就是实现了吧?可是为什么我在编译器里还能将父类实例引用放入子类数组中,而编译器却不报错? 郁闷。。。

------解决方案--------------------
会不会是这样:
ArrayStoreException异常 检查首先检测 类型是否匹配,如果不匹配就看能不能自动转换,比如反过来用父类存子类,那么就能够自动砍去子类多余的数据,实现了转换。
而你这里是子类转父类,可能因为你的子类的没有新的实例字段,导致父类也能转成子类了,所以保存成功了

仅仅是猜测~~共同学习


------解决方案--------------------
有什么问题??

这个属于运行期(Runtime)异常,编译期无法检查的。编译器不是万能的,他只能检测100%必然错误的情况。举个例子,
Java code
  public static void main(String[] args) throws Exception {    System.out.println(args[10]);  }
  相关解决方案