Java java지도 시간 Java에서 NullPointerException을 방지하는 방법

Java에서 NullPointerException을 방지하는 방법

Sep 07, 2017 am 10:31 AM
java nullpointerexception 나타나다

이 글에서는 주로 Java에서 NullPointerException(널 포인터)을 방지하는 방법 요약에 대한 내용을 소개하고 있습니다. 필요하신 분들은 참고하시면 됩니다.

java NullPointerException(널 포인터)을 방지하는 방법 요약

Thrown in Java 애플리케이션 NullPointerException은 널 포인터를 처리하는 가장 좋은 방법이며 원활하게 작동하는 강력한 프로그램을 작성하는 데 핵심입니다. "예방이 치료보다 낫다"라는 속담처럼, 이 문장은 짜증나는 널 포인터 예외에도 해당됩니다. 다행히 몇 가지 방어 코딩 기술을 적용하고 애플리케이션의 여러 부분 간의 연결을 추적함으로써 Java의 널 포인터 예외를 양호한 수준으로 제어할 수 있습니다. 그런데, 이것은 Javarevisited에 대한 두 번째 NullPointerException 게시물입니다. 이전 게시물에서 우리는 Java에서 널 포인터 예외의 일반적인 원인에 대해 논의했으며, 이 튜토리얼에서는 몇 가지 Java 프로그래밍 팁과 모범 사례를 배울 것입니다. 이러한 팁은 Java에서 널 포인터 예외를 방지하는 데 도움이 될 수 있습니다. 이러한 팁을 따르면 Java 코드 전체에 존재하는 null이 아닌 검사 수를 줄일 수도 있습니다. 숙련된 Java 프로그래머로서 귀하는 이미 이러한 기술 중 일부를 알고 있으며 이를 프로젝트에 적용할 것입니다. 그러나 초보 및 중급 개발자에게는 배울 가치가 충분히 있을 것입니다. 그런데 널 포인터 예외를 방지하고 널 포인터 검사를 줄이는 다른 Java 트릭을 알고 있다면 공유해 주세요.

적용하기 쉽지만 코드 품질과 견고성에 큰 영향을 미치는 간단한 팁입니다. 내 경험상 첫 번째 팁만 코드 품질을 크게 향상시킵니다. 이전에 말했듯이 널 포인터 예외를 방지하고 널 포인터 검사를 줄이는 Java 트릭을 알고 있다면 이 기사에 댓글을 달아 공유할 수 있습니다.

1) 알 수 없는 객체가 아닌 알려진 String 객체에서 equals() 및 equalsIgnoreCase() 메서드를 호출합니다.

항상 null이 아닌 알려진 문자열 객체에서 equals() 메서드를 호출하세요. equals() 메소드는 대칭적이기 때문에 a.equals(b)를 호출하는 것과 b.equals(a)를 호출하는 것은 정확히 동일합니다. 이것이 바로 프로그래머가 객체 a와 b에 대해 그토록 부주의한 이유입니다. 호출자가 null 포인터인 경우 이 호출로 인해 Null 포인터 예외가 발생할 수 있습니다.


Object unknownObject = null;

//错误方式 – 可能导致 NullPointerException
if(unknownObject.equals("knownObject")){
  System.err.println("This may result in NullPointerException if unknownObject is null");
}

//正确方式 - 即便 unknownObject是null也能避免NullPointerException
if("knownObject".equals(unknownObject)){
  System.err.println("better coding avoided NullPointerException");
}
로그인 후 복사

이는 Null 포인터 예외를 방지하는 가장 간단한 Java 트릭이지만, equals()가 일반적인 메서드이기 때문에 크게 개선될 수 있습니다.

2) valueOf()와 toString()이 동일한 결과를 반환하는 경우 전자를 사용하는 것이 좋습니다.

null 객체의 toString()을 호출하면 null 포인터 예외가 발생하기 때문에 valueOf()를 사용하여 동일한 값을 얻을 수 있다면 valueOf()에 null을 전달하는 것이 "를 반환합니다. null" , 특히 Integer, Float, Double 및 BigDecimal과 같은 래퍼 클래스에서 그렇습니다.


BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //不会抛出空指针异常
System.out.println(bd.toString()); //抛出 "Exception in thread "main" java.lang.NullPointerException"
로그인 후 복사

3) 널 안전 메소드 및 라이브러리 사용 널 포인터 검사의 무거운 작업을 이미 수행하는 오픈 소스 라이브러리가 많이 있습니다. 가장 일반적으로 사용되는 것 중 하나는 Apache Commons의 StringUtils입니다. 널 포인터 예외에 대해 걱정하지 않고 StringUtils.isBlank(), isNumeric(), isWhiteSpace() 및 기타 유틸리티 메서드를 사용할 수 있습니다.


//StringUtils方法是空指针安全的,他们不会抛出空指针异常
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));

Output:
true
true
false
false
로그인 후 복사

하지만 결론을 내리기 전에 null 포인터 메서드에 대한 클래스 문서를 읽는 것을 잊지 마세요. 이는 많은 노력 없이 크게 개선할 수 있는 또 다른 Java 모범 사례입니다.

4) 메서드에서 null 포인터를 반환하지 말고, 대신 빈 컬렉션이나 빈 배열을 반환하세요.

이 Java 모범 사례 또는 요령은 Joshua Bloch가 자신의 저서 Effective Java에서 언급한 것입니다. 이것은 Java 프로그래밍을 더 잘하기 위한 또 다른 팁입니다. 빈 컬렉션이나 배열을 반환하면 size() 및 length()와 같은 호출이 Null 포인터 예외로 인해 중단되지 않도록 할 수 있습니다. Collections 클래스는 편리한 빈 목록, 세트 및 맵(Collections.EMPTY_LIST, Collections.EMPTY_SET, Collections.EMPTY_MAP)을 제공합니다. 다음은 예입니다.


public List getOrders(Customer customer){
  List result = Collections.EMPTY_LIST;
  return result;
}
로그인 후 복사

널 포인터 대신 Collections.EMPTY_SET 및 Collections.EMPTY_MAP을 사용할 수도 있습니다.

5) annotation@NotNull 및 @Nullable

을 사용하면 프로그램 작성 시 널 포인터가 될 수 있는지 여부를 정의할 수 있습니다. @NotNull 및 @Nullable과 같은 주석을 사용하여 메서드가 null 포인터로부터 안전한지 여부를 선언합니다. 최신 컴파일러, IDE 또는 도구는 이 주석을 읽고 잊어버린 널 포인터 검사를 추가하는 데 도움을 주거나 불필요한 널 포인터 검사 메시지를 표시할 수 있습니다. IntelliJ와 findbug는 이미 이러한 주석을 지원합니다. 이러한 주석도 JSR 305의 일부이지만 IDE나 도구에 없더라도 주석 자체를 문서로 사용할 수 있습니다. @NotNull과 @Nullable을 보고 프로그래머는 널 포인터 검사를 수행할지 여부를 결정할 수 있습니다. 그런데 이 기술은 Java 프로그래머에게 비교적 새로운 기술이므로 채택하는 데 시간이 좀 걸릴 것입니다.

6) 코드에서 불필요한 자동 래핑 및 자동 언패킹을 피하세요.

임시 개체 생성과 같은 다른 단점에 관계없이 래퍼 클래스 개체가 null인 경우 자동 래핑으로 인해 쉽게 null 포인터 예외가 발생할 수도 있습니다. 예를 들어, person 객체에 전화번호가 없으면 null이 반환되고, 다음 코드는 null 포인터 예외로 인해 충돌이 발생합니다.


Person ram = new Person("ram");
int phone = ram.getPhone();
로그인 후 복사

当使用自动包装和自动解包的时候,不仅仅是等号,< > 同样会抛出空指针异常。你可以通过这篇文章来学习更多的Java中的自动包装和拆包的陷阱。

7) 遵从Contract并定义合理的默认值。

在Java中避免空指针异常的一个最好的方法是简单的定义contract并遵从它们。大部分空指针异常的出现是因为使用不完整的信息创建对象或者未提供所有的依赖项。如果你不允许创建不完整的对象并优雅地拒绝这些请求,你可以在接下来的工作者预防大量的空指针异常。类似的,如果对象允许创建,你需要给他们定义一个合理的默认值。例如一个Employee对象不能在创建的时候没有id和name,但是是否有电话号码是可选的。现在如果Employee没有电话号码,你可以返回一个默认值(例如0)来代替返回null。但是必须谨慎选择,哟有时候检查空指针比调用无效号码要方便。同样的,通过定义什么可以是null,什么不能为null,调用者可以作出明智的决定。failing fast或接受null同样是一个你需要进行选择并贯彻的,重要的设计决策

8)定义数据库中的字段是否可为空。

如果你在使用数据库来保存你的域名对象,如Customers,Orders 等,你需要在数据库本身定义是否为空的约束。因为数据库会从很多代码中获取数据,数据库中有是否为空的检查可以确保你的数据健全。在数据空中维护null约束同样可以帮助你减少Java代码中的空指针检查。当从数据库中加载一个对象是你会明确,哪些字段是可以为null的,而哪些不能,这可以使你代码中不必要的!= null检查最少化。

9) 使用空对象模式(Null Object Pattern)

还有一种方法来避免Java中的空指针异常。如果一个方法返回对象,在调用者中执行一些操作,例如Collection.iterator()方法返回迭代器,其调用者执行遍历。假设如果一个调用者并没有任何迭代器,其可以返回空对象(Null object)而非null。空对象是一个特殊的对象,其在不同的上下文中有不同的意义。例如一个空的迭代器调用hasNext()返回false时,可以是一个空对象。同样的在返回Container和Collection类型方法的例子中,空对象可以被用来代替null作为返回值。我打算另写一篇文章来讲空对象模式,分享几个Java空对象的例子。

这就是全部了,这是几个易于遵从的避免空指针异常的Java技巧和最佳实践。你可以欣赏到这些技巧将非常有用,且不太难实现。如果你有其他比秒这个异常的技巧,而又没包含在这里,请通过评论来和我们分享,我将收录在这里。

위 내용은 Java에서 NullPointerException을 방지하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

자바의 완전수 자바의 완전수 Aug 30, 2024 pm 04:28 PM

Java의 완전수 가이드. 여기서는 정의, Java에서 완전 숫자를 확인하는 방법, 코드 구현 예제에 대해 논의합니다.

자바의 웨카 자바의 웨카 Aug 30, 2024 pm 04:28 PM

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 스미스 번호 Java의 스미스 번호 Aug 30, 2024 pm 04:28 PM

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

Java Spring 인터뷰 질문 Java Spring 인터뷰 질문 Aug 30, 2024 pm 04:29 PM

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Feb 07, 2025 pm 12:09 PM

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 날짜까지의 타임스탬프 Java의 날짜까지의 타임스탬프 Aug 30, 2024 pm 04:28 PM

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐의 양을 찾기위한 Java 프로그램 캡슐의 양을 찾기위한 Java 프로그램 Feb 07, 2025 am 11:37 AM

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

미래를 창조하세요: 완전 초보자를 위한 Java 프로그래밍 미래를 창조하세요: 완전 초보자를 위한 Java 프로그래밍 Oct 13, 2024 pm 01:32 PM

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.

See all articles