首页 > 解决方案 > 由于 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("第三番 粉河寺&quot;);
    saigokuList.add("第四番 施福寺&quot;);
    saigokuList.add("第五番 葛井寺&quot;);
    saigokuList.add("第六番 南法華寺");
    saigokuList.add("第七番 龍蓋寺&quot;);
    saigokuList.add("第八番 長谷寺&quot;);
    saigokuList.add("第九番 興福寺&quot;);
    saigokuList.add("第十番 三室戸寺");
    saigokuList.add("第十一番 醍醐寺&quot;);
    saigokuList.add("第十二番 正法寺&quot;);
    saigokuList.add("第十三番 石山寺&quot;);
    saigokuList.add("第十四番 園城寺&quot;);
    saigokuList.add("第十五番 観音寺&quot;);
    saigokuList.add("第十六番 清水寺&quot;);
    saigokuList.add("第十七番 六波羅蜜寺&quot;);
    saigokuList.add("第十八番 頂法寺&quot;);
    saigokuList.add("第十九番 行願寺&quot;);
    saigokuList.add("第二十番 善峯寺&quot;);
    saigokuList.add("第二十一番 穴太寺&quot;);
    saigokuList.add("第二十二番 総持寺&quot;);
    saigokuList.add("第二十三番 勝尾寺&quot;);
    saigokuList.add("第二十四番 中山寺&quot;);
    saigokuList.add("第二十五番 清水寺&quot;);
    saigokuList.add("第二十六番 一乗寺");
    saigokuList.add("第二十七番 圓教寺&quot;);
    saigokuList.add("第二十八番 成相寺&quot;);
    saigokuList.add("第二十九番 松尾寺&quot;);
    saigokuList.add("第三十番 宝厳寺&quot;);
    saigokuList.add("第三十一番 長命寺&quot;);
    saigokuList.add("第三十二番 観音正寺");
    saigokuList.add("第三十三番 華厳寺&quot;);
    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 因为数据库中没有数据,对吧?我现在的问题是,如何进入活动添加一些注释?先感谢您。

标签: android

解决方案


如果我理解你的话,你想进入 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());
}

推荐阅读