2016-01-10 87 views
2

我在學習Java的早期階段,但希望有人能夠解釋我在這裏做錯了什麼,許多Google搜索都讓我頭腦轉動。getFileDir()導致NullPointer異常

我一直在關注一個教程,該教程展示瞭如何將一個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; 
    } 

回答

2

有一堆東西錯在這裏。首先,Activity類,或者在你的情況下,AppCompatActivity類通常用於呈現帶UI的屏幕,而不是執行謹慎的任務。您的getSaved()函數應該可能只存在於您的用戶界面實際存在的活動中。

其次,AppCompatActivity類不能靜態執行上下文動作。換句話說,在你使用超類方法之前,你的Activity需要被實例化,在這種情況下,getFilesDir()

結論是,您需要在生命週期函數中初始化filename,可能是onCreate()