今天,我学习Java的时候,做了一个扑克牌小游戏,主要的功能就是计算机和玩家出牌比大小。
但是,在创建一个扑克牌Poker类的时候,我遇到了一个问题,我创建了两个Poker的子类,分别是用来存放玩家扑克牌的PlayPoker类,和用来存放电脑扑克牌的ComputerPoker,当我在Poker类里面声明了两个对象,分别是:
ComputerPoker cPoker = new ComputerPoker();
PlayerPoker pPoker = new PlayerPoker();
然后我在mian函数,生成一个Poker类的对象,并且执行的时候:
Poker poker = new Poker();
控制台Console显示出现错误,我一看,吓我一跳,出现了一堆错误:
Exception in thread "main" java.lang.StackOverflowError
at sun.misc.Unsafe.compareAndSwapLong(Native Method)
at java.util.concurrent.atomic.AtomicLong.compareAndSet(Unknown Source)
at java.util.Random.seedUniquifier(Unknown Source)
at java.util.Random.<init>(Unknown Source)
at pack8_扑克牌.ComputerPoker.<init>(ComputerPoker.java:8)
at pack8_扑克牌.Poker.<init>(Poker.java:22)
at pack8_扑克牌.PlayerPoker.<init>(PlayerPoker.java:6)
at pack8_扑克牌.Poker.<init>(Poker.java:23)
at pack8_扑克牌.PlayerPoker.<init>(PlayerPoker.java:6)
at pack8_扑克牌.Poker.<init>(Poker.java:23)
at pack8_扑克牌.PlayerPoker.<init>(PlayerPoker.java:6)
at pack8_扑克牌.Poker.<init>(Poker.java:23)
at pack8_扑克牌.PlayerPoker.<init>(PlayerPoker.java:6)
at pack8_扑克牌.Poker.<init>(Poker.java:23)
at pack8_扑克牌.PlayerPoker.<init>(PlayerPoker.java:6)
at pack8_扑克牌.Poker.<init>(Poker.java:23)
......
发现是StackOverflowError错误,也就是常说的栈溢出,我就纳闷了,怎么会栈溢出,我就上网百度了一下,发现说是因为内存不够,可以通过在Eclipse中JDK的配置中加上 -XX:MaxDirectMemorySize=128,因为默认的jvm内存是64,我们可以改成128或者256,然后我就去找jdk,但是我突然又想想,我就做了个完全只有几个类的小游戏,怎么会内存不够,那我以后做大一些的游戏,那还了得。
于是,我又认真地看了显示的错误信息,我发现这两处错误
at pack8_扑克牌.PlayerPoker.<init>(PlayerPoker.java:6)
at pack8_扑克牌.Poker.<init>(Poker.java:23)
总是在不断的出现,一直循环到错误结束,这是只有无限递归的时候才会出现的问题,然后我在查看PlayPoker这个类的时候,发现了问题,PlayPoker这个类继承了Poker类,但是我在Poker类里面声明并创建了PlayPoker对象,我想起了我们林老师曾经说的,new子类出来的对象,里面其实包含了父类的所有非私有成员变量及方法,但是这个Poker父类里面却又有一个子类PlayPoker对象,而这PlayPoker
对象又包含了其Poker父类的所有非私有成员变量及方法。。。,这是不是看起来像是递归,所以就造成死循环,这是我学习Java其中这发现的一个不经意间的问题,希望能给Java初学者一些帮助。
本文出自 “java中常见问题” 博客,请务必保留此出处http://liwei9455.blog.51cto.com/10104268/1638788
原文地址:http://liwei9455.blog.51cto.com/10104268/1638788