本文主要介绍了java中空指针的异常及其解决方法,具有很好的参考价值。希望对大家有帮助。如有错误或不足之处,请不吝赐教。
目录
问题描述概述第一、第二和第三个问题存在几种定位java NullPointerExceptions的解决方案。如何避免java空指针异常:java.lang.NullPointException一、什么是java空指针异常二。怎么解决?
概述
空指针异常经常被抛出,因为我们调用的对象是空的。
问题描述
第一种
out . println(request . getparameter(' username '));
如果请求中没有username值,那么如果不能操作空对象,就会抛出异常。
第二种
string userName=request . getparameter(' userName ');
If (userName.equals('root '))
{.}
如果没有用户名值或用户名为空,则一个空对象无法与另一个对象进行比较。
If ('root ')。等于(用户名))
{.}
如果返回值与常数进行比较,可以避免调用null对象的equals方法。不会引发任何异常。
第三种
假设有一个属性名为的学生类。
学生a;
string b=a . name;
此时,将会报告一个错误,因为A是空的。解决方法是让A指向一个对象,学生a=新学生();
问题定位
对于日志中的错误信息,java中抛出的异常是由内而外的,所以我们只需要把重点放在第一行的错误信息上,后面的错误都是一层一层调用这个方法造成的。
Java空指针异常的若干解决方案
Java中的任何对象都可以是空的,我们可以使用几种方法来避免这种异常。比如我们传统的空值检测,编程规范,java中各种工具类的使用。
(1)最常用的一种就是直接对 对象进行判断
比如用if(Object==null)来判断所有使用的对象。这个对象是我们常用的函数参数、返回值和类实例的成员变量。当我们检测到空值时,可以用异常类型抛出更有针对性的异常类型,然后附上自己添加的消息内容。我们也可以直接使用一些库函数来简化代码:
object check data=object . require nonNull(resultMessage,' result message不得为null ')
如果我们用过Lombok工具,里面有一个@NotNull注释,意思是被注释的元素不能为空,所以我们会自己检查。
(2)第二种方法就是遵守编程规范,可以减少一定的空指针异常的发生。
strings . isnullorempty(str);
CollectionUtils.isEmpty(集合);
string utils . isempty(str);
如果(反对!=null) {
object . tostring();)
}//如果使用toString()方法,如果对象为空,则会引发异常。
String.valueOf(Object) //将对象转换为字符串,无论它是否为空,都不引发异常
如果返回是集合类型。而且是空的。不返回空值,而是返回一个空集。如果返回类型是一个对象,我们可以抛出一个异常。
公共类示例{
私有静态列表ListInteger numbers=null
公共静态ListInteger getList() {
if (numbers==null)
返回collections . empty list();
其他
返回数字;
}
}
检查方法的参数。在执行该方法之前,请确保检查参数是否为空。当参数被正确检查时,该方法将继续执行。否则抛出名为llegalArgumentException的异常,通知调用方法传递的参数有误。
使用三元运算符,可以避免NullPointerException,如下所示:
布尔表达式?值1:值2;
存在NullPointerException的安全方法
第一个使用instanceof操作符。
即使对象的引用为null,也可以使用instanceOf运算符。当引用为null时,instanceof运算符返回false,并且不引发NullPointerException,例如:
String str=null
if(字符串实例为空){
日志错误(.)
}
如何避免
确保所有对象在使用前都已初始化。
java空指针异常:java.lang.NullPointException
一.什么是java空指针异常
我们都知道java没有指针。这里的‘java指针’指的是Java的引用。这里不讨论调用指针是否合适,只分析异常本身。
空指针就是空引用,java空指针异常是指引用本身为空,但是调用了方法。此时,将出现空指针异常。
可以理解为成员变量和方法属于对象(静态除外),对象中只存在对应的成员变量和方法,然后通过对象调用这些成员变量和方法。
对于空指针,它不指向任何对象,所以没有所谓的成员变量和方法。当你这个时候用它来调用一些属性和方法的时候,当然会出现空指针异常。
公共类测试{
private int a=1;
private int b=2;
公共静态void main(String[] args) {
//TODO自动生成的方法存根
测试t1=新测试();
测试t2=空;
system . out . println(t1 . a);
system . out . println(T2 . a);
system . out . println(T2 . c());
}
公共字符串c(){
返回‘123’;
}
}
我们分析上面的样本代码。在测试类中,有两个成员变量A和B,以及一个方法C()。
然后,在main()方法中,我们创建两个对象t1和t2,其中t1指向由构造函数实例化的测试对象,而t2仅声明并指向空对象,而不是实际对象。
调试时,可以编译第一条output语句,但执行第二条output语句时,程序终止,因为空指针调用了不属于它的,并报告空指针异常。
同样,当第二条output语句被注释后,当程序执行第三条output语句时,也会出现同样的错误,因为它调用了不属于它的C()方法。
二.如何解决
对于每一个java程序员来说,遇到空指针异常几乎是不可避免的,尤其是对于没有经验的初学者。而且由于调试和发现其他异常比较困难,往往要花很大力气才能解决。
首先知道java中的null。
Null是Java中一个非常重要的概念。Null最初是用来表示缺少的东西,比如缺少用户、资源或其他东西。然而一年后,麻烦的空指针异常给Java程序员带来了很多骚扰。
null是java中的关键字,因此,它不能写成NULL,Null,只能是null。
Null是所有引用类型的默认值。如果一个引用没有指向一个实际的对象,它的默认值是null。Null本质上是一个值,就像int的默认值是0,boolean的默认值是false一样。现在,我们通常使用像eclipse这样的集成开发环境进行开发。一般来说,变量在定义的时候就初始化了(这也是写代码的好习惯)。如果它们没有初始化,系统会提示你。
报空指针异常的原因有以下几种:
1个字符串变量未初始化;
2接口类型的对象没有用特定的类初始化,例如:
列出来;将报告一个错误
list it=new ArrayList();不会报告任何错误。
3当一个对象的值为空时,你不判断它为空。您可以尝试在以下代码之前添加一行代码:
如果(rb!=null rb!='')
更改为:
if(Rb==null);
如果(rb!==nullrb!=' ')或if(' ')。等于(经常预算))
空指针的解决办法:
关注发生错误的那一行,通过空指针异常的两个主要原因来诊断具体的错误。同时,为了避免空指针的出现,在进行判断处理时,最好在设定值前加上“null”或空值。
常见空指针异常的简要分析:
(1)空指针错误
java中的八种基本数据类型中,变量的值可以有它们的默认值,Java虚拟机如果没有正常赋值就添加的话是无法正确编译的。因此,使用基本的Java数据类型一般不会导致空指针异常。实际上,大多数空指针异常主要与对象的操作有关。
以下是空指针异常的一些可能情况和相应的解决方案:
代码段1:
out . println(request . getparameter(' username '));
分析:代码段1的作用很简单,就是输出用户输入的‘用户名’的值。
注意:上面的说法好像没有语法错误,大部分情况下都没有问题。但是,如果用户在输入数据时没有提供表单字段' username '的值,或者以某种方式绕过表单直接输入,那么这个request.getParameter('username ')的值就是空的(注意不是空字符串,而是空对象null。),out对象的println方法不能直接操作空对象,所以代码段1所在的JSP页面会抛出‘Java . lang . nullpointerexception’异常。即使对象可能为空,也会调用Java.lang.Object的一些方法或对象本身,如toString()、equal(Object obj)。
代码段2:
string userName=request . getparameter(' userName ');
If (userName.equals('root '))
{.}
分析:代码段2的作用是检测用户提供的用户名。如果是用户名为' root '的用户,会执行一些特殊操作。
注意:在代码段2中,如果用户没有提供表单字段“username”的值,则字符串对象userName为空,并且不可能直接将一个空对象与另一个对象进行比较。类似地,代码段2所在的JSP页面将抛出一个空指针错误。
提示:如果你想比较一个方法的返回值和一个常量,你可以通过把常量放在前面来避免调用一个空对象的equals方法。例如:
If ('root ')。等于(用户名))
{.}
即使userName对象返回一个空对象,也不会有空指针异常,它可以照常工作。
代码段3:
string userName=session . get attribute(' session . userName ')。toString();
解析:代码段3的作用是取出session中session.userName的值,赋给字符串对象userName。
注意:一般情况下,如果用户已经有过对话,就不会有问题;但如果此时重启应用服务器,用户没有再次登录,(也可能是用户关闭了浏览器,但仍然打开了原来的页面。)那么,这个时候session的值就无效了,session中session.username的值就为空。对空对象的直接toString()操作将导致系统抛出空指针异常。
代码段4:
公共静态void main(String args[]){
Person p=null
P.setName('张三');
system . out . println(p . getname());
}
分析:声明一个Person对象,打印出对象中的名字。
说明:此时你的P出现了空指针异常,因为你刚刚声明了这个Person类型的对象还没有创建对象,所以它的堆里没有地址引用。当您想要使用对象删除方法时,请不要创建对象。
以上个人经历,希望能给大家一个参考,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。