2012-08-10 114 views
1

我遇到了此联系人检索代码的问题。函数getContact()将重新调用null。在j2me中检索联系人时出现空指针异常

private PIM pim; 
private ContactList clist; 

public ContactExtract(){ 
    pim=PIM.getInstance(); 
    try{ 
    clist=(ContactList) pim.openPIMList(PIM.CONTACT_LIST,PIM.READ_ONLY); 
    }catch(Exception e){} 
} 

public Vector getContact(){ 
    //ContactDetail cd[]= new ContactDetail[200]; 
    Vector v=new Vector(); 
    try{ 
     Enumeration en=clist.items(); 
     //String num=null; 
     //String temp[]=new String[2]; 
     //int i=0; 
     while(en.hasMoreElements()){ 
      Contact c=(Contact)en.nextElement(); 
      v.addElement(c); 
      //temp=c.getStringArray(Contact.NAME, i); 
      //num=c.getString(Contact.TEL, i); 
      //cd[i]=new ContactDetail(temp[0],temp[1],num); 
     } 
     clist.close(); 
    }catch(Exception e){} 
    return v; 

回答

2

您得到的NPE最有可能的原因是getContact方法中的clist值为空。最可能的原因是反过来,ContactExtract()构造函数中发生了一些异常。

但是人们永远不会知道,只要你吞下异常。如果你有兴趣,可以在网上搜索,例如java swallow exceptions,以便更详细地了解为什么这是糟糕的。同时,找出发生的事情最直接的方法是在代码中随处添加适当的日志记录,首先在catch块中添加适当的日志记录。确保没有像catch(Exception e){}这样的陈述,你的奖励将会更容易理解错误发生的原因。

catch(Exception e){ 
    Sustem.out.println("exception in openPIMList: [" + e + "]"); 
} 

在getContat方法,做差不多的,只有相应的日志消息:

catch(Exception e){ 
    Sustem.out.println("exception in getContact: [" + e + "]"); 
} 

然后,重新运行

在构造函数中,有像更换空的catch块在模拟器中编写代码并查看其控制台以查明哪里出了问题。

值得在代码中添加的另一件事是检查,记录和处理可能的空值。在getContact()方法中,clist可以为空,并且会导致所有类型的问题,但是您甚至不尝试检查并处理该问题。

1

总是尝试打印异常e。

catch(Exception e) 
{ 
    e.printStackTrace(); 
} 

您将会知道代码中的错误。