Javaでシミュレーション用のプログラムを書いています.
foreach文でCollectionを回しているのですが,CollectionがnullでないにもかかわらずNullPointerExceptionが発生してしまいます.
以下のソースコードは,colX内の要素を一つ一つ調べ,条件を満たしかつ確率の値がrateより小さいならばcolYに移す,条件を満たさないならばcolXに戻す,それ以外(条件を満たし,確率の値がrate以上)は破棄するというプログラムです.
public static void sampleMethod(Collection<Col> colX, Collection<Col> colY, double rate){ ArrayList<Col> tempCol = new ArrayList<Col>(); colY.clear(); if(colX == null) return; for(Col c: colX){ // <<例外発生箇所 if(c.canDo()) if(rnd.nextDouble() < rate)colY.add(c); else tempCol.add(c); } larvaCicadas.clear(); larvaCicadas.addAll(tempCicadas); }
EclipseのDebugで,上の例外発生箇所にブレークポイントを指定してcolXの中身を見てみると,elementDataにはObject[14053]と書いてあり,その中にはmodCountが11002,sizeが9847とありました.
Object[]の値とsizeの値が異なっていますが,自分の中ではこれが原因かと考えています.
ですが,解決方法がわかりません.どのように解決したら良いでしょうか.
###追記2016/8/17 22:05
スタックトレースという言葉が聞きなれなかったので調べてきました.
スタックトレースは多分わかったのですが,本題とは別の問題があるかもしれないことに気づきました.実行するごとにスタックトレースの内容がいちいち変化します.
プログラム中には乱数を用いていますが,プログラムの最初から最後まで乱数のシードは固定してあります.
題の問題とは別の問題が発生しているかもしれないので,この質問を取り下げて新しく質問しなおすべきでしたら新しく質問し直します.
Exception in thread "main" java.lang.NullPointerException at sol.aoki.Cicada.growToAdult(AgentBasedCicadas.java:619) at sol.aoki.AgentBasedCicadas.Simulating(AgentBasedCicadas.java:371) at sol.aoki.AgentBasedCicadas.main(AgentBasedCicadas.java:51)
Exception in thread "main" java.lang.NullPointerException at sol.aoki.AgentBasedCicadas.Simulating(AgentBasedCicadas.java:424) at sol.aoki.AgentBasedCicadas.main(AgentBasedCicadas.java:51)
Exception in thread "main" java.lang.ClassCastException: [I cannot be cast to sol.aoki.Cicada at sol.aoki.AgentBasedCicadas.Simulating(AgentBasedCicadas.java:424) at sol.aoki.AgentBasedCicadas.main(AgentBasedCicadas.java:51)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at sol.aoki.Cicada.getGene(AgentBasedCicadas.java:815) at sol.aoki.AgentBasedCicadas.Simulating(AgentBasedCicadas.java:425) at sol.aoki.AgentBasedCicadas.main(AgentBasedCicadas.java:51)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at sol.aoki.Cicada.getLowerGene(AgentBasedCicadas.java:761) at sol.aoki.Cicada.canBeAdult(AgentBasedCicadas.java:749) at sol.aoki.Cicada.growToAdult(AgentBasedCicadas.java:620) at sol.aoki.AgentBasedCicadas.Simulating(AgentBasedCicadas.java:371) at sol.aoki.AgentBasedCicadas.main(AgentBasedCicadas.java:51)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at sol.aoki.Cicada.getGene(AgentBasedCicadas.java:815) at sol.aoki.AgentBasedCicadas.Simulating(AgentBasedCicadas.java:425) at sol.aoki.AgentBasedCicadas.main(AgentBasedCicadas.java:51)
# # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x00000001055a3791, pid=28582, tid=10499 # # JRE version: Java(TM) SE Runtime Environment (8.0_45-b14) (build 1.8.0_45-b14) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.45-b02 mixed mode bsd-amd64 compressed oops) # Problematic frame: # V [libjvm.dylib+0x1a3791] oopDesc::size()+0x2d # # Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again # # An error report file with more information is saved as: # /Users/aoki/Documents/workspace/AgentBasedCicadas/hs_err_pid28582.log # # If you would like to submit a bug report, please visit: # http://bugreport.java.com/bugreport/crash.jsp #
回答2件
あなたの回答
tips
プレビュー