错误:NullPointerAccess:变量“”在此位置只能为空
Posted
技术标签:
【中文标题】错误:NullPointerAccess:变量“”在此位置只能为空【英文标题】:Error: NullPointerAccess: The variable " " can only be null at this location 【发布时间】:2011-06-22 01:08:33 【问题描述】:我正在创建一个 Web 服务来查询我的数据库并返回数据库中的对象列表。我收到错误消息:NullPointerAccess:变量“varname”在此位置只能为空。无论我将变量放在哪里,都会收到相同的警告。无论我在变量中放入什么,它都会返回 null。下面是它发生的方法:
public List<Contacts> getUsers()
String test = null;
String username = "root";
String password = "ticket";
String tablename = "users";
String fieldname = "*";
String query = "SELECT " + fieldname + " FROM " + "android." + tablename + ";";
Contacts cont = new Contacts();
List<Contacts> lstc = null;
/* this chnk of code can appear more or less verbatim */
/* in your database apps (including JSPs) */
String url = "jdbc:mysql://"my IP address":3306/android";
try
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection con = DriverManager.getConnection(url, username, password);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next())
if (!(rs.getString("username") == null))
cont.setUsername(rs.getString("username"));
if (!(rs.getString("location") == null))
cont.setLocation(rs.getString("location"));
if (!(rs.getString("updated_at") == null))
cont.setUpdated_at(rs.getDate("updated_at"));
if (!(rs.getString("idUsers") == null))
cont.setId(rs.getInt("idUsers"));
rs.close();
stmt.close();
con.close();
catch(Exception e)
test = e.toString();
lstc.add(cont); //THIS IS THE VARIABLE THAT IS GIVING THE WARNINGS
test = "blahbadslf";
return lstc;
收到警告的变量是我的 List lstc 变量。当我尝试将对象添加到列表时,我得到了错误。任何帮助将非常感激。这是以防万一的类:
public class Contacts
private int id;
private String username;
private String location;
private Date updated_at;
public void setId(int id)
this.id = id;
public int getId()
return id;
public void setUsername(String username)
this.username = username;
public String getUsername()
return username;
public void setLocation(String location)
this.location = location;
public String getLocation()
return location;
public void setUpdated_at(Date updated_at)
this.updated_at = updated_at;
public Date getUpdated_at()
return updated_at;
谢谢!
【问题讨论】:
【参考方案1】:您收到该消息是因为您有:
List<Contacts> lstc = null;
你的意思是:
List<Contacts> lstc = new ArrayList<Contacts>();
顺便说一句:
你还有第二个错误:
Contacts cont = new Contacts(); // you only create one of these
更好:
while (rs.next())
Contacts cont = new Contacts(); // move to within the loop so one is created for every row in the result set
【讨论】:
感谢您指出第二个错误。我在收到第一个警告时移动了这两个变量,却忘记了将该变量移回。另外,我尝试使用: ListLog
语句,以显示正在执行或未执行的代码,并打印您关注的不同变量/表达式的值。检查 LogCat 中的消息以确认代码的哪些部分正在执行,哪些部分没有执行,并查看变量的值是什么。
@Bert F - 我将通过这些行插入变量,以查看您上面所说的正在执行哪些行。返回以 SoapObject 的形式出现 - 当我调试调用 Web 服务的方法时:我将 SoapObject 悬停,它只是告诉我“return:null”。现在,我不知道这是否意味着它是一个空列表或只是一个空值。我已经向对象添加了一个手表,但我似乎无法弄清楚如何浏览它的内容。非常感谢您的帮助。
对不起,那是我的错,我编辑了代码,忘记返回我的静态变量。【参考方案2】:
有这个:
List<Contacts> lstc = null;
然后没有任何对象被分配给lstc
。失败:(
考虑一个有意义的地方(例如在声明中)的new ArrayList<Contacts>()
。
【讨论】:
Epic Fail.. 但是,你能给我一个代码 sn-p,说明我应该怎么做。 @ninn 我做到了 :-) 请记住,方法只能在 objects 上调用(并且 null 不是对象)——否则,NullPointerException,kaboom!变量 store 对象。代码有责任确保变量在使用之前包含适当的对象(如果变量不包含对象,唯一明智的选择通常是null == variable
形式的测试)。事实上:lstc.add(...)
尝试调用 lstc
变量中存储的 对象上的 add
方法。【参考方案3】:
您没有实例化列表。当您想访问它时,该列表仍然为空。
所以你应该使用它:
List<Contacts> lstc = new List<Contacts>();
【讨论】:
好吧..那么,请更好地向我解释我究竟是如何实例化 List以上是关于错误:NullPointerAccess:变量“”在此位置只能为空的主要内容,如果未能解决你的问题,请参考以下文章
Graphql 错误:“之前的语法错误:\”\\\“变量\\\”\“”
参考:啥是变量范围,哪些变量可以从哪里访问,啥是“未定义变量”错误?