Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

getFileDir() cause NullPointer exception

Tags:

java

file

android

I'm in my early days of learning Java but hopefully someone get explain what I'm doing wrong here, numerous Google searches have left my head spinning.

I've been following a tutorial which shows how to save an ArrayList to a text file and then get the details back.

I am getting the following error:-

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 

This is being caused when my file viewLocations.java runs the following (after imports etc)

 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(); is located in a seperate file called '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;
    }
like image 760
Caphson Avatar asked Feb 08 '23 02:02

Caphson


1 Answers

There's a bunch of stuff wrong here. First of all, Activity classes, or in your case AppCompatActivity classes are generally for presenting screens with UI, not performing discreet tasks. Your getSaved() function should probably just reside in whichever Activity actually houses your UI.

Second, AppCompatActivity classes can't perform context actions statically. In other words, your Activity needs to be instantiated before you can use its super class methods, in this case getFilesDir().

What that boils down to is that you need to initialize filename in a lifecycle function, probably onCreate()

like image 83
M Dapp Avatar answered Feb 11 '23 00:02

M Dapp