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);