【发布时间】:2021-06-13 17:57:12
【问题描述】:
我的应用程序中有Attempt to invoke virtual method 'java.util.List com.example.demo.Database.Database.getName()' on a null object reference 错误,我使用Database database = new Database(this); 代码解决了该错误。
现在有一个新错误
E/AndroidRuntime: 致命异常: main 进程:com.example.demo,PID:19678 java.lang.RuntimeException:无法实例化活动 ComponentInfo{com.example.demo/com.example.demo.MainActivity}:java.lang.NullPointerException:尝试调用虚拟方法 'android.content.pm .ApplicationInfo android.content.Context.getApplicationInfo()' 在空对象引用上 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3132) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415) 在 android.app.ActivityThread.-wrap17(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:7325) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' 在 android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:162) 在 com.readystatesoftware.sqliteasset.SQLiteAssetHelper.(SQLiteAssetHelper.java:109) 在 com.readystatesoftware.sqliteasset.SQLiteAssetHelper.(SQLiteAssetHelper.java:129) 在 com.example.demo.Database.Database.(Database.java:20) 在 com.example.demo.MainActivity.(MainActivity.java:28) 在 java.lang.Class.newInstance(本机方法) 在 android.app.Instrumentation.newActivity(Instrumentation.java:1096) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3122) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415) 在 android.app.ActivityThread.-wrap17(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:7325) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
这是我的 MainActivity.java 代码
公共类 MainActivity 扩展 AppCompatActivity {
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
SearchAdapter adapter;
private Context context;
MaterialSearchBar materialSearchBar;
List<String> suggestList = new ArrayList<>();
Database database = new Database(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView)findViewById(R.id.recycler_search);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
materialSearchBar =(MaterialSearchBar)findViewById(R.id.search_bar);
materialSearchBar.setHint("Search");
materialSearchBar.setCardViewElevation(10);
LoadSuggestList();
materialSearchBar.addTextChangeListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
List<String> suggest = new ArrayList<>();
for(String search:suggestList)
{
if(search.toLowerCase().contains(materialSearchBar.getText().toLowerCase()))
suggest.add(search);
}
materialSearchBar.setLastSuggestions(suggest);
}
@Override
public void afterTextChanged(Editable s) {
}
});
materialSearchBar.setOnSearchActionListener(new MaterialSearchBar.OnSearchActionListener(){
@Override
public void onSearchStateChanged(boolean enabled) {
if(!enabled)
{
adapter = new SearchAdapter(getBaseContext(),database.getPharmacy());
recyclerView.setAdapter(adapter);
}
//recyclerView.setAdapter(adapter);
}
@Override
public void onSearchConfirmed(CharSequence text) {
startSearch(text.toString());
}
@Override
public void onButtonClicked(int buttonCode) {
}
});
adapter = new SearchAdapter(this,database.getPharmacy());
recyclerView.setAdapter(adapter);
}
private void startSearch(String text){
adapter = new SearchAdapter(this, database.getPharmacyByCity(text));
recyclerView.setAdapter(adapter);
}
private void LoadSuggestList() {
suggestList = database.getName();
materialSearchBar.setLastSuggestions(suggestList);
}
这是我的 Database.java 代码
public class Database extends SQLiteAssetHelper {
private static final String DB_NAME = "pharmacyDemo.db";
private static final int DB_VER = 1;
public Database(Context context) {
super(context, DB_NAME, null, DB_VER);
}
public List<Pharmacy> getPharmacy(){
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qd = new SQLiteQueryBuilder();
String[] sqlSelect ={"ID","Name","City","Phone"};
String tableName = "Pharmacy_List";
qd.setTables(tableName);
Cursor cursor = qd.query(db,sqlSelect,null, null ,null , null , null);
List<Pharmacy> result = new ArrayList<>();
if(cursor.moveToFirst())
{
do{
Pharmacy pharmacy = new Pharmacy();
pharmacy.setID(cursor.getInt(cursor.getColumnIndex("ID")));
pharmacy.setName(cursor.getString(cursor.getColumnIndex("Name")));
pharmacy.setCity(cursor.getString(cursor.getColumnIndex("City")));
pharmacy.setPhone(cursor.getString(cursor.getColumnIndex("Phone")));
result.add(pharmacy);
}
while(cursor.moveToNext());
}
return result;
}
public List<String> getName(){
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qd = new SQLiteQueryBuilder();
String[] sqlSelect ={"Name"};
String tableName = "Pharmacy_List";
qd.setTables(tableName);
Cursor cursor = qd.query(db,sqlSelect,null, null ,null , null , null);
List<String> result = new ArrayList<>();
if(cursor.moveToFirst())
{
do{
result.add(cursor.getString(cursor.getColumnIndex("Name")));
}
while(cursor.moveToNext());
}
return result;
}
public List<Pharmacy> getPharmacyByCity(String city){
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qd = new SQLiteQueryBuilder();
String[] sqlSelect ={"ID","Name","City","Phone"};
String tableName = "Pharmacy_List";
qd.setTables(tableName);
Cursor cursor = qd.query(db,sqlSelect,"City = ?", new String[]{city},null , null , null);
List<Pharmacy> result = new ArrayList<>();
if(cursor.moveToFirst())
{
do{
Pharmacy pharmacy = new Pharmacy();
pharmacy.setID(cursor.getInt(cursor.getColumnIndex("ID")));
pharmacy.setName(cursor.getString(cursor.getColumnIndex("Name")));
pharmacy.setCity(cursor.getString(cursor.getColumnIndex("City")));
pharmacy.setPhone(cursor.getString(cursor.getColumnIndex("Phone")));
result.add(pharmacy);
}
while(cursor.moveToNext());
}
return result;
}
【问题讨论】:
-
请告诉我错误在哪个文件中并突出显示该行。
-
错误在 Logcat 中。
Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
标签: java android-studio