今天,我學習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初學者一些幫助。