空指针异常(NullPointerException)是 Java 编程语言中常见的运行时异常之一,尤其是在使用Java这类强类型语言时。这种异常通常发生在尝试使用未初始化(即为null)的对象引用时。

1、空指针异常

在Java中,当声明一个对象但没有为其分配内存(即没有用new关键字创建一个实例),则这个对象引用就会指向null。如这种状态下尝试访问对象的方法或属性,就会抛出空指针异常(NullPointerException)。

public class Main {
  public static void main(String[] args) {
    String text = null;
    int length = text.length();  // 这里会抛出NullPointerException
    System.exit(0); //success
  }
}

2、如何解决避免空指针异常

1)检查空指针

在使用对象之前,先检查它是否为null。如果为空则抛出异常或采取其他措施。

例如,

public class Main {
  public static void main(String[] args) {
   String str = null;

    if (str == null) {
        throw new NullPointerException("str is null");
    }
    
    // 使用 str
    String text = null;
    int length = text.length();  
    System.exit(0); //success
  }
}

2)使用 Optional 类

Java 8 引入的 Optional 类可以用于表示可能为 null 的值。这有助于避免直接使用 null

例如,

import java.util.Optional;
public class Main {
  public static void main(String[] args) {
       // 获取一个可能为 null 的字符串
        Optional<String> optionalString = Optional.ofNullable(getStringValue());

        // 检查 Optional 对象是否有值
        if (optionalString.isPresent()) {
            // 如果有值,则打印它
            System.out.println(optionalString.get());
        } else {
            // 如果没有值,打印默认消息
            System.out.println("No value present");
        } 
    System.exit(0); //success
  }
   // 模拟一个可能返回 null 的方法
    public static String getStringValue() {
        // 模拟条件,可以返回 null 或非 null 值
        boolean returnsNull = Math.random() < 0.5;

        if (returnsNull) {
            return null;
        } else {
            return "Hello, World!";
        }
    }
}

3)提供默认值

当预期的引用可能为 null 时,提供一个默认值。

import java.util.Optional;
public class Main {
  public static void main(String[] args) {
       // 获取一个可能为 null 的字符串
       String text = Optional.ofNullable(getStringValue()).orElse("default");
        System.out.println(text);
        int length = text.length();
        System.out.println(length);
         System.exit(0); //success
  }
   // 模拟一个可能返回 null 的方法
    public static String getStringValue() {
        // 模拟条件,可以返回 null 或非 null 值
        boolean returnsNull = Math.random() < 0.5;

        if (returnsNull) {
            return null;
        } else {
            return "Hello, World!";
        }
    }
}