Java 创建新SharedReferences文件时出现NullPointerException
除非我错了,否则调用GetSharedReferences(“someName”,0)应该只是创建一个新文件,如果手机内存中不存在文件,对吗 不幸的是,这只是给了我一个NPE。代码和LogCat如下所示 新城级别:Java 创建新SharedReferences文件时出现NullPointerException,java,android,nullpointerexception,Java,Android,Nullpointerexception,除非我错了,否则调用GetSharedReferences(“someName”,0)应该只是创建一个新文件,如果手机内存中不存在文件,对吗 不幸的是,这只是给了我一个NPE。代码和LogCat如下所示 新城级别: public class NewCity extends Activity implements OnClickListener, OnCheckedChangeListener { public static City city; private Generator
public class NewCity extends Activity implements OnClickListener, OnCheckedChangeListener {
public static City city;
private Generator gen;
RadioGroup popGroup;
RadioButton random, specific;
Spinner cityType, supplies;
EditText cityName, customPop;
CheckBox fishing, mining, forestry;
Button next;
TextView errorList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.newcity);
initializeRefs();
}
private void initializeRefs() {
popGroup = (RadioGroup) findViewById(R.id.popGroup);
random = (RadioButton) findViewById(R.id.radioRandomCity);
specific = (RadioButton) findViewById(R.id.radioSpecificCity);
cityType = (Spinner) findViewById(R.id.spinCityType);
supplies = (Spinner) findViewById(R.id.spinSupplies);
cityName = (EditText) findViewById(R.id.textCityName);
customPop = (EditText) findViewById(R.id.textCustomPop);
fishing = (CheckBox) findViewById(R.id.checkFishing);
mining = (CheckBox) findViewById(R.id.checkMining);
forestry = (CheckBox) findViewById(R.id.checkForestry);
next = (Button) findViewById(R.id.bNewNext);
errorList = (TextView) findViewById(R.id.errorList);
popGroup.setOnCheckedChangeListener(this);
next.setOnClickListener(this);
customPop.setEnabled(false);
}
@Override
public void onClick(View view) {
boolean canGenerate = true;
ArrayList<String> errors = new ArrayList<String>();
switch(view.getId()) {
case R.id.bNewNext:
if(cityName.getText().toString().matches("")) {
errors.add("! Settlement must have a name.\n");
canGenerate = false;
}
if(specific.isChecked() && customPop.getText().toString().matches("")) {
errors.add("! Enter a population figure.\n");
canGenerate = false;
}
break;
}
if(canGenerate) {
gen = new Generator(getBaseContext());
errors.clear();
sendCityData(cityName.getText().toString());
gen.createCity();
} else {
StringBuilder builder = new StringBuilder();
for(String value : errors) {
builder.append(value);
}
errorList.setText(builder.toString());
errors.clear();
}
}
.... Unrelated code ....
}
日志:
10-08 20:22:28.598: E/AndroidRuntime(21336): FATAL EXCEPTION: main
10-08 20:22:28.598: E/AndroidRuntime(21336): java.lang.NullPointerException
10-08 20:22:28.598: E/AndroidRuntime(21336): at com.flawedspirit.android.citygen.Generator.<init>(Generator.java:17)
10-08 20:22:28.598: E/AndroidRuntime(21336): at com.flawedspirit.android.citygen.NewCity.onClick(NewCity.java:77)
10-08 20:22:28.598: E/AndroidRuntime(21336): at android.view.View.performClick(View.java:4203)
10-08 20:22:28.598: E/AndroidRuntime(21336): at android.view.View$PerformClick.run(View.java:17189)
10-08 20:22:28.598: E/AndroidRuntime(21336): at android.os.Handler.handleCallback(Handler.java:615)
10-08 20:22:28.598: E/AndroidRuntime(21336): at android.os.Handler.dispatchMessage(Handler.java:92)
10-08 20:22:28.598: E/AndroidRuntime(21336): at android.os.Looper.loop(Looper.java:137)
10-08 20:22:28.598: E/AndroidRuntime(21336): at android.app.ActivityThread.main(ActivityThread.java:4961)
10-08 20:22:28.598: E/AndroidRuntime(21336): at java.lang.reflect.Method.invokeNative(Native Method)
10-08 20:22:28.598: E/AndroidRuntime(21336): at java.lang.reflect.Method.invoke(Method.java:511)
10-08 20:22:28.598: E/AndroidRuntime(21336): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
10-08 20:22:28.598: E/AndroidRuntime(21336): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
10-08 20:22:28.598: E/AndroidRuntime(21336): at dalvik.system.NativeStart.main(Native Method)
编辑:好的,现在我知道问题是:在创建城市之前,您正在访问城市。因此,请参见下面的代码
@Override
public void onClick(View view) {
boolean canGenerate = true;
ArrayList<String> errors = new ArrayList<String>();
switch(view.getId()) {
case R.id.bNewNext:
if(cityName.getText().toString().matches("")) {
errors.add("! Settlement must have a name.\n");
canGenerate = false;
}
if(specific.isChecked() && customPop.getText().toString().matches("")) {
errors.add("! Enter a population figure.\n");
canGenerate = false;
}
break;
}
if(canGenerate) {
// Here, you should run this method first
sendCityData(cityName.getText().toString());
gen = new Generator(getBaseContext());
errors.clear();
gen.createCity();
} else {
StringBuilder builder = new StringBuilder();
for(String value : errors) {
builder.append(value);
}
errorList.setText(builder.toString());
errors.clear();
}
}
@覆盖
公共void onClick(视图){
布尔值canGenerate=true;
ArrayList errors=新建ArrayList();
开关(view.getId()){
案例R.id.bNewNext:
如果(cityName.getText().toString().matches(“”)匹配{
错误。添加(“!结算必须有名称。\n”);
canGenerate=false;
}
if(specific.isChecked()&&customPop.getText().toString().matches(“”){
错误。添加(“!输入人口数字。\n”);
canGenerate=false;
}
打破
}
if(canGenerate){
//在这里,您应该首先运行这个方法
sendCityData(cityName.getText().toString());
gen=新生成器(getBaseContext());
错误。清除();
createCity将军();
}否则{
StringBuilder=新的StringBuilder();
for(字符串值:错误){
附加(值);
}
errorList.setText(builder.toString());
错误。清除();
}
}
我猜在第17行,city为null,因为NewCity.city为null。我已经确定它有一个值,所以它不是null。为了确保,我将其更改为静态字符串,它给了我完全相同的错误。我仍然不确定,但是创建一个新的构造函数,它也显式地接受City
,并从中访问名称如何?试试这个:edit.putString(“name”,“test”).apply();如果你犯了同样的错误,你就知道问题不在城市。我已经做到了,现在也行了。所以问题在于我的City类没有实例化它的name变量。我不知道为什么,因为类的构造函数需要给name变量一个字符串。City类只能在onCreate方法中初始化吗?我这样做是因为在我的代码中,我在sendCityData方法(onClick中调用的方法)中初始化它,因为我从EditText中提取用户的输入,并将其作为城市名称发送给类。
public class City {
private static final int PEOPLE_PER_SQACRE = 61;
private static final int PEOPLE_PER_SQMILE = 38850;
private String name;
private String type;
private int population;
private float sizeMi;
private float sizeAc;
private int gpLimit;
private long wealth;
private float lowPop;
private float highPop;
private boolean fishing;
private boolean mining;
private boolean forestry;
public City(String name) {
this.name = name;
}
.... Unrelated code ....
}
@Override
public void onClick(View view) {
boolean canGenerate = true;
ArrayList<String> errors = new ArrayList<String>();
switch(view.getId()) {
case R.id.bNewNext:
if(cityName.getText().toString().matches("")) {
errors.add("! Settlement must have a name.\n");
canGenerate = false;
}
if(specific.isChecked() && customPop.getText().toString().matches("")) {
errors.add("! Enter a population figure.\n");
canGenerate = false;
}
break;
}
if(canGenerate) {
// Here, you should run this method first
sendCityData(cityName.getText().toString());
gen = new Generator(getBaseContext());
errors.clear();
gen.createCity();
} else {
StringBuilder builder = new StringBuilder();
for(String value : errors) {
builder.append(value);
}
errorList.setText(builder.toString());
errors.clear();
}
}