java出现空指针的情况,java没有指针为什么会有空指针异常,java中的空指针异常情况以及解决方案

java出现空指针的情况,java没有指针为什么会有空指针异常,java中的空指针异常情况以及解决方案

本文主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: