سؤال

يرجى إلقاء نظرة على التعليمات البرمجية التالية

private class OpenFileEvent implements OnClickListener
{
    LinearLayout openFileDialogView = (LinearLayout)findViewById(R.id.open_file_dialog);

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        final Dialog openFileDialog = new Dialog(Notes.this);
        openFileDialog.setTitle("Open File");
        openFileDialog.setContentView(R.layout.open_dialog);


        //First, list all the available Files
        File folder = new File(Environment.getExternalStorageDirectory()+"/Main Notes/Notes");
        File[] fileNameList = folder.listFiles();

        if(fileNameList.length>0 && fileNameList!=null)
        {
            for(int i=0;i<fileNameList.length;i++)
            {
                //Get the sub views first
                LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

                View openThisFileView = inflater.inflate(R.layout.open_dialog_file, null);      
                Button openThisFileButton = (Button)openThisFileView.findViewById(R.id.open_this_file_button);
                Button appendThisFileButton = (Button)openThisFileView.findViewById(R.id.append_note_this_file);
                TextView openThisFileNameTxt = (TextView)openThisFileView.findViewById(R.id.open_this_file_name);

                //Set the Text
                openThisFileNameTxt.setText(fileNameList[i].getName());

                //Set the Listeners


                //Add the View
                openFileDialogView.addView(openThisFileView);

            }
        }

        //Show the Dialog
        openFileDialog.show();




    }

}

بمجرد تشغيل هذا الرمز ، أحصل على الخطأ التالي

11-17 17:31:18.681: E/AndroidRuntime(4868): FATAL EXCEPTION: main
11-17 17:31:18.681: E/AndroidRuntime(4868): java.lang.NullPointerException
11-17 17:31:18.681: E/AndroidRuntime(4868):     at com.a.Notter.Notes$OpenFileEvent.onClick(Notes.java:203)
11-17 17:31:18.681: E/AndroidRuntime(4868):     at android.view.View.performClick(View.java:4204)
11-17 17:31:18.681: E/AndroidRuntime(4868):     at android.view.View$PerformClick.run(View.java:17355)
11-17 17:31:18.681: E/AndroidRuntime(4868):     at android.os.Handler.handleCallback(Handler.java:725)
11-17 17:31:18.681: E/AndroidRuntime(4868):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-17 17:31:18.681: E/AndroidRuntime(4868):     at android.os.Looper.loop(Looper.java:137)
11-17 17:31:18.681: E/AndroidRuntime(4868):     at android.app.ActivityThread.main(ActivityThread.java:5041)
11-17 17:31:18.681: E/AndroidRuntime(4868):     at java.lang.reflect.Method.invokeNative(Native Method)
11-17 17:31:18.681: E/AndroidRuntime(4868):     at java.lang.reflect.Method.invoke(Method.java:511)
11-17 17:31:18.681: E/AndroidRuntime(4868):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-17 17:31:18.681: E/AndroidRuntime(4868):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-17 17:31:18.681: E/AndroidRuntime(4868):     at dalvik.system.NativeStart.main(Native Method)

يحدث هذا الخطأ هنا ، حيث تعاملت مع NULL كذلك

if(fileNameList.length>0 && fileNameList!=null)

ماذا يحدث هنا?

هل كانت مفيدة؟

المحلول

الشرط الأول الذي تم تقييمه سيكون طول fileNameList.أو إذا fileNameList هو null وسوف رمي NPE لأنك تحاول أولا الوصول إلى length السمة.

يجب عليك عكس حالتك :

if(fineNameList != null && fileNameList.length>0)

لم؟

يظهر هؤلاء المشغلون سلوك "قصر الدائرة" ، مما يعني ذلك يتم تقييم المعامل الثاني فقط إذا لزم الأمر.

لذلك إذا fileNameList هو null لن يتم تقييم المعامل الثاني ، وبالتالي يمكنك تجنب رمي NPE.

نصائح أخرى

يجب عليك استخدام

if(fileNameList!=null && fileNameList.length>0)

وإلا لديك NullPointerException بسبب fileNameList.length أين fileNameList هو NULL.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top