错误: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

【讨论】:

感谢您指出第二个错误。我在收到第一个警告时移动了这两个变量,却忘记了将该变量移回。另外,我尝试使用: List lstc = new List();这导致了一个错误:无法实例化“List();”似乎正在工作,但我会在选择答案之前留下更新。谢谢。 该方法仍然返回 null.. 虽然,我们确实解决了当前问题:有人知道我可以调试 Web 服务方法的快速简便的方法吗?我是 Web 服务的新手,不知道如何单步执行代码。另外:我的 sn-ps "if (!(rs.getString("location") == null)) cont.setLocation(rs.getString("location")); " 在做我想让他们做的事情吗?我需要获取列名中的值。 @ninn - 乐于助人。该方法不应再返回 null - 您无条件地创建列表。你的意思是它返回一个空列表吗?最好的做法是在整个代码中放置一堆 Log 语句,以显示正在执行或未执行的代码,并打印您关注的不同变量/表达式的值。检查 LogCat 中的消息以确认代码的哪些部分正在执行,哪些部分没有执行,并查看变量的值是什么。 @Bert F - 我将通过这些行插入变量,以查看您上面所说的正在执行哪些行。返回以 SoapObject 的形式出现 - 当我调试调用 Web 服务的方法时:我将 SoapObject 悬停,它只是告诉我“return:null”。现在,我不知道这是否意味着它是一个空列表或只是一个空值。我已经向对象添加了一个手表,但我似乎无法弄清楚如何浏览它的内容。非常感谢您的帮助。 对不起,那是我的错,我编辑了代码,忘记返回我的静态变量。【参考方案2】:

有这个:

List<Contacts> lstc = null;

然后没有任何对象被分配lstc。失败:(

考虑一个有意义的地方(例如在声明中)的new ArrayList&lt;Contacts&gt;()

【讨论】:

Epic Fail.. 但是,你能给我一个代码 sn-p,说明我应该怎么做。 @ninn 我做到了 :-) 请记住,方法只能在 objects 上调用(并且 null 不是对象)——否则,NullPointerException,kaboom!变量 store 对象。代码有责任确保变量在使用之前包含适当的对象(如果变量不包含对象,唯一明智的选择通常是null == variable 形式的测试)。事实上:lstc.add(...) 尝试调用 lstc 变量中存储的 对象上的 add 方法。【参考方案3】:

您没有实例化列表。当您想访问它时,该列表仍然为空。

所以你应该使用它:

List<Contacts> lstc = new List<Contacts>();

【讨论】:

好吧..那么,请更好地向我解释我究竟是如何实例化 List。我不能使用: List cont = new List;因为它告诉我无法实例化“new List”。 实例化,而不是“实例化”。

以上是关于错误:NullPointerAccess:变量“”在此位置只能为空的主要内容,如果未能解决你的问题,请参考以下文章

Graphql 错误:“之前的语法错误:\”\\\“变量\\\”\“”

VBA Excel 错误对象变量或未设置块变量

参考:啥是变量范围,哪些变量可以从哪里访问,啥是“未定义变量”错误?

参考:啥是变量范围,哪些变量可以从哪里访问,啥是“未定义变量”错误?

表变量和错误“必须声明标量变量”

PHP - 私有类变量给出错误:未定义的变量