首页 文章

SharedPreference上的ArrayIndexOutOfBoundsException与boolean-array?

提问于
浏览
0

我被抛出了我的布尔数组的异常,我不知道为什么会发生这种情况 . 我浏览了一些网站以获得针对此类问题的推荐或解决方案,但我没有找到任何内容 .

这就是我问SO的原因,因为我没有找到解决这个典型代码同样问题的问题 . 我坐了大约5个小时来实现SharedPreference .

这是我在 PreferenceClass 上运行的代码 . 我正在尝试从用户保存Multichoice输入 . 点击 musicPreference 后,应用程序崩溃,我被迫关闭它 .

boolean[] isSelectedMusic;

@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.main_settings);

    musikPreference = findPreference(getString(R.string.pref_music_key));

    listMusicName = getResources().getStringArray(R.array.music);
    listMusicId = getResources().getStringArray(R.array.music_values);

    isSelectedMusik = new boolean[listMusikName.length];




    /*
        TODO Guck wie sich der Input ändert je nachdem kann man sagen wie man es ändert
     */
    if ((Arrays.equals(getStoredMusik("storedSelectedMusik"), isSelectedMusik))==false) {
        isSelectedMusik = getStoredMusik("storedSelectedMusik");
    }

    musikPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
        @Override
        public boolean onPreferenceClick(Preference preference) {
            AlertDialog.Builder musik_dialog_builder = new AlertDialog.Builder(getActivity());
            musik_dialog_builder.setTitle(R.string.pref_title_musik);
            musik_dialog_builder.setMultiChoiceItems(listMusikName, isSelectedMusik, new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int position, boolean is_selected) {
                    if (is_selected) {
                        userMusik.add(position);
                        System.out.println("Position des Items: +" + position);
                    } else {
                        userMusik.remove((Integer.valueOf(position)));
                    }
                }

            });

            musik_dialog_builder.setCancelable(false);
            musik_dialog_builder.setPositiveButton(R.string.ok_label, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int which) {
                    String musik = "";
                    for (int i = 0; i < userMusik.size(); i++) {
                        musik = musik + listMusikName[userMusik.get(i)];
                        System.out.println("Z.100 - Z.106\n" +
                                "item: " + musik + "\n" +
                                "i: " + i + "\n" +
                                "id:" + listMusikId[i] + "\n");

                        userMusikID.add(listMusikId[i]);
                        userMusikName.add(listMusikName[i]);

                        isSelectedMusik[i] = true;


                        if (i != userMusik.size() - 1) {
                            musik = musik + ", ";
                            System.out.println("Z.108 - Z.112\n" +
                                    "item: " + musik + "\n" +
                                    "i: " + i + "\n");
                        }
                    }
                    setMusik(musik);
                    storeSelectedMusik(isSelectedMusik,"storedSelectedMusik");

                }
            });

            private void storeSelectedMusik(boolean[] isSelectedMusikList, String arrayName) {
                SharedPreferences mSharedPreferences = this.getActivity().getSharedPreferences("DataOfSelectedMusik", 0);
                SharedPreferences.Editor mEditor = mSharedPreferences.edit();

                mEditor.putInt(arrayName + "_size", isSelectedMusikList.length);

                for (int i = 0; i < isSelectedMusikList.length; i++) {
                    mEditor.putBoolean(arrayName + "_" + i, isSelectedMusikList[i]);
                }


                mEditor.apply();
            }

            private boolean[] getStoredMusik(String arrayName) {
                SharedPreferences mSharedPreferences = this.getActivity().getSharedPreferences("DataOfSelectedMusik", 0);
                int size = mSharedPreferences.getInt(arrayName + "_size", 0);
                boolean[] isSelectedMusikArray = new boolean[size];

                for (int i = 0; i < size; i++) {
                    isSelectedMusikArray[i] = mSharedPreferences.getBoolean(arrayName + "_" + i, false);
                }

                return isSelectedMusikArray;
            }

这是我在Logcat上获得的异常 .

07-19 05:41:56.048 4769-4769 / cren.example.com.musiclover E / AndroidRuntime:FATAL EXCEPTION:main进程:cren.example.com.musiclover,PID:4769 java.lang.ArrayIndexOutOfBoundsException:length = 0 ; index = 0 at com.android.internal.app.AlertController $ AlertParams $ 1.getView(AlertController.java:1101)at android.widget.AbsListView.obtainView(AbsListView.java:2366)at android.widget.ListView.measureHeightOfChildren(ListView .java:1408)在android.view.measure.View中的android.view.List( . View.java:23169)上的android.widget.ListView.onMeasure(ListView.java:1315) . (ViewGroup.java:6749)在android.widget.FrameLayout.onMeasure(FrameLayout.java:185)的android.view.View.measure(View.java:23169)at com.android.internal.widget.AlertDialogLayout.tryOnMeasure(AlertDialogLayout.java:144)at at com.android.internal.widget.AlertDialogLayout.onMeasure(AlertDialogLayout.java:69)在android.view.vision.measure(View.java:23169)的android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)在android上.widget.FrameLayout.onMeasure(FrameLayout.java:185)在android.view.vision.measure(View.java:23169)的android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)在android上.widget.FrameLayout.onMeasure(FrameLayout.java:185)在android.view.measure.View.measure(View.java:23169)的android.view.measure.View.Stillgins(ViewGroup.java:6749)处于android.widget.FrameLayout . onMeasure(FrameLayout.java:185)位于android.view.View.RedImpl.performMeasure的android.view.View.measure(View.java:23169)的com.android.internal.policy.DecorView.onMeasure(DecorView.java:716) (ViewRootImpl.java:2719)位于android.view.ViewRootImpl.exeTraversals(ViewRootImpl.java:1856)的android.view.ViewRootImpl.mplHversal上的android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1545)(ViewRootImpl.java:1567) 1460)在Android.view.Chore上的android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:7184)以及android.view.Choreographer.Callbackss(Choreographer.java:761)中的android.view.Choreographer $ CallbackRecord.run(Choreographer.java:949) )android.view.Hand上的android.view.Choreographer.doFrame(Choreographer.java:696)android.view.Hand上的android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:935) ler.handleCallback(Handler.java:873)位于android.app.AtoT.Thread.main(ActivityThread)的android.os.Handler.dispatchMessage(Handler.java:99)android.os.Looper.loop(Looper.java:193) .java:6669)位于com.android.internal.os.ZygoteInit的com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)的java.lang.reflect.Method.invoke(Native Method) . 主要(ZygoteInit.java:858)

1 回答

  • 2
    length=0
    

    表示您的数组实际上是空的 . 您正在尝试获取空数组的第一个元素 .

    我没有立即从你的stacktrace中看到哪一行抛出异常,但是有几个 array[index] 调用它可能发生 . 在这里,例如:

    for (int i = 0; i < userMusik.size(); i++) {
                            musik = musik + listMusikName[userMusik.get(i)];
                            System.out.println("Z.100 - Z.106\n" +
                                    "item: " + musik + "\n" +
                                    "i: " + i + "\n" +
                                    "id:" + listMusikId[i] + "\n");
    
                            userMusikID.add(listMusikId[i]);
                            userMusikName.add(listMusikName[i]);
    

    您确认不超过 userMusik 的大小,但不检查您尝试从 listMusikIdlistMusikName 检索的元素是否存在 .

相关问题