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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

3回答

16891閲覧

起こるはずのないIndexOutOfBoundsExceptionが起こる

akamakku

総合スコア191

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/06/08 17:23

戻るボタンを押した時に呼ばれるfinishメソッドですが、getFragmentsで受け取ったlistはpopBackStackをすると、listにnullが入ってしまうという記事を見て、nullを削除するfor文を入れています。(これが正しいのかわかりませんが。。)

index = sizeになってIndexOutOfBoundsExceptionが起こっているわけですが、
listからgetしている部分は2箇所しかなく、どちらも
list.get(list.size()-1)
という形になっています。

これではIndexOutOfBoundsにならないと思うのですが、何なんでしょうか?
下に其の部分のコードとエラーメッセージを載せます
よろしくお願いします。

Java

1public void finish() { 2 fragmentPage1 = ((FragmentPage1) ((MyFragmentPagerAdapter) viewPager.getAdapter()).findFragmentByPosition(viewPager, 0)); 3 List<Fragment> flist = fragmentPage1.getChildFragmentManager().getFragments(); 4 Fragment last = flist.get(flist.size()-1); 5 while(last == null && flist.size() > 1){ 6 flist.remove(flist.size()-1); 7 last = flist.get(flist.size()-1); 8 } 9 if (last instanceof FragmentChooseYear) { 10 super.finish(); 11 } else if (last instanceof FragmentChooseMonth) { 12 Log.d("a", "Month"+flist.size()); 13 fragmentPage1.getChildFragmentManager().popBackStack(); 14 } else if (last instanceof FragmentChooseDay) { 15 Log.d("a", "Day"+flist.size()); 16 fragmentPage1.getChildFragmentManager().popBackStack(); 17 } else if (last instanceof FragmentSetTimeAndStr) { 18 Log.d("a", "Time"+flist.size()); 19 fragmentPage1.getChildFragmentManager().popBackStack(); 20 }else if(last == null){ 21 Log.d("finish","null"+flist.size() ); 22 } else { 23 Log.d("finish","error"+flist.size() ); 24 } 25 }

エラーメッセージ

06-09 02:06:44.825 11022-11022/teppei.reminder E/AndroidRuntime: FATAL EXCEPTION: main Process: teppei.reminder, PID: 11022 java.lang.IndexOutOfBoundsException: Invalid index 13, size is 13 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) at java.util.ArrayList.set(ArrayList.java:481) at android.support.v4.app.FragmentManagerImpl.makeActive(FragmentManager.java:1181) at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1206) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:704) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:155) at android.app.ActivityThread.main(ActivityThread.java:5702) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

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

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

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

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

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

guest

回答3

0

自己解決

何も考えずにnullだからといって勝手にlistの要素をremoveしていたのが間違いでした。

気づかせていただきありがとうございました

投稿2016/06/09 06:53

akamakku

総合スコア191

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

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

0

List<Fragment> flist = fragmentPage1.getChildFragmentManager().getFragments();

上記でとれるflistのサイズはいくつですか?

Log.d("a", String.valueOf(flist.size());

などで確認してみてください。
これが0になっていた場合flist.get(-1)となるのでArrayIndexOutOfBoundsExceptionが発生すると思います。

あとは、while文の先頭でflistのサイズを標準出力して不正な値になっていないか確認してみてはどうでしょうか。

(余談ですが、プログラミングで起きるはずがないという先入観は危険な気がします。)

投稿2016/06/09 05:44

Yossi_1982

総合スコア95

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

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

akamakku

2016/06/09 06:51

プログラミングで起きるっはずがないという先入観は危ないというお言葉とても心にしみました 教訓にします
guest

0

根本的に、発生原因が掲載してくださっているコードと関係ないように思います。
例外ログの中にInitとかmakeActiveとか、初期化に関連しそうなワードが幾つか見られます。
発生原因もgetではなく、setのようです。おそらく明示的にsetを使っているわけではないでしょうから、初期化の段階で何らかのエラーが起きていると推測されます。

投稿2016/06/08 17:38

swordone

総合スコア20651

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

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

akamakku

2016/06/09 01:22

確かによく見てみると初期化に関連しそうなワードが並んでいます。 自分が勝手にgetFragmentsで貰ったListを削除しているから、裏でだれかがListの範囲外にsetしてしまっているということなんでしょうか
coco_bauer

2016/06/09 02:24

「裏でだれか」って、、、質問のコードは、どういう使われ方をするものなのですか? 複数のユーザが同時並行的に様々なメソッドを起動するというのなら、何が起きても不思議ではありません。相互排除などについての記述もないですし、、、
akamakku

2016/06/09 03:07

FragmentManagerの仕様がFragmentがreplaceされると同時にListにFragmentが追加されるようになってるので、 それを担っているメソッドがsetしているのかなと勝手に推定しました。 すみません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問