18、Java——NullPointerException异常的原因和解决办法

简介: 18、Java——NullPointerException异常的原因和解决办法

1、NullPointerException异常原因


       一般空指针的原因就是:当前正在使用的变量没有对应的值


       也就是说:当前正在使用的变量没有引用指向对应的值/对象


       也可以这样说:Null Pointer就相当于Null Reference


       如下面的代码都会报空指针异常:


public class Main {
    public static void main(String[] args) {
        String str1 = null;
        System.out.println(str1.toLowerCase());  //NullPointerException
    }
}
public class Main {
    String str2;    //默认值为null
    public static void main(String[] args) {
        Main ma = new Main();
        System.out.println(ma.str2.toLowerCase());   //NullPointerException
    }
}

因为成员变量str2和局部变量str1都是默认为null,所以都没有具体的指向某个值/对象


       定位NullPointerException


       如果产生了NullPointerException,例如,调用a.b.c.x()时产生了NullPointerException,原因可能是:


               a是null;


               a.b是null;


               a.b.c是null;


       确定到底是哪个对象是null以前只能打印这样的日志:


               System.out.println(a);


               System.out.println(a.b);


               System.out.println(a.b.c);


       如下面的代码:


public class test20210629 {
    public static void main(String[] args) {
        Person p = new Person();    
        System.out.println(p.address.city);   //输出:null
        System.out.println(p.name[0]);      //输出:null
        System.out.println(p.address.city.toLowerCase());   //空指针异常
        System.out.println(p.name[0].toLowerCase());   //空指针异常
    }
}
class Person {
    String[] name = new String[2];
    Address address = new Address();
}
class Address {
    String city;
    String street;
    String zipcode;
}

       总结:


       空指针发生的原因:一个变量A没有值(或没有指向对应的对象),然后直接使用A的方法,或者将A当成参数传给其他对象/方法使用,就会报空指针异常!


2、NullPointerException异常解决办法


第一步,先看一下异常是怎么产生的,在输入一个这样的地址:http://localhost:8083/***/***/***/***?productId=564564564573534,在控制台就会如图所报错


3.png



第二步,要解决这样的空指针错误,就先要找到出错误的JAVA代码,点击就可以,如图:


2.png


第三步,定位到java代码后,在debug启动项目,并添加断点,怎么启动debug:http://jingyan.baidu.com/article/19020a0a65e142529c284241.html


1.gif



第四步,继续第一步的地址,在debug的模式下可以看到此字段的值是Null, 如图:



3.png


第五步,输入正确的productId,如正确的链接是:http://localhost:8083/***/***/***/***?productId=47681438955545,如图,debug模式下此字段就不是null,如图:


2.png



第六步,如果没有其他错误的话,此时页面也应该打开了


1.gif


 


1.gif

相关文章
|
7月前
|
安全 Java 开发者
告别NullPointerException:掌握Java Optional的精髓
告别NullPointerException:掌握Java Optional的精髓
|
8月前
|
安全 Java 开发者
NullPointerException:拥抱Java Optional-6
NullPointerException:拥抱Java Optional
306 104
|
8月前
|
安全 Java 容器
NullPointerException:拥抱Java Optional-5
NullPointerException:拥抱Java Optional
317 107
|
8月前
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional-4
告别NullPointerException:拥抱Java Optional-4
301 104
|
8月前
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional
告别NullPointerException:拥抱Java Optional
|
11月前
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
248 1
|
存储 Java API
Java Optional 完全指南:彻底告别 NullPointerException
Java 8 引入的 `Optional` 类旨在解决 `null` 带来的空指针异常问题,通过提供容器类显式处理可能为空的值,提升代码健壮性和可读性。本文从基础到进阶解析 `Optional` 的用法,涵盖创建、检查、获取值、处理值等核心功能,结合实际应用场景与最佳实践,助你彻底告别 `NullPointerException`,编写更优雅的 Java 代码。
721 0
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
813 14