Java 写入文件时出现空指针异常-Android Studio

Java 写入文件时出现空指针异常-Android Studio,java,android-studio,nullpointerexception,Java,Android Studio,Nullpointerexception,每次我去发送传感器收集的数据时,我的应用程序都会崩溃。我得到的错误如下: 06-20 14:50:00.784 22983-22983/com.example.adam.proj2 E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.NullPointerException at com.example.adam.proj2.SensorActivity.onClick(SensorActivity.java:124)

每次我去发送传感器收集的数据时,我的应用程序都会崩溃。我得到的错误如下:

06-20 14:50:00.784  22983-22983/com.example.adam.proj2 E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
        at com.example.adam.proj2.SensorActivity.onClick(SensorActivity.java:124)
        at android.view.View.performClick(View.java:3549)
        at android.view.View$PerformClick.run(View.java:14393)
        at android.os.Handler.handleCallback(Handler.java:605)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:4944)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
        at dalvik.system.NativeStart.main(Native Method)
以下是收集传感器数据的代码:

 public void onSensorChanged(SensorEvent event) {
    float x = event.values[0];
    ArrayList<Float> enrolAcc = new ArrayList<>();
    ArrayList<Float> authAcc = new ArrayList<>();
    TextView textEnrol = (TextView) findViewById(R.id.textView);
    if (choice == 1) {
        mPreviousAcc = mCurrentAcc;
        mCurrentAcc = (float) Math.sqrt((double) (x * x));
        float delta = mCurrentAcc - mPreviousAcc;
        mDiffAcc = mDiffAcc * 0.9f + delta;
        if (enrolAcc.size() < 100) {
            enrolAcc.add(x);

        } else {
            enrolAcc.remove(0);
            enrolAcc.add(x);
        }
        walkData = enrolAcc.toString();
        textEnrol.setText(walkData);
    }
从我所看到的异常是由out.write方法生成的? 保存传感器值的数组列表存储在walkData字符串中,以便该字符串可以写入存储在外部设备存储器上的csv文件中。我想在CSV格式的数据

我被难住了,不知道如何防止这种情况发生,非常感谢您的帮助。

请查看代码:

        try {
            out = new FileOutputStream(f);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            out.write(walkData.getBytes());
异常在最后一行抛出。那么,这条线可能有什么问题

out
可以为空<如果找不到文件,code>out设为null,因为您捕获了该异常,并假装前一行没有发生错误,将
out
设为null。如果初始化失败,则不应尝试使用
out
。try块应该使用
out
关闭所有行,而不仅仅是初始化它的行

walkData
也可以为空。但因为我们不知道它从哪里来,我们不能说。使用调试器知道哪个是空的。不管答案是什么,修复您的异常处理代码。应该是这样的

        FileOutputStream out = null;
        try {
            out = new FileOutputStream(f);
            out.write(walkData.getBytes());

            android.net.Uri u1 = Uri.fromFile(f);
            Intent sendIntent = new Intent(Intent.ACTION_SEND);
            sendIntent.putExtra(Intent.EXTRA_STREAM, u1);
            sendIntent.setType("text/html");
            startActivity(sendIntent);
        } catch (IOException e) {
            // TODO signal the error to the user. Printing a stack trace is not enough
        }
        finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    // TODO signal the error to the user. Printing a stack trace is not enough
                }
             }
        }

出现错误是因为您试图写入一个
只读文件。
out=newfileoutputstream(f)
引发异常:
java.io.FileNotFoundException:/storage/sdcard/Walk Data.csv:open failed:EROFS(只读文件系统)
,但您实际上忽略了它,因此
out=NULL
然后您会得到另一个异常。
将文件移动到可以写入的位置-

    String fileName = "Walk Data.csv";
    String baseDir = getFilesDir() + "/" + fileName;
    File f = new File(baseDir);

从堆栈跟踪判断,我们需要看到代码的这一部分:com.example.adam.proj2.SensorActivity.onClick(SensorActivity.java:124),异常在SensorActivity.onClick()中抛出,位于第124行。您没有发布该方法,也没有说哪一行是第124行。第124行是onClick方法中的这一行:out.write(walkData.getBytes());我还更新了完整的onClick方法。谢谢,我已经将所有使用out的行移到了一个try块中,我不再收到错误。但是,电子邮件中附加的CSV文件不包含任何传感器数据且为空?您不再收到错误,因为您可能尚未在我的回答中实施TODO。另外,不要在捕获到异常后继续,就好像什么都没发生一样。抱歉,我是Java新手,你这么说是什么意思?我的意思是,如果写入文件时出错,你不应该尝试发送文件。您应该告诉用户“嘿,发生了一些错误”。我已经实现了您在上面建议的更改,这使得文件可以毫无问题地写入,尽管这导致了另一个错误,无法发送电子邮件。我已经编辑了问题,新的错误在问题的底部。1。我猜不出你的“另一个错误”是什么。除非你提供更多细节,否则没有人能帮你。2.您已请求帮助以解决特定错误。如果以上任何一个答案解决了你的问题,接受它并提出一个新问题。我的“另一个错误”显示在问题的底部?谢谢,我会把这个问题变成一个新问题。
    String fileName = "Walk Data.csv";
    String baseDir = getFilesDir() + "/" + fileName;
    File f = new File(baseDir);