获取联系人列表时无法启动活动java.lang.NumberFormatException:s==null。无法定位错误

获取联系人列表时无法启动活动java.lang.NumberFormatException:s==null。无法定位错误,java,android,android-studio,runtime-error,Java,Android,Android Studio,Runtime Error,我正在学习一个关于Android开发的教程,里面有SQL。该程序用于添加和检索创建的所有联系人。当我运行它时,出现了下面的错误 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.test.contactmanager, PID: 7147 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.contactmanager/com

我正在学习一个关于Android开发的教程,里面有SQL。该程序用于添加和检索创建的所有联系人。当我运行它时,出现了下面的错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.test.contactmanager, PID: 7147
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.contactmanager/com.test.contactmanager.MainActivity}: java.lang.NumberFormatException: s == null
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.NumberFormatException: s == null
        at java.lang.Integer.parseInt(Integer.java:570)
        at java.lang.Integer.parseInt(Integer.java:643)
        at com.test.contactmanager.data.DatabaseHandler.getAllContacts(DatabaseHandler.java:132)
        at com.test.contactmanager.MainActivity.onCreate(MainActivity.java:32)
        at android.app.Activity.performCreate(Activity.java:7009)
        at android.app.Activity.performCreate(Activity.java:7000)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
有人能告诉我这个错误是什么意思吗?什么应该改变?我试过调试,但没用。在阅读之后,我知道它正在发生,因为在某个地方传递了NULL,但是在添加第一个联系人时,id应该是NULL。如果没有,请告诉我应该更改什么

这是我的联络班

公共类联系人{
//包含一个人的联系信息
字符串名;
int-id;
字符串电话号码;
公共联系人(字符串名称、整数id、字符串电话号码){
this.name=名称;
this.id=id;
this.phoneNumber=电话号码;
}
公众联络(){
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共字符串getPhoneNumber(){
返回电话号码;
}
public void setPhoneNumber(字符串phoneNumber){
this.phoneNumber=电话号码;
}
}
这是发生问题的函数

主要活动

创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatabaseHandler DatabaseHandler=新的DatabaseHandler(MainActivity.this);
触点Try2=新触点();
//设置对象的属性
Try2.集合名(“Try2”);
Try2.setPhoneNumber(“01125532553”);
Try2.setId(0);
//添加联系人
databaseHandler.addContact(Try2);
//在Log.d中显示联系人
List contactList=databaseHandler.getAllContacts();//此行出错
用于(联系人c:联系人列表)
{
Log.d(“所有联系人姓名”,“onCreate”+c.getName());
Log.d(“所有联系人”、“联系人”+c.getPhoneNumber());
Log.d(“所有联系人Id”,“联系人”+c.getId());
}
}
getAllContact()程序

公共列表getAllContacts() { List contactList=new ArrayList(); SQLiteDatabase db=this.getWritableDatabase(); String selectAll=“SELECT*FROM”+Util.TABLE\u名称; Cursor Cursor=db.rawQuery(selectAll,null); if(cursor.moveToFirst()) { 做{ 触点=新触点(); contact.setId(Integer.parseInt(cursor.getString(0));//此行出错 contact.setName(cursor.getString(1)); contact.setPhoneNumber(cursor.getString(2)); 联系人列表。添加(联系人); }while(cursor.moveToNext()); } 返回联系人列表; } 编辑: 这是我的Util类

公共类Util{
公共静态最终字符串数据库\u NAME=“contact\u db”;
公共静态最终int数据库_VERSION=1;
公共静态最终字符串表\u NAME=“contact\u TABLE”;
公共静态最终字符串键\u ID=“ID”;
公共静态最终字符串键\u NAME=“NAME”;
}
这是addContact功能(用于添加联系人)

public void addContact(联系人)
{
SQLiteDatabase db=this.getWritableDatabase();/“this”表示我们需要在*this*类中调用它。
//getWritableDatabase为我们提供了一个空数据库。
ContentValues=newcontentvalues();//为我们存储值(我们将在第65行中使用的秘密工具)
//我们现在将从contact中提取值
value.put(Util.KEY_NAME,contact.getName());
value.put(Util.KEY\u PHONE\u NUMBER,contact.getPhoneNumber());
//插入一行(它实际上做的事情可能与onCreate在上面做的事情相同)。
db.insert(Util.TABLE_NAME,null,values);//这将为db提供所需的所有值。另外,idk什么是nullColoumnHack
db.close();//记住,如果打开动态内存,请始终关闭它。不这样做会导致内存泄漏。
//日志d(“新增联系人”、“新增联系人”);
}
有人能告诉我这个错误是什么意思吗

您已经调用了
Integer.parseInt(x)
,其中x的计算结果为
null

这发生在堆栈跟踪中标记的行上(因此,
DatabaseHandler.java
的第132行,因为这是调用parseInt的代码。该parseInt随后调用另一个parseInt并引发错误)

通常,要读取堆栈跟踪,请执行以下操作:

  • 首先扫描“原因”行,然后跳过所有内容,直到找到最终原因。好吧,略读一下,它确实提供了上下文。因此,忘记关于“无法启动活动”的运行时异常。其思想是:发生了一些异常,由于该异常,活动无法启动。这是godo上下文,但最重要的问题是导致活动无法启动的原因。因此,我们得到了NumberFormatException
  • 然后,跳过未编写的类中的任何方法。因此,跳过java.lang.Number.parseInt,直到到达DatabaseHandler.java。这是关键的一行
cursor.getString(0)
解析为
null
,您将其传递给
Integer.parseInt
,这会导致空指针异常<代码>空表示:“未知、无关、不适用、未找到”。未知字符串的整数变量是什么?因此,无法判断例外情况
null
不表示“0”或“空白”-如果是
// instead of:
contact.setId(Integer.parseInt(cursor.getString(0)));

// do:
String rawId = cursor.getString(0);
if (rawId != null) contact.setId(Integer.parseInt(rawId));