首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NullPointerException - onPause()

NullPointerException - onPause()
EN

Stack Overflow用户
提问于 2012-01-04 22:20:29
回答 3查看 543关注 0票数 0

这将是非常简单的,我希望解决,只是我是一个新手在兜圈子。

我的屏幕上有多个选项卡。下面的代码应该读取文本输入,并在选择另一个选项卡时将其值分配给共享首选项。然而,每当我切换到另一个选项卡时,我的代码就会失败,并返回一个NullPointerException --我相信我已经追踪到了下面代码的onPause(),我相信这是因为我没有正确地传递变量中的数据。

感谢您的指点!

代码语言:javascript
复制
package com.androidbook.epcsn;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

@SuppressWarnings("unused")
public class jobActivity extends Activity {   

public static final String SN_PREFERENCES  = "SiteNotePrefs";

SharedPreferences mPrefSettings;
String jobID;
String jobAddress ;
String jobPostcode ;

public void onCreate(Bundle savedInstanceState) {        
    super.onCreate(savedInstanceState);          
    setContentView(R.layout.joblayout); 

    final SharedPreferences mPrefSettings = getSharedPreferences (SN_PREFERENCES, Context.MODE_WORLD_WRITEABLE);

    initjobID();
    initjobaddress();
    initjobpostcode();
}

private void initjobpostcode() {
    EditText jobPostcode = (EditText)findViewById(R.id.jobPostcodeText);
}

private void initjobaddress() {
    EditText jobAddress = (EditText)findViewById(R.id.jobAddressText);
}

private void initjobID() {
    EditText jobID = (EditText)findViewById(R.id.jobIDText);
}

@Override
protected void onPause(){
    super.onPause();

    String strjobID = jobID;
    String strjobAddress = jobAddress;
    String strjobPostcode = jobPostcode;

    Editor editor = mPrefSettings.edit();
    editor.putString("jobID", strjobID);
    editor.putString("jobAddress", strjobAddress);
    editor.putString("jobPostcode", strjobPostcode);
    editor.commit();
}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-04 22:23:18

您可以在init方法中将值设置为局部变量,而不是预期的类属性,例如:

代码语言:javascript
复制
EditText jobID;

// Then later... it's clobberin' time.
private void initjobID() {
    EditText jobID = (EditText)findViewById(R.id.jobIDText);
}

属性jobID由方法中声明的本地jobID设置为shadowed

(Java约定会将方法命名为initJobId__,将属性命名为jobId__)。

要在init方法中设置实例属性,请删除本地声明并使用以下模式:

代码语言:javascript
复制
EditText jobID;
private void initjobID() {
    jobID = (EditText)findViewById(R.id.jobIDText);
}
票数 4
EN

Stack Overflow用户

发布于 2012-01-04 22:27:31

我想这是因为你正在设置

代码语言:javascript
复制
final SharedPreferences mPrefSettings = getSharedPreferences (SN_PREFERENCES, Context.MODE_WORLD_WRITEABLE);

绑定到局部变量,而不是类成员字段。

因此,例外可能在以下位置:

代码语言:javascript
复制
mPrefSettings.edit();

因为它仍然是null (从未在init方法中设置)。

尝试将其更改为:

代码语言:javascript
复制
mPrefSettings = getSharedPreferences (SN_PREFERENCES, Context.MODE_WORLD_WRITEABLE);

也要小心你的其他初始化方法,比如initjobID,因为它们也在犯同样的错误。

将您的类更改为:

代码语言:javascript
复制
package com.androidbook.epcsn;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

@SuppressWarnings("unused")
public class jobActivity extends Activity {   

public static final String SN_PREFERENCES  = "SiteNotePrefs";

SharedPreferences mPrefSettings;
String jobID;
String jobAddress ;
String jobPostcode ;

public void onCreate(Bundle savedInstanceState) {        
    super.onCreate(savedInstanceState);          
    setContentView(R.layout.joblayout); 

    mPrefSettings = getSharedPreferences (SN_PREFERENCES, Context.MODE_WORLD_WRITEABLE);

    initjobID();
    initjobaddress();
    initjobpostcode();
}

private void initjobpostcode() {
    jobPostcode = (EditText)findViewById(R.id.jobPostcodeText);
}

private void initjobaddress() {
    jobAddress = (EditText)findViewById(R.id.jobAddressText);
}

private void initjobID() {
    jobID = (EditText)findViewById(R.id.jobIDText);
}

@Override
protected void onPause(){
    super.onPause();

    String strjobID = jobID;
    String strjobAddress = jobAddress;
    String strjobPostcode = jobPostcode;

    Editor editor = mPrefSettings.edit();
    editor.putString("jobID", strjobID);
    editor.putString("jobAddress", strjobAddress);
    editor.putString("jobPostcode", strjobPostcode);
    editor.commit();
}
}
票数 0
EN

Stack Overflow用户

发布于 2012-01-04 22:28:50

您在onCreate()期间设置的变量与您在类级别声明的变量不同。这实际上是对如何在Java中声明和修改变量内容的基本误解。请看下面的链接,也许它会帮助你理解。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html

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

https://stackoverflow.com/questions/8728353

复制
相关文章

相似问题

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