数据库错误:“NullPointerException:尝试在空对象引用上调用虚拟方法 getApplicationInfo()...”

Ty *_*ers 1 java database sqlite android listview

我正在构建一个简单的多活动列表应用程序来练习 SQLite。我试图从数据库中获取字符串以在listview启动时显示。我收到错误

\n\n
\n

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 \'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()\'

\n
\n\n

这是代码

\n\n
public class MainActivity extends AppCompatActivity {\n    SharedPreferences sharedPreferences;\n    ArrayList<String> listItem;\n    ArrayAdapter adapter;\n    ListView lv = (ListView) findViewById(R.id.list_view);\n    DatabaseHelper db = new DatabaseHelper(this);\n    Context context;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        Toolbar toolbar = findViewById(R.id.toolbar);\n        setSupportActionBar(toolbar);\n        listItem = new ArrayList<>();\n        viewData();\n        context = this;\n\n        FloatingActionButton fab = findViewById(R.id.fab);\n        fab.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                startActivity(new Intent(MainActivity.this, textInput.class));\n            }\n        });\n    }\n\n    // cast from sql database to the listview\n    private void viewData() {\n        Cursor res = db.viewData();\n\n        if (res.getCount() == 0 ){\n            Toast.makeText(this,"No Data!",Toast.LENGTH_SHORT).show();\n        }\n        else{\n            while (res.moveToNext()){\n                listItem.add(res.getString(1));\n            }\n            adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,listItem);\n            lv.setAdapter(adapter);\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是数据库助手:

\n\n
public class DatabaseHelper extends SQLiteOpenHelper {\npublic static final String DATABASE_NAME = "item.db";\npublic static final String TABLE_NAME = "item_table";\npublic static final String ID = "item_id";\npublic static final String NAME = "item_name";\npublic static final String PRICE = "item_price";\npublic static final String URL = "item_url";\n\npublic DatabaseHelper(@Nullable Context context) {\n    super(context, DATABASE_NAME, null, 1);\n}\n\n@Override\npublic void onCreate(SQLiteDatabase db) {\n    db.execSQL("create table " + TABLE_NAME +" ( item_id INTEGER PRIMARY \nKEY AUTOINCREMENT,item_name TEXT,item_price INTEGER,item_url TEXT) ");\n}\n\n@Override\npublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n    db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);\n    onCreate(db);\n}\n\npublic boolean insertData(String name, String price, String url){\n    SQLiteDatabase db = this.getWritableDatabase();\n    ContentValues contentValues = new ContentValues();\n    contentValues.put(NAME, name);\n    contentValues.put(PRICE, price);\n    contentValues.put(URL, url);\n    long result = db.insert(TABLE_NAME,null,contentValues);\n    if(result == -1)\n        return false;\n    else\n        return true;\n}\n\n\npublic Cursor viewData(){\n    SQLiteDatabase db  = this.getReadableDatabase();\n    Cursor res = db.rawQuery("select * from "+TABLE_NAME,null);\n    return res;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是文本输入活动

\n\n
public class textInput extends AppCompatActivity {\nSharedPreferences sharedPreferences;\n//    Editor editor;\n//    Context _context;\n//    int PRIVATE_MODE = 0;\n//    private static final String PREF_NAME = "Items";\n//    public static final String NAME_LIST = "name";\n\n\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_text_input);\n    //DatabaseHelper db;\n\n    //return\'s to main activity on press\n    Button addButton = (Button) findViewById(R.id.addButton);\n    final EditText name = (EditText) findViewById(R.id.itemName);\n    final EditText url = (EditText) findViewById(R.id.itemURL);\n    final EditText price = (EditText) findViewById(R.id.itemPrice);\n //   final SharedPreferences sharedPreferences = \ngetApplicationContext().getSharedPreferences("items", 0);\n    final DatabaseHelper db = new DatabaseHelper(this);\n    addButton.setOnClickListener(new View.OnClickListener() {\n        @Override\n        public void onClick(View v) {\n            //Checks to make sure that all fields are filled out, if yes \nthen returns to MainActivity\n            if (name.length() != 0 && price.length() != 0 && url.length() \n !=0){\n                boolean isInserted = \ndb.insertData(name.getText().toString(),\n                        price.getText().toString(),\n                        url.getText().toString());\n                if(isInserted == true)\n                    Toast.makeText(textInput.this, "New Item Added", \n Toast.LENGTH_SHORT).show();\n                else\n                    Toast.makeText(textInput.this, "Failed to Add", \nToast.LENGTH_SHORT).show();\n                //The graphic and the return to MainActivity\n                Intent returnToMain = new Intent(getApplicationContext(), \nMainActivity.class);\n                startActivity(returnToMain);\n            }\n            else{\n                Toast.makeText(textInput.this, "Please fill out all \nfields!", Toast.LENGTH_SHORT).show();\n            }\n\n        }\n    });\n
Run Code Online (Sandbox Code Playgroud)\n\n

调试(错误?)日志

\n\n
E/AndroidRuntime: FATAL EXCEPTION: main\n    Process: com.example.xmaswishlist, PID: 25470\n    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.xmaswishlist/com.example.xmaswishlist.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method \'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()\' on a null object reference\n        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2841)\n        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)\n        at android.app.ActivityThread.-wrap11(Unknown Source:0)\n        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)\n        at android.os.Handler.dispatchMessage(Handler.java:105)\n        at android.os.Looper.loop(Looper.java:164)\n        at android.app.ActivityThread.main(ActivityThread.java:6944)\n        at java.lang.reflect.Method.invoke(Native Method)\n        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)\n     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method \'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()\' on a null object reference\n        at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:163)\n        at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:157)\n        at android.content.Context.obtainStyledAttributes(Context.java:655)\n        at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:692)\n        at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:659)\n        at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:479)\n        at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:214)\n        at com.example.xmaswishlist.MainActivity.<init>(MainActivity.java:36)\n        at java.lang.Class.newInstance(Native Method)\n        at android.app.Instrumentation.newActivity(Instrumentation.java:1180)\n        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2831)\n        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)\xc2\xa0\n        at android.app.ActivityThread.-wrap11(Unknown Source:0)\xc2\xa0\n        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)\xc2\xa0\n        at android.os.Handler.dispatchMessage(Handler.java:105)\xc2\xa0\n        at android.os.Looper.loop(Looper.java:164)\xc2\xa0\n        at android.app.ActivityThread.main(ActivityThread.java:6944)\xc2\xa0\n        at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)\xc2\xa0\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试使用以下方法修复此问题:

\n\n
    \n
  1. Android studio \xe2\x80\x9c 尝试在空对象引用\xe2\x80\x9d 上调用虚拟方法 android.database.Cursor 问题
  2. \n
  3. 数据库错误:尝试在空对象引用上调用虚拟方法“Cursor .getScene()”
  4. \n
  5. Android 通知时空对象引用上的“android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()”
  6. \n
\n

Md.*_*man 5

您尝试在设置内容之前获取视图setContentView,这会导致exception. 实例化ListViewDatabaseHelper在里面onCreate

ListView lv;
DatabaseHelper db;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ...

    lv = (ListView) findViewById(R.id.list_view);
    db = new DatabaseHelper(this);
    ...
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

8402 次

最近记录:

6 年,1 月 前