首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataOutputStream空指针异常

DataOutputStream空指针异常
EN

Stack Overflow用户
提问于 2014-02-24 18:59:16
回答 2查看 1.3K关注 0票数 2

我在安卓的DataOutputStream上得到了一台DataOutputStream

我首先编写了一些代码,以便使用DataOutputStream在Java中编写文件。一切都很完美。我将代码导入到一个Android项目中,我得到了一些奇怪的行为。

我更改为android专用的唯一代码是如何获得目录。

所以确切的情况是:我正在创建DataOutputStream,然后关闭它。现在就这么多了。我认为这是测试流是否正确打开的第一步,就是关闭它。

DataOutputStream是一个类实例变量。

当我用同样的方法调用close时,它关闭得很好。当我从另一种方法调用close时,它会得到NullPointerException。但是在Java中做同样的事情并没有引起问题,尽管在Android中也是如此。

代码语言:javascript
复制
public class WavFileOutStream {

    private DataOutputStream stream;

    public WavFileOutStream(String fileName)
    {

        // Get the directory for the user's public pictures directory. 
        File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_RINGTONES), fileName);
        if (!file.mkdirs()) {
            Log.e("trace", "Directory not created");
        }

        try {
            stream = new DataOutputStream(new FileOutputStream(file));

            if(stream==null)
            {
                Log.i("trace","Null Stream!");
            }

            //<--PROBLEM LINE 1-->
            //If I call close from this line I get NO nullPointer
            //stream.close();


        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

        //<--PROBLEM LINE 1-->
        //If I call close from this line I get a nullPointer
        //I comment out other close() first
        close();

    }

    public void close()
    {
        try {
            stream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

错误:

代码语言:javascript
复制
02-24 12:49:39.229: E/AndroidRuntime(11539): FATAL EXCEPTION: main
02-24 12:49:39.229: E/AndroidRuntime(11539): Process: com.example.ringtonegenerator, PID: 11539
02-24 12:49:39.229: E/AndroidRuntime(11539): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ringtonegenerator/com.example.ringtonegenerator.MainActivity}: java.lang.NullPointerException
02-24 12:49:39.229: E/AndroidRuntime(11539):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at android.app.ActivityThread.access$800(ActivityThread.java:135)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at android.os.Handler.dispatchMessage(Handler.java:102)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at android.os.Looper.loop(Looper.java:136)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at android.app.ActivityThread.main(ActivityThread.java:5017)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at java.lang.reflect.Method.invokeNative(Native Method)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at java.lang.reflect.Method.invoke(Method.java:515)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at dalvik.system.NativeStart.main(Native Method)
02-24 12:49:39.229: E/AndroidRuntime(11539): Caused by: java.lang.NullPointerException
02-24 12:49:39.229: E/AndroidRuntime(11539):    at com.example.ringtonegenerator.WavFileOutStream.close(WavFileOutStream.java:178)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at com.example.ringtonegenerator.WavFileOutStream.<init>(WavFileOutStream.java:43)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at com.example.ringtonegenerator.WavFileWriter.writeWave(WavFileWriter.java:10)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at com.example.ringtonegenerator.MainActivity.onCreate(MainActivity.java:23)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at android.app.Activity.performCreate(Activity.java:5231)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
02-24 12:49:39.229: E/AndroidRuntime(11539):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
02-24 12:49:39.229: E/AndroidRuntime(11539):    ... 11 more
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-24 19:02:49

如果在创建流时抛出异常,则流仍然为null,并且仍将调用close。那里没有检查null,所以它会抛出NPE。

代码语言:javascript
复制
public void close()
{
    if(stream != null){
        try {
            stream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-02-24 19:11:44

您有一个catch块后面的代码,应该在try块中。所以你才能拿到NPE。

根本的问题是,当您应该调用file.getParentFile().mkdirs()时,您正在调用IOException (),因此您将目标文件创建为一个目录,因此您无法创建目标文件,因此您得到的是一个IOException,而不是创建FileOutputStream,所以DataOutputStream引用仍然是空的,所以在try块后面的代码应该在try块中执行时,会得到NPE。

'new‘的结果不能是空的,所以事后直接测试是徒劳的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21996526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档