Java 为什么我会得到NullPointerException?bufferWriter.close()
我是新手,但我正在编写一个应用程序,我不断收到这个错误,导致应用程序在启动时崩溃Java 为什么我会得到NullPointerException?bufferWriter.close(),java,android,Java,Android,我是新手,但我正在编写一个应用程序,我不断收到这个错误,导致应用程序在启动时崩溃 java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.BufferedWriter.close()' on a null object reference 导致该问题的代码在下面的类中,在问题行的旁边将有一个HERE注释 public class FileOptions extends Activity{ p
java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.BufferedWriter.close()' on a null object reference
导致该问题的代码在下面的类中,在问题行的旁边将有一个HERE注释
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)
感谢您的帮助。当您的openFileOutput方法引发异常时,会发生这种情况
由于引发异常,bufferWriter未初始化为有效对象
异常导致执行跳过try块的其余部分,转到catch块,然后是finally块
因此,当它到达finally块时,bufferWriter为null
要修复此问题,请在调用close in bufferWriter之前检查null
或者更好地利用资源
从外观上看,您的bufferWriter为空。那么也许你提供的文件不起作用了?如果bufferwriter为null,则会停止NPE。Java7为try-catch块提供了更干净的接口
您可以阅读更多关于替代方法的内容
发现了问题。我需要将我从中调用的类的上下文传递给方法,使其工作 我有:file.createFileuserInfo;我需要:file.createFileuserInfo,这个 然后在我的方法中:
public void createFile(String title, String storeValue){
BufferedWriter bufferWriter = null;
try {
FileOutputStream fileOutputStream = openFileOutput(title, context.MODE_PRIVATE);
bufferWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
在我需要的地方:
public void createFile(String title, String storeValue, /** ADDED */Context context){
BufferedWriter bufferWriter = null;
try {
FileOutputStream fileOutputStream = /** CHANGE IS HERE */ context.openFileOutput(title, context.MODE_PRIVATE);
bufferWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
在调用bufferWriter.close之前查看的stacktracepossible副本会很有帮助。请检查它是否为null。如果为空,您不能调用.close,它返回NPE。这可能类似,但我觉得由于代码中的差异,可以问一个新问题。如果我不将它划分为一个类,那么相同的代码也可以工作,所以我想这就是我要做的。我知道你可以检查它是否为空,但它不会创建我认为需要的文件?
finally {
if(bufferWriter!=null){
bufferWriter.close();/**HERE*/
}
}
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();
}
}
public void createFile(String title, String storeValue){
BufferedWriter bufferWriter = null;
try {
FileOutputStream fileOutputStream = openFileOutput(title, context.MODE_PRIVATE);
bufferWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
public void createFile(String title, String storeValue, /** ADDED */Context context){
BufferedWriter bufferWriter = null;
try {
FileOutputStream fileOutputStream = /** CHANGE IS HERE */ context.openFileOutput(title, context.MODE_PRIVATE);
bufferWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));