android - 由于 NullPointerException,无法启动活动 ComponentInfo
问题描述
我是一个非常初学者,我正在制作一个带有不同日本寺庙列表的小应用程序。当您单击其中一个寺庙时,您应该能够做一些笔记。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lvTempel = findViewById(R.id.lvSaigoku);
List<String> saigokuList = createSaigokuList();
ArrayAdapter<String> adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, saigokuList);
lvTempel.setAdapter(adapter);
lvTempel.setOnItemClickListener(new ListItemClickListener());
}
private List<String> createSaigokuList() {
List<String> saigokuList = new ArrayList<>();
saigokuList.add("第一番 青岸渡寺");
saigokuList.add("第二番 金剛宝寺");
saigokuList.add("第三番 粉河寺");
saigokuList.add("第四番 施福寺");
saigokuList.add("第五番 葛井寺");
saigokuList.add("第六番 南法華寺");
saigokuList.add("第七番 龍蓋寺");
saigokuList.add("第八番 長谷寺");
saigokuList.add("第九番 興福寺");
saigokuList.add("第十番 三室戸寺");
saigokuList.add("第十一番 醍醐寺");
saigokuList.add("第十二番 正法寺");
saigokuList.add("第十三番 石山寺");
saigokuList.add("第十四番 園城寺");
saigokuList.add("第十五番 観音寺");
saigokuList.add("第十六番 清水寺");
saigokuList.add("第十七番 六波羅蜜寺");
saigokuList.add("第十八番 頂法寺");
saigokuList.add("第十九番 行願寺");
saigokuList.add("第二十番 善峯寺");
saigokuList.add("第二十一番 穴太寺");
saigokuList.add("第二十二番 総持寺");
saigokuList.add("第二十三番 勝尾寺");
saigokuList.add("第二十四番 中山寺");
saigokuList.add("第二十五番 清水寺");
saigokuList.add("第二十六番 一乗寺");
saigokuList.add("第二十七番 圓教寺");
saigokuList.add("第二十八番 成相寺");
saigokuList.add("第二十九番 松尾寺");
saigokuList.add("第三十番 宝厳寺");
saigokuList.add("第三十一番 長命寺");
saigokuList.add("第三十二番 観音正寺");
saigokuList.add("第三十三番 華厳寺");
return saigokuList;
}
private class ListItemClickListener implements AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String tempelName = (String) parent.getItemAtPosition(position);
Intent intent = new Intent (getApplicationContext(), TempelEditActivity.class);
intent.putExtra("selectedTempleNo", position);
intent.putExtra("selectedTempleName", tempelName);
startActivity(intent);
}
}
}
public class TempelEditActivity extends AppCompatActivity {
private int _selectedTempleNo = 0;
private String _selectedTempelName = "";
private DatabaseHelper _helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temple_edit);
Intent intent = getIntent();
_selectedTempleNo = intent.getIntExtra("selectedTempleNo", 0);
_selectedTempelName = intent.getStringExtra("selectedTempleName");
_helper = new DatabaseHelper(getApplicationContext());
TextView tvTemple = findViewById(R.id.tvTempel);
tvTemple.setText(_selectedTempelName);
SQLiteDatabase db = _helper.getWritableDatabase();
Tempel content = DataAccess.findContentByPK(db, _selectedTempleNo);
EditText etHonzon = findViewById(R.id.tvHonzon);
EditText etShushi = findViewById(R.id.tvShushi);
EditText etAddress = findViewById(R.id.tvAddress);
EditText etUrl = findViewById(R.id.tvURL);
EditText etNote = findViewById(R.id.tvNote);
etHonzon.setText(content.getHonzon());
etShushi.setText(content.getShushi());
etAddress.setText(content.getAddress());
etUrl.setText(content.getUrl());
etNote.setText(content.getNote());
}
@Override
protected void onDestroy() {
super.onDestroy();
_helper.close();
}
}
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATANASE_NAME = "temple.db";
private static final int DATABASE_VERSION = 1;
public DatabaseHelper(Context context) {
super(context, DATANASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
StringBuilder sb = new StringBuilder();
sb.append("CREATE TABLE temples (");
sb.append("_id INTEGER,");
sb.append("name TEXT NOT NULL,");
sb.append("honzon TEXT,");
sb.append("shushi TEXT,");
sb.append("address TEXT,");
sb.append("url TEXT,");
sb.append("note TEXY");
sb.append("PRIMARY KEY _id");
sb.append(");");
String sql = sb.toString();
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
}
}
public class DataAccess {
public static Tempel findContentByPK(SQLiteDatabase db, int id) {
String sql = "SELECT * FROM temples WHERE _id = " + id;
Cursor cursor = db.rawQuery(sql, null);
Tempel result = null;
if(cursor.moveToFirst()) {
int idxName = cursor.getColumnIndex("name");
int idxHonzon = cursor.getColumnIndex("honzon");
int idxShushi = cursor.getColumnIndex("shushi");
int idxAddress = cursor.getColumnIndex("address");
int idxUrl = cursor.getColumnIndex("url");
int idxNote = cursor.getColumnIndex("note");
String name = cursor.getString(idxName);
String honzon = cursor.getString(idxHonzon);
String shushi = cursor.getString(idxShushi);
String address = cursor.getString(idxAddress);
String url = cursor.getString(idxUrl);
String note = cursor.getString(idxNote);
result = new Tempel();
result.set_id(id);
result.setName(name);
result.setHonzon(honzon);
result.setShushi(shushi);
result.setAddress(address);
result.setUrl(url);
result.setNote(note);
}
return result;
}
public static int update(SQLiteDatabase db, long id, String name, String honzon, String shushi, String address, String url, String note) {
String sql = "UPDATE temples SET name = ?, honzon = ?, shushi = ?, address = ?, url = ?, note = ? WHERE id = ?";
SQLiteStatement stmt = db.compileStatement(sql);
stmt.bindString(1, name);
stmt.bindString(2, honzon);
stmt.bindString(3, shushi);
stmt.bindString(4, address);
stmt.bindString(5, url);
stmt.bindString(6, note);
stmt.bindLong(7, id);
int result = stmt.executeUpdateDelete();
return result;
}
public static long insert(SQLiteDatabase db, long id, String name, String honzon, String shushi, String address, String url, String note) {
String sql = "INSERT INTO temples (_id, name, honzon, shushi, address, url, note) VALUES (?, ?, ?, ?, ?, ?, ?)";
SQLiteStatement stmt = db.compileStatement(sql);
stmt.bindLong(1, id);
stmt.bindString(2, name);
stmt.bindString(3, honzon);
stmt.bindString(4, shushi);
stmt.bindString(5, address);
stmt.bindString(6, url);
stmt.bindString(7, note);
long insertedId = stmt.executeInsert();
return insertedId;
}
public static boolean findRowByPK(SQLiteDatabase db, long id) {
String sql = "SELECT COUNT(*) AS count FROM tempels WHERE _id = " + id;
Cursor cursor = db.rawQuery(sql, null);
boolean result = false;
if (cursor.moveToFirst()) {
int idxCount = cursor.getColumnIndex("count");
int count = cursor.getInt(idxCount);
if (count >= 1) {
result = true;
}
}
return result;
}
}
但是,当我单击其中一个列表项时,出现以下错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: local.hal.an25.android.saigoku33memo, PID: 27579
java.lang.RuntimeException: Unable to start activity ComponentInfo{local.hal.an25.android.saigoku33memo/local.hal.an25.android.saigoku33memo.TempelEditActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String local.hal.an25.android.saigoku33memo.Tempel.getHonzon()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String local.hal.an25.android.saigoku33memo.Tempel.getHonzon()' on a null object reference
at local.hal.an25.android.saigoku33memo.TempelEditActivity.onCreate(TempelEditActivity.java:40)
at android.app.Activity.performCreate(Activity.java:7802)
at android.app.Activity.performCreate(Activity.java:7791)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
对于初学者,很明显我得到了 NullPointeException 因为数据库中没有数据,对吧?我现在的问题是,如何进入活动添加一些注释?先感谢您。
解决方案
如果我理解你的话,你想进入 TempelEditActivity 并插入到数据库注释中。开始活动时您的内容为空,您需要在 TempelEditActivity 方法 onCreate() 中添加检查此变量:
if (content != null) {
etHonzon.setText(content.getHonzon());
etShushi.setText(content.getShushi());
etAddress.setText(content.getAddress());
etUrl.setText(content.getUrl());
etNote.setText(content.getNote());
}
推荐阅读
- android - 旧布局显示新活动
- python-3.x - dicscord.py 重写不让我发送图像
- amazon-web-services - 将 AWS RDS 从标准版“降级”到 Web 版
- groovy - Groovy 复制文件,修改值并保存
- java - TWA 应用程序错误:java.lang.NoClassDefFoundError
- ios - 从 UITableViewCell 中删除单个分隔线
- wso2 - WSO2IS 5.10.0 - deployment.toml 中缺少用户存储属性
- python-3.x - 将输入字符串覆盖为整数
- junit - 由于 Bcrypt 加密,在单元测试期间更新 CRUD 出现问题
- java - 无法在显示图标之间延迟