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

相关文章
|
8天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
8天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
9天前
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
|
10天前
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
|
13天前
|
Java
Java异常捕捉处理和错误处理
Java异常捕捉处理和错误处理
14 1
|
15天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
33 2
|
22天前
|
Java
如何在 Java 中处理“Broken Pipe”异常
在Java中处理“Broken Pipe”异常,通常发生在网络通信中,如Socket编程时。该异常表示写入操作的另一端已关闭连接。解决方法包括:检查网络连接、设置超时、使用try-catch捕获异常并进行重试或关闭资源。
|
12天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
8天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
28 9
|
11天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
下一篇
无影云桌面