关于栈内存溢出的一个问题

来源:互联网 发布:mysql删除primary key 编辑:程序博客网 时间:2024/04/28 02:08

这两天在学习java泛型(博主参考的是疯狂java讲义,真的是一本不错的java学习参考书哦)的时候无意中看到一个栈内存溢出的例子,先将自己的学习笔记写下来,希望刚入门的朋友能有所收货,高手请主动跳过。

class StrList{private List strList = new ArrayList();public boolean add(String ele){return strList.add(ele);//1:return add(ele);}// 重写get方法,将get方法的返回值类型改为String类型public String get(int index){return (String)strList.get(index);//2:return get(index);}public int size(){return strList.size();//3:return size();}}public class CheckType{public static void main(String[] args) {// 创建一个只想保存字符串的List集合StrList strList = new StrList();strList.add("疯狂Java讲义");strList.add("疯狂Android讲义");strList.add("轻量级Java EE企业应用实战");// 下面语句不能把Integer对象“丢进”集合中,将引起编译错误//strList.add(5);     // ①System.out.println(strList);for (int i = 0; i < strList.size() ; i++ ){// 因为StrList里元素的类型就是String类型,// 所以无须强制类型转换String str = strList.get(i);}}}

可以发现,当改成代码中1,2,3处的任意一处的语句的时候,编译不会出错,但是运行时会提示Exception in thread "main" java.lang.StackOverflowError说明发生了栈内存溢出问题。通过自己查阅资料跟经验发现,不加strList以限制内存大小当然会导致内存溢出,这个问题想必大部分编程爱好者都能理解,博主在这有点多此一举了大笑,既然到了河边哪有不湿鞋,那就再来一波毒奶:这些代码其实本意是想判断①处的类型是否在编译的时候能检查出来,这样做当然是可以的,但是代码太过庞大,所以如果改成泛型就更好了,更多资料可以参考李阳的疯狂Java讲义哦!


0 0