[Java] 예외 처리의 NullPointerException

모든 RuntimeException예외 중에서 Java 프로그래머는 아마도 NullPointerException예외 .

NullPointerException즉, 일반적으로 NPE라고 하는 널 포인터 예외입니다. NullPointerException개체가 null인 경우 해당 메서드를 호출하거나 해당 필드에 액세스하면 이 예외가 일반적 으로 발생합니다 JVM. 예를 들면 다음과 같습니다.

// NullPointerException
public class Main {
    
    
    public static void main(String[] args) {
    
    
        String s = null;
        System.out.println(s.toLowerCase());
    }
}

포인터의 개념은 실제로 C 언어에서 유래했으며 Java 언어에는 포인터가 없습니다. 우리가 정의하는 변수는 실제로 참조, Null Pointer더 정확하게는 Null Reference이지만 둘 사이에는 큰 차이가 없습니다.

다루다NullPointerException

그렇다면 NullPointerException어떻게 대처해야 할까요? 우선 NullPointerException코드 논리 오류라는 것을 명확히 해야 한다.만나면 NullPointerException조기에 노출하고 조기에 수정하는 것이 원칙이다.이 코딩 오류를 숨기기 위해 catch를 사용하는 것은 엄격히 금지되어 있다.

// 错误示例: 捕获NullPointerException
try {
    
    
    transferMoney(from, to, amount);
} catch (NullPointerException e) {
    
    
}

좋은 코딩 관행은 NullPointerException예를 들어 다음과 같은 생산을 크게 줄일 수 있습니다.

멤버 변수는 정의 시 초기화됩니다.

public class Person {
    
    
    private String name = "";
}

기본 null 대신 빈 문자열 ""을 사용하면 많은 것을 피할 수 있습니다 NullPointerException. 비즈니스 로직을 작성할 때 채워지지 않았음을 나타내기 위해 빈 문자열 ""을 사용하는 것이 null보다 훨씬 안전합니다.

null 대신 빈 배열인 빈 문자열 ""을 반환합니다.

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

이렇게 하면 호출자가 결과가 null인지 확인하지 않아도 됩니다.

파일이 존재하지 않음을 나타내기 위해 null을 반환하는 것과 같이 호출자가 null을 기준으로 판단해야 하는 경우 선택적 반환을 고려하십시오.

public Optional<String> readFromFile(String file) {
    
    
    if (!fileExist(file)) {
    
    
        return Optional.empty();
    }
    ...
}

이런 식으로 호출자는 Optional.isPresent()결과가 있는지 판단을 통과해야 합니다.

NullPointerException 찾기

NullPointerException예를 들어 abcx() 를 호출할 때 발생하는 경우 NullPointerException이유는 다음과 같습니다.

a는 null,
ab는 null,
abc는 null입니다.
어떤 객체가 null인지 결정하기 전에는 다음과 같은 로그만 인쇄할 수 있습니다.

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

Java 14부터 생성되는 경우 NullPointerExceptionJVM은 null 개체가 누구인지 알려주는 자세한 정보를 제공할 수 있습니다. 예를 살펴보겠습니다.

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Person p = new Person();
        System.out.println(p.address.city.toLowerCase());
    }
}

class Person {
    
    
    String[] name = new String[2];
    Address address = new Address();
}

class Address {
    
    
    String city;
    String street;
    String zipcode;
}

NullPointerException세부 정보에서 is null과 같은 것을 볼 수 있습니다 ... because "<local1>.address.city" . 즉, 도시 필드가 null이므로 문제를 빠르게 찾을 수 있습니다.

이 개선 사항에 대한 자세한 정보 NullPointerException는 Java 14의 새로운 기능이지만 기본적으로 꺼져 있습니다. XX:+ShowCodeDetailsInExceptionMessagesJVM에 - 매개 변수를 추가하여 활성화할 수 있습니다.

java -XX:+ShowCodeDetailsInExceptionMessages Main.java

요약

NullPointerException이는 Java 코드의 일반적인 논리 오류로, 조기에 노출되고 복구되어야 합니다.

자세한 오류 정보 를 보려면 Java 14의 향상된 예외 정보를 활성화할 수 있습니다 NullPointerException.

Supongo que te gusta

Origin blog.csdn.net/ihero/article/details/132189662
Recomendado
Clasificación