簡體   English   中英

DataOutputStream空指針異常

[英]DataOutputStream nullpointer exception

我在Android的DataOutputStream上收到NullPointerException

我首先編寫了一些代碼,以使用DataOutputStream用Java寫出文件。 一切正常。 我將代碼導入到Android項目中,並且出現了一些奇怪的行為。

我更改為特定於Android的唯一代碼是如何獲取目錄。

因此,實際發生的是:我正在創建DataOutputStream ,然后將其關閉。 到此為止。 我認為這是測試是否正確打開流是否要關閉流的一個很好的第一步。

DataOutputStream是一個類實例變量。

當我用相同的方法調用close時,它關閉得很好。 當我從其他方法對其調用close時,它將獲取NullPointerException 但是,盡管在Android中做了同樣的事情,但在Java中做同樣的事情並沒有引起問題。

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

錯誤:

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

如果在創建流時拋出異常,該流仍將為null,並且仍將調用close。 那里沒有檢查是否為空,因此它將拋出NPE。

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

在catch塊之后有代碼,該代碼應位於try塊內。 這就是為什么您要獲得NPE。

潛在的問題是,當您應該調用file.getParentFile()。mkdirs()時,您正在調用file.mkdirs(),因此您將目標文件創建為目錄,因此無法創建目標文件,因此您得到的是IOException而不是創建FileOutputStream,因此DataOutputStream引用仍然為null,因此,當執行catch塊之后的代碼(應位於try塊中)時,您將獲得NPE。

注意'new'的結果不能為空,因此直接進行測試是徒勞的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM