不知道各位大侠遇到过此类问题没有:具体现象是在我的应用里操作操作着就出现了空指针异常,然后程序崩溃退出,关键是这空指针总是概率出现;
出现问题的位置我已经找到,并且进行了空指针的判断,但是还会出现,现在真的是无解了,几乎所有的可能的原因都想到了(变量被回收,服务器返回值为空等),但就是解决不了,求高人指教啊!
有需要的话我会贴出代码,谢谢各位大侠了!
[quote] if (localXcarApp != null && localXcarApp.getBrandInfos() != null && localXcarApp.getBrandInfos().get(brandsIndex) != null) {
brandInfo = localXcarApp.getBrandInfos().get(brandsIndex);
}[/quote]
应该改为
[code="java"] if (localXcarApp != null){
T infos= localXcarApp.getBrandInfos();
if(infos!= null){
brandInfo = infos.get(brandsIndex);
}
}[/code]
这样更合理。
还有检查全局变量localXcarApp 是否是多线程共享安全,其中的数据可能被其他线程修改、删除。还有的可能性就是localXcarApp 中的数据是否用了弱引用,导致虚拟机自动回收。
贴个代码出来 SEE SEE
既然你做了空指针的判断为什么还会出现,不知道你是怎么写的代码,贴出来看看。
你是不是web应用?不会有“概率出现”这种灵异现象的,估计是不同的上下文导致null。
调试一下看看
[quote]出现问题的位置我已经找到[/quote]
我觉得应该还有其他地方有空指针
[quote]造成了有时我这边发送请求时返回的数据为空[/quote]
这个对返回的数据不处理的么?
你的这段代码是线程安全的嘛。你是不是在别的什么地方将application里的东西清空了,比如通过application.setAttribute("xxx",null);这样清空了。web程序的一个请求就会对应一个线程,极有可能是在别的请求里面清空的。从你贴出的代码看不出什么,以上是我的猜想,你检查检查。
[quote]返回的数据是json格式的,我这会对其进行读取,然后保存在map中,最后显示在页面上,有的时候在页面切换的时候map里的值就为空了.......[/quote]
我觉得就上面那段代码本身没啥问题,有没有可能在其他地方也操作了这个localXcarApp和brandInfos变量?这个应该检查下。。。。
切换页面的时候map清空了倒是很诡异。。是不是切换的时候干了啥事情了或者重新new了一次map?。。。map是放在哪儿的呢?
[quote] if (localXcarApp != null && localXcarApp.getBrandInfos() != null && localXcarApp.getBrandInfos().get(brandsIndex) != null) {
brandInfo = localXcarApp.getBrandInfos().get(brandsIndex);
}
[/quote]
我觉得这段代码可能出现空指针的地方有两种情况:
1、brandsIndex是包装类型而且值为空。
2、多线程环境,在判断过程之间或者判断完成和取的过程之间,别的线程把值改成null了。
楼主确定空指针的位置就是这吗?
麻烦问下brandInfos 是个Map? 如果是用的什么Map啊? HashMap? 还是TreeMap?
检查有没有超时的因素,试试增大应用的内存能不能解决问题
如果brandsIndex是Integer类型的, 可以检查下它是不是有可能为空。
切换页面时,indent 也切换了。既然是切换页面时报错,那应该 localXcarApp 是被定义成线程共享了。
从你贴出来的代码,理论上是有可能抛出数组越界的异常的;
localXcarApp是全局变量吗?是在你页面变换的时候才会抛出空指针吗?
是不是每次页面变换都会对 localXcarApp全局变量进行赋值?
这个方法是不是执行的条件是什么?
正规的处理异常语句应该是try-catch-finally,这里应该使用,否则可读性太差,也不利于问题定位。
关于异常位置,上面已经有人说了,brandsIndex,如果为空,就是空指针异常,如果越界,就是数组越界异常,用catch可以帮助定位问题。
[code="java"]
try{
brandInfo = localXcarApp.getBrandInfos().get(brandsIndex);
}catch(NullpointerException ne){
//处理空指针异常
}catch(Exception e){
//处理其它异常
}finally{
//收尾工作
}
[/code]
抓到异常,看stacktrace就知道从哪里来,是什么问题。
if (localXcarApp != null && localXcarApp.getBrandInfos() != null && localXcarApp.getBrandInfos().get(brandsIndex) != null) {
brandInfo = localXcarApp.getBrandInfos().get(brandsIndex);
}
你的hashmap 是在多线程下应用,出现空指针应该说是正常的。
确认一下你数据在多线程情况下的安全。
[size=large][color=indigo]ArrayList有一种空是这样的[null],你判断没呢?[/color][/size]