java学习--NullPointerException

NullPointerException

其实就是空指针异常
// NullPointerException
public class Main {
    public static void main(String[] args) {
        String s = null;
        System.out.println(s.toLowerCase());
    }
}

///空指针异常是代码的逻辑错误
// 错误示例: 捕获NullPointerException
try {
    transferMoney(from, to, amount);
} catch (NullPointerException e) {
}
///越早发现越好,严禁使用类似这样的方法来隐藏异常

好的编码习惯可以避免NullPointerException

public class Person {
    private String name = "";//不用null,用""
}

public String[] readLinesFromFile(String file) {
    if (getFileSize(file) == 0) {
        // 返回空数组而不是null:
        return new String[0];
    }
    ...
}

关于Optional

错误写法

public String readFromFile(String file) {
    if (!fileExist(file)) return null; 
    return "文件内容";
}

// 调用方
String content = readFromFile("test.txt");
System.out.println(content.length()); // 如果文件不存在,这里直接报 NullPointerException (崩溃)!

现代写法

现代的做法(使用 Optional):
Optional 就像是一个“透明的盒子”。
盒子里可能装了一个字符串,也可能是空的。
它在提醒调用者:“嘿,这个结果可能是空的,你拿去用之前必须先处理一下!”

///如果调用方一定要根据null判断,比如返回null表示文件不存在,那么考虑返回Optional<T>
public Optional<String> readFromFile(String file) {
    if (!fileExist(file)) {
        return Optional.empty();
    }
    ...
}
public Optional <String>readFromFile(String file){
    String content = doSomethingToReadFile(file); // 这个方法可能返回字符串,也可能返回 null
    
    // 这一行直接搞定:如果是 null 就变空盒子,如果不是就装进去
    return Optional.ofNullable(content); 
}


这样调用方必须通过Optional.isPresent()判断是否有结果。
Optional<String> result = readFromFile("test.txt");
if (result.isPresent()) {
    System.out.println("内容是:" + result.get()); // get() 是从盒子里取东西
} else {
    System.out.println("文件没找到");
}
还有几种别的写法
// 如果盒子里没东西,就给我返回 "默认内容"
String content = readFromFile("test.txt").orElse("默认内容");
System.out.println(content);

// 如果文件不存在,直接抛出一个自定义异常,让 Spring Boot 的全局异常处理器去处理
String content = readFromFile("test.txt")
                 .orElseThrow(() -> new RuntimeException("找不到该文件"));
posted @ 2026-05-13 11:54  Time_q  阅读(53)  评论(19)    收藏  举报