簡體   English   中英

getFileDir()導致NullPointer異常

[英]getFileDir() cause NullPointer exception

我在學習Java的早期階段,但希望有人能夠解釋我在這里做錯了什么,許多谷歌搜索讓我頭疼。

我一直在學習如何將ArrayList保存到文本文件然后獲取詳細信息的教程。

我收到以下錯誤: -

01-10 19:00:37.092 16897-16897/uk.co.c2digital.futurefoto E/AndroidRuntime: FATAL EXCEPTION: main
Process: uk.co.c2digital.futurefoto, PID: 16897
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{uk.co.c2digital.futurefoto/uk.co.c2digital.futurefoto.viewLocations}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getFilesDir()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2322)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
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:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getFilesDir()' on a null object reference
at android.content.ContextWrapper.getFilesDir(ContextWrapper.java:201)
at uk.co.c2digital.futurefoto.fileControl.<init>(fileControl.java:23)
at uk.co.c2digital.futurefoto.viewLocations.<init>(viewLocations.java:18)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.Class.newInstance(Class.java:1572)
at android.app.Instrumentation.newActivity(Instrumentation.java:1083)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2312)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474) 
at android.app.ActivityThread.access$800(ActivityThread.java:144) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:155) 
at android.app.ActivityThread.main(ActivityThread.java:5696) 
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:1028) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823) 
01-10 19:05:37.142 16897-16897/uk.co.c2digital.futurefoto D/Process: killProcess, pid=16897
01-10 19:05:37.162 16897-16897/uk.co.c2digital.futurefoto D/Process: com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException:138 java.lang.ThreadGroup.uncaughtException:693 java.lang.ThreadGroup.uncaughtException:690 

這是在我的文件viewLocations.java運行以下(導入等之后)時引起的

 public class viewLocations extends AppCompatActivity {

    fileControl filer = new fileControl();
    ArrayList imgArray = filer.getSaved();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_locations);

      }

FileControl(); 位於一個名為'fileControl.java'的獨立文件中

public class fileControl extends AppCompatActivity {


    // Set filename
    String filename = getFilesDir() + "/savedList.txt";

    /**
     * Following code gets a list of saved image paths from device
     * @return

     */


    public ArrayList getSaved() {


        // Create variable for storing each line as it's read
        String line;

        // Clear imgArray ready for new entries
        ArrayList newList = new ArrayList();
        newList.clear(); // ensure new array is clear before continuing

        // Try to open file
        try {
            BufferedReader input = new BufferedReader(new FileReader(filename));
            if (!input.ready()) {
                // If input file is not ready, show log error
                Log.d("getSavedList", "Unable to open save file, input not ready");
            } else {

                // If input file is ready, read each line one at a time and add to array
                while ((line = input.readLine()) != null) {
                    newList.add(line);
                }
                input.close();

                // Run verification on results to ensure no duplicates or deleted images are recorded
                newList = listVerify(newList);

            }
        } catch (IOException e) {
            Log.d("getSavedList", "Read save file failed: " + e);
        }

        return newList;
    }

這里有一堆錯誤。 首先, Activity類,或者在你的情況下, AppCompatActivity類通常用於呈現帶有UI的屏幕,而不是執行謹慎的任務。 你的getSaved()函數可能只是駐留在你的UI實際存在的Activity中。

其次, AppCompatActivity類無法靜態執行上下文操作。 換句話說,在使用超類方法之前,需要先實例化Activity,在本例中為getFilesDir()

歸結為你需要在生命周期函數中初始化filename ,可能是onCreate()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM