当前位置: 首页 > 知识库问答 >
问题:

为什么我得到NullPointerExcema?riter.close

宦砚
2023-03-14

我是新手,但我正在编写一个应用程序,我不断收到这个错误,导致应用程序在启动时崩溃。

java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.BufferedWriter.close()' on a null object reference

导致它的代码在下面的类中,在问题的行旁边会有一个这里的注释。

public class FileOptions extends Activity{

public void createFile(String title, String storeValue){
    BufferedWriter bufferWriter = null;
    try {
        FileOutputStream fileOutputStream = openFileOutput(title, Context.MODE_PRIVATE);
        bufferWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));

        String content = storeValue;

        bufferWriter.write(content);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    catch (IOException e) {  //Cannot be removed
        e.printStackTrace();
    }
    finally {
        try {
       /**HERE*/ bufferWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
//More unimportant stuff
}

这就是我调用方法的代码。

public class MainActivity extends ActionBarActivity {
Context context = this;
boolean debug = true;
FileOptions file = new FileOptions();
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Boolean isFirstRun = getSharedPreferences("PREFERENCE", MODE_PRIVATE)
            .getBoolean("isfirstrun", true);

    if(isFirstRun) {
        file.createFile("userInfo", "");
        getSharedPreferences("PREFERENCE", MODE_PRIVATE).edit()
                .putBoolean("isfirstrun", false).commit();
    }

    if(file.readFile("userInfo") != "")
    {
        if(debug){alerter(file.readFile("userInfo"));alerter("true");}
        switchToHome();
    }else{
        if(debug){alerter("false");}
    }
}
}

这是堆栈跟踪。

08-27 22:44:35.830  13089-13089/? I/libpersona﹕ KNOX_SDCARD checking this for 10247

08-27 22:44:35.830  13089-13089/? I/libpersona﹕ KNOX_SDCARD not a persona

08-27 22:44:35.830  13089-13089/? E/Zygote﹕ MountEmulatedStorage()

08-27 22:44:35.830  13089-13089/? E/Zygote﹕ v2

08-27 22:44:35.830  13089-13089/? I/SELinux﹕ Function: selinux_compare_spd_ram, SPD-policy is existed. and_ver=SEPF_SM-N910V_5.0.1 ver=27

08-27 22:44:35.830  13089-13089/? I/SELinux﹕ Function: selinux_compare_spd_ram , priority [1] , priority version is VE=SEPF_SM-N910V_5.0.1_0027

08-27 22:44:35.830  13089-13089/? E/SELinux﹕ [DEBUG] get_category: variable seinfo: default sensitivity: NULL, cateogry: NULL

08-27 22:44:35.830  13089-13089/? I/art﹕ Late-enabling -Xcheck:jni

08-27 22:44:35.870  13089-13089/? D/TimaKeyStoreProvider﹕ TimaSignature is unavailable

08-27 22:44:35.870  13089-13089/? D/ActivityThread﹕ Added TimaKeyStore provider

08-27 22:44:35.920  13089-13089/? D/ResourcesManager﹕ creating new AssetManager 
and set to /data/app/preventioninnovations.preventapp-2/base.apk

08-27 22:44:36.050  13089-13089/? D/AndroidRuntime﹕ Shutting down VM

08-27 22:44:36.050  13089-13089/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: preventioninnovations.preventapp, PID: 13089
    java.lang.RuntimeException: Unable to start activity ComponentInfo{preventioninnovations.preventapp/preventioninnovations.preventapp.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.BufferedWriter.close()' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2712)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2777)
            at android.app.ActivityThread.access$900(ActivityThread.java:179)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1462)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5972)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.BufferedWriter.close()' on a null object reference
            at preventioninnovations.preventapp.FileOptions.createFile(FileOptions.java:37)
            at preventioninnovations.preventapp.MainActivity.onCreate(MainActivity.java:38)
            at android.app.Activity.performCreate(Activity.java:6289)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2777)
            at android.app.ActivityThread.access$900(ActivityThread.java:179)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1462)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5972)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)

谢谢你的帮助。

共有3个答案

狄宜然
2023-03-14

Java7为尝试捕捉块提供了一个更干净的界面。

你可以从这个答案中阅读更多关于替代方法的信息。

public void createFile(String title, String storeValue){
    try (
        FileOutputStream fileOutputStream = openFileOutput(title, Context.MODE_PRIVATE);
        BufferedWriter bufferWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream))
    ) {
        String content = storeValue;
        bufferWriter.write(content);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}
詹唯
2023-03-14
finally {
    if(bufferWriter!=null){
        bufferWriter.close();/**HERE*/
    }
}

从外观上看,您的缓冲区为空。所以也许你给它的文件不起作用?如果缓冲区写入器为空,则停止NPE。

苏高远
2023-03-14

当您的openFileOutput()方法抛出异常时,就会发生这种情况。

由于引发异常,bufferWriter未初始化为有效对象。

异常导致执行跳过try块的其余部分,转到catch块,然后执行finally块。

因此,当它到达最终块时,BufferWriternull

finally {
        try {
            if (bufferWriter != null)
                bufferWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

要修复此问题,请在调用BufferWriter中的关闭之前检查null

或者更好地使用资源尝试。

try(BufferedWriter = new BufferedWriter(
                         new OutputStreamWriter(
                             openFileOutput(title, Context.MODE_PRIVATE)))) {}
 类似资料:
  • 问题内容: public class Category { 在正在生成。 问题答案: 当您执行时,您称呼孩子们的。这里没有问题,只不过您在这里调用了父对象。这将称呼孩子,等等。 不错的无限循环。 摆脱它的最好方法是将您的方法更改为: 这样,您将不打印parentCategory,而仅显示其名称,不显示无限循环,不显示StackOverflowError。 编辑: 正如博洛在下面说的那样,您将需要检

  • 问题内容: 我知道静态方法在类级别。因此,我知道我不需要创建实例来调用静态方法。但我也知道我可以将静态方法(如LIKE)称为实例方法。这是我感到困惑的地方,因为我期望从null对象调用静态方法(就像在调用实例方法中一样)。我真的很感谢一些解释,为什么我错了一个期望。 这是示例代码: 问题答案: 通过实例调用静态方法不需要实例存在。只要编译器能够确定变量的类型,它就可以在评估表达式并丢弃结果后静态进

  • E/AndroidRuntime:致命异常:main Process:com.marsad.wallpaperApp,pid:20425 java.lang.ArithmeticException:divide by zero 嗨,当我点击gif图像应用作为动态壁纸,大多数情况下一切都很好,但有时应用程序崩溃与错误 logcat E/AndroidRuntime:致命异常:主进程:com.mars

  • 这是我的父类,有两个名为的方法。带有参数的那个在子类中使用。 这是我的子类,在子类的方法中,我使用父类的方法: 当我尝试显示子类的对象时,我得到以下错误: 线程“main”java.lang.StackOverflowError中出现异常

  • URL类 来自服务器的最终响应:

  • 问题内容: 我正在尝试下载一个zip文件,但出现了 Stream Closed Exception 。当我使用Swing GUI时,会出现此错误,但是如果我使用控制台,则不会有问题。为什么会出现此异常?我该如何解决? 这是我的代码: 这是堆栈跟踪 问题答案: 此异常通常表示连接突然关闭。我将查看服务器上的日志,看看是否有错误。