Java 在函数内初始化,导致空指针异常

Java 在函数内初始化,导致空指针异常,java,android,Java,Android,以下代码在执行期间导致空指针异常。它只是说空指针异常 当我将hotItem类放在函数之外时,它可以正常工作 一旦我将其放入函数中,它将导致空指针异常 我只是想知道为什么会发生这种情况,以及函数中类的生命周期是什么 private void getHotItem() { Gson gsonAdapter = new Gson(); class hotItem { private String hotItemPK = ""; } Typ

以下代码在执行期间导致空指针异常。它只是说空指针异常

当我将hotItem类放在函数之外时,它可以正常工作

一旦我将其放入函数中,它将导致空指针异常

我只是想知道为什么会发生这种情况,以及函数中类的生命周期是什么

private void getHotItem()
{   
    Gson gsonAdapter = new Gson();
    class hotItem
    {
        private String hotItemPK = ""; 
    }
    Type hotItemType = new TypeToken<List<hotItem>>(){}.getType();
    List<hotItem> hotItemList = new ArrayList<hotItem>();

    try
    {
        itemAccess.getHotItemList();
        itemAccess.start();
        itemAccess.join();
        hotItemList = gsonAdapter.fromJson(returnData, hotItemType);

        if(!hotItemList.isEmpty())
        {
            testText.setText(hotItemList.get(0).hotItemPK.toString());
        }
    }
    catch (InterruptedException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
private void getHotItem()
{   
Gson gsonAdapter=new Gson();
类hotItem
{
私有字符串hotItemPK=“”;
}
类型hotItemType=newTypeToken(){}.getType();
List hotItemList=新建ArrayList();
尝试
{
getHotItemList();
itemAccess.start();
itemAccess.join();
hotItemList=gsonAdapter.fromJson(返回数据,hotItemType);
如果(!hotItemList.isEmpty())
{
setText(hotItemList.get(0.hotItemPK.toString());
}
}
捕捉(中断异常e)
{
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
请检查问题

决议:

我猜您的类路径上同时有gson.jar和gson-stream.jar;那不行

问题是,在Gson 2.1中,我们有一个自定义版本的JsonReader,它添加了一些秘密挂钩,使MapTypeAdatperFactory更快;这些钩子不适用于gson stream.jar版本的JsonReader


我想我理解这里可能发生的事情

问题在于,
HotItem
是一个内部类,这意味着它有一个对封闭类实例的隐式引用。但是当
gsonAdapter.fromJson
方法尝试创建
列表时,它没有(可能没有)要在其中创建
热项的封闭类的实例。根据创建的方式,它可能使用
null
引用创建它。。。这可能是NPE的原因

如果这是一个问题(或类似的问题),那么另一种解决方法是将
HotItem
声明为
static



我还应该指出,用小写字母开头类名是不好的风格。

我已经检查了返回数据它与数据无关。。。该问题是由类似结构的类引起的。既然我把它放在函数之外,它就工作了。。如果像上面的代码一样将其放入函数中,则会导致空指针异常。我只是想知道这是怎么发生的……就像我在对gson进行长期研究后发现的一样。我发现问题是由以下原因引起的:Type hotItemType=new TypeToken(){}.getType();返回Null,但我不知道为什么它不能获取类型,如果类hotItem在函数getHotItem()中,一开始我认为我的代码和java类的概念有问题,但是我发现问题来自gson。我使用小写字母很长时间了,这很好。至少在C语言上,如果使用Java,我可能是错的。你对Java的看法是错的。等等