質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3925閲覧

[Java]foreach文でNPE

退会済みユーザー

退会済みユーザー

総合スコア0

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/08/17 07:25

編集2016/08/17 13:20

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 #

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2016/08/17 07:53 編集

原因の箇所は本当にそこで正しいのでしょうか?例外発生時のスタックトレースをすべて掲載して下さい。ちなみにObject[]の値とsizeの値が違うことは全く関係ありません。
swordone

2016/08/17 13:22

スタックトレースを見る限り、ここで提示しているsampleMethodは関係していないようです。AgentBasedCicadasクラスの51行目に問題があるようです。
退会済みユーザー

退会済みユーザー

2016/08/18 04:52

すいませんが,ここのsampleMethodというのはこちらのシミュレーションプログラム中のgrowToAdultというメソッドを変数名,メソッド名を変えて書いてあります(というのも,実験で用いるプログラムなので外部に公開していいものか分からなかったからです).スタックトレースの上にあるものが呼び出し先のメソッドになるので,やはりこのメソッドに問題があるのではないでしょうか
swordone

2016/08/18 14:45

そのgrowToAdultがないログもありますね…growToAdultがある中では619行目と620行目で問題が発生しているようです。どの行が該当しますか?
退会済みユーザー

退会済みユーザー

2016/08/23 16:51

上記ソースコード上では「例外発生箇所」と書かれた部分が619行目に該当します
guest

回答2

0

スタックトレースがないので正確ではないかも知れませんが、

for(Col c: colX){ // <<例外発生箇所

で取得したcの値が null だった場合は、次のメソッドでNullPointerExceptionが発生しえます。

java

1if(c.canDo())

投稿2016/08/17 09:00

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

回答ありがとうございました。
現在扱っているプログラム内で、膨大なオブジェクトを扱っているのですが、そのオブジェクトの数が増えすぎて例外が発生している可能性に気づきました。
そこで、プログラム内でオブジェクトの数が一定数を超えるとシミュレーションを終了するという方法にしたところ、例外が発生しなくなりました。
プログラムの内容を明示的に示さずに質問してすいません。

投稿2016/09/02 06:05

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問