簡體   English   中英

嘗試將文件寫入內部數據時不斷獲取NullPointerException

[英]Keep getting NullPointerException when trying to write file to internal data

我正在使用以下代碼將json文件從我的資產文件夾復制到數據文件夾,以便在首次啟動時使用此數據,直到加載了真實數據為止:

AssetManager am = myContext.getAssets();
        InputStream is = null;
        try {
            is = am.open("settings.json");
        } catch (IOException e) {
            e.printStackTrace();
        }
        BufferedReader r = new BufferedReader(new InputStreamReader(is));
        StringBuilder total = new StringBuilder();
        String line = "";
        try {
            while ((line = r.readLine()) != null) {
                total.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
                    myContext.openFileOutput("settings.json", Context.MODE_PRIVATE));
            outputStreamWriter.write(line);
            outputStreamWriter.close();
        } catch (IOException e) {
            Log.e("Test", "File write failed: " + e.toString());
        }

但是我一直收到以下錯誤:

06-08 14:07:24.576: E/AndroidRuntime(10509): Caused by: java.lang.NullPointerException
06-08 14:07:24.576: E/AndroidRuntime(10509):    at     java.io.Writer.write(Writer.java:141)
06-08 14:07:24.576: E/AndroidRuntime(10509):    at     com.test.app.MainActivity.onCreate(MainActivity.java:370)
06-08 14:07:24.576: E/AndroidRuntime(10509):    at     android.app.Activity.performCreate(Activity.java:5243)
06-08 14:07:24.576: E/AndroidRuntime(10509):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)

這是哪一行:

outputStreamWriter.write(line);

我們有以下周期:

while ((line = r.readLine()) != null) {
    total.append(line);
}

因此,很顯然, line末尾等於null 現在,讓我們看一下Writer#write(String)的實現。 它調用write()函數的3參數版本,如下所示:

public void write(String str, int offset, int count) throws IOException {
    if ((offset | count) < 0 || offset > str.length() - count) {
        throw new StringIndexOutOfBoundsException(str, offset, count);
    }
    char[] buf = new char[count];
    str.getChars(offset, offset + count, buf, 0);
    synchronized (lock) {
        write(buf, 0, buf.length);
    }
}

如果strnullstr.length()將失敗,並出現NullPointerException

我認為您需要的是outputStreamWriter.write(total.toString()); ,而不是outputStreamWriter.write(line);

這是因為line在那一點上為空。
看一下循環:
while ((line = r.readLine()) != null) { total.append(line); }
循環結束后, line為null。 當您嘗試運行以下代碼時:
outputStreamWriter.write(line); 您正在將null值傳遞給write方法。
java.io.Writer.write(String str)實現如下:
write(str, 0, str.length());

在null對象上調用length()方法會導致NullPointerException。

改變這個:

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
                    myContext.openFileOutput("settings.json", Context.MODE_PRIVATE));
            outputStreamWriter.write(line);
            outputStreamWriter.close();

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
                    myContext.openFileOutput("settings.json", Context.MODE_PRIVATE));
            outputStreamWriter.write(total.toString());
            outputStreamWriter.close();

暫無
暫無

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

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