JavaRush /Java Blog /Random-KO /트릭과 팁. Java 애플리케이션에서 NullPointerException을 방지하는 방법
DarthVictor
레벨 28

트릭과 팁. Java 애플리케이션에서 NullPointerException을 방지하는 방법

Random-KO 그룹에 게시되었습니다
트릭과 팁.  Java 애플리케이션에서 NullPointerException을 방지하는 방법 - 1오늘은 애플리케이션에서 NullPointerException을 방지하는 방법에 대한 간단한 기술을 보여 드리겠습니다. 따라하기 쉽지만 코드의 신뢰성과 품질이 크게 향상됩니다. 게다가 내 경험상 첫 번째 팁은 코드 품질에 눈에 띄는 영향을 미칠 것입니다. 다른 Java 프로그래밍 요령을 알고 있다면 댓글로 자유롭게 공유해 주세요. 트릭과 팁.  Java 애플리케이션에서 NullPointerException을 방지하는 방법 - 2

알 수 없는 객체가 아닌 알려진 문자열 리터럴에 대해 equals() 및 equalsIgnoreCase() 메서드를 호출합니다.

equals()항상 가 아닌 알려진 문자열에 대해 메소드를 호출하십시오 null. 이 메서드 equals()는 대칭적입니다. 즉, 호출하면 a.equals(b)동일한 b.equals(a)결과가 제공됩니다(인 경우 ab그렇지 않은 경우 ). 이러한 이유로 많은 프로그래머는 어떤 객체가 호출되는지 ( y 또는 y ) null에 주의를 기울이지 않습니다 . 이것의 부작용 중 하나는 메소드가 호출되는 경우 NullPointerException입니다 . equals()abnull
Object unknownObject = null;

//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
   System.err.println("This may result in NullPointerException if unknownObject is null");
}

//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject null
if("knownObject".equals(unknownObject)){
    System.err.println("better coding avoided NullPointerException");
}
equals()이는 NullPointerException을 방지하기 위한 가장 간단한 팁이었지만 이 메서드가 모든 곳에서 발견되므로 이것만으로도 큰 개선이 이루어졌습니다 .

둘 다 동일한 결과를 생성하는 경우 toString() 대신 valueOf()를 선택합니다.

toString()값이 있는 참조를 호출하면 NullPointerException이 발생 하므로 동일한 결과를 얻을 수 있을 때 호출 을 사용 null하는 것이 좋습니다 . 이는 , 또는 와 같은 래퍼 클래스의 경우 특히 그렇습니다 . valueOf()valueOf()nullnullIntegerFloatDoubleBigDecimal
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
객체가 존재할 수 있는지 여부가 확실하지 않을 때 이 팁을 사용하십시오 null.

null안전한 방법 및 라이브러리 사용

NET에 대한 테스트에 큰 부담을 주는 오픈 소스 라이브러리가 많이 있습니다 null. 가장 일반적인 것 중 하나는 StringUtilsApache Commons에서 나온 것입니다. StringUtils.isBlank(), 등 의 방법을 사용합니다 isNumeric(). isWhiteSpace()NullPointerException이 발생하는 것에 대해 걱정할 필요가 없습니다.
//Методы StringUtils являются null-безопасными, они не вызовут NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
출력: true true false false 그러나 사용하기 전에 null안전한 메소드 및 클래스에 대한 문서를 읽는 것을 잊지 마십시오. 이것은 많은 노력을 들이지 않고도 엄청난 개선을 가져올 수 있는 최고의 Java 트릭 중 하나입니다.

null메서드에서 반환하지 마세요 . 빈 컬렉션을 반환하는 것이 더 좋습니다.

이것은 Joshua Bloch가 그의 저서 Java: Effective 프로그래밍에서 설명한 또 다른 좋은 Java 프로그래밍 팁입니다. size()빈 컬렉션이나 배열을 반환할 때 또는 같은 기본 메서드를 호출하면 length()NullPointerException이 발생하지 않는지 확인하세요 . 클래스는 Collections빈 목록, 집합 및 사전의 편리한 구현을 구체적으로 선언합니다: Collections.EMPTY_LIST, Collections.EMPTY_SETCollections.EMPTY_MAP. 예를 들어:
public List getOrders(Customer customer){
   List result = Collections.EMPTY_LIST;
   return result;
}
마찬가지로 Collections.EMPTY_SETCollections.EMPTY_MAP반환하는 대신 사용할 수도 있습니다 null.

@NotNull 및 @Nullable 주석을 사용하세요.

메서드 설명에서 null주석 @NotNull과 @Nullable을 사용하여 메서드가 반환될 수 있는지 null여부를 나타내는 메서드 안전 규칙을 정의할 수 있습니다. 최신 컴파일러와 IDE는 이러한 주석을 사용하여 코드를 분석하고 적절한 조언을 제공할 수 있습니다(예: 에 대한 검사 누락 null또는 그 반대로 코드를 막고 있는 불필요한 검사 제거 가능성에 대해). 예를 들어 이러한 주석은 IntelliJ IDE 및 FindBugs에서 지원되며 JSR 305에도 포함되어 있습니다. 그러나 IDE가 이러한 주석을 지원하지 않더라도 그 자체로 좋은 문서가 될 것입니다. 살펴보면 프로그래머가 검사를 추가할 위치와 추가하지 않을 위치를 이해하는 것이 더 쉬울 것 @NotNull입니다 . 그건 그렇고, 이것은 Java 프로그래머들 사이에서 상당히 새로운 관행이며 확산되는 데는 시간이 걸릴 것입니다. @Nullablenull

코드에서 불필요한 오토박싱 및 오토언박싱을 피하세요.

이로 인해 불필요한 임시 객체가 생성될 뿐만 아니라 래퍼 클래스가 null. 예를 들어, 다음 코드는 개인 항목에 전화번호가 포함되어 있지 않은 경우 NullPointerException을 발생시키고 를 반환합니다 null.
Person ram = new Person("ram");
int phone = ram.getPhone();
autoboxing 또는 autounboxing을 사용하면 등식뿐 아니라 부등식에서도 <NullPointerException >이 발생할 수 있습니다.

규칙을 따르고 합리적인 기본값을 정의하십시오.

Java에서 NullPointerException을 방지하는 가장 좋은 방법 중 하나는 코딩 규칙을 올바르게 선언하고 따르는 것입니다. 대부분의 NullPointerException은 필요한 모든 데이터와 종속성이 없이 개체를 만들려고 할 때 발생합니다. 이러한 요청을 정상적으로 거부하여 완료되지 않은 개체 생성을 방지함으로써 향후 수많은 NullPointerException을 방지할 수 있습니다. 마찬가지로 객체 생성을 허용하는 경우 합리적인 기본값을 선택해야 합니다. 예를 들어, 클래스 객체는 Employee이름과 없이는 생성될 수 없지만 id전화번호는 없을 수 있습니다. 이 경우 Employee숫자가 없는 개체는 대신 0을 반환할 수 있습니다 null. 이러한 개체의 동작은 미리 생각해야 하지만 null존재하지 않는 번호로 전화를 거는 것보다 확인하는 것이 더 쉬울 수 있습니다. 이 경우 어떤 필드가 있고 null어떤 필드가 아닌지에 대한 추가 조건이 있으면 올바른 결정을 내리는 데 도움이 됩니다. 일반적으로 프로그램을 즉시 충돌시키거나 할당하는 것 사이의 선택은 null중요한 디자인 결정이며, 일단 선택했다면 이를 일관되게 따라야 합니다.

DBMS 수준에서 제한 사항 설정

null데이터베이스를 사용하여 고객이나 주문과 같은 프로그램 개체를 저장할 때 적절한 테이블 제한을 사용하여 DBMS 수준에서 개체의 "특성"을 지정하는 것이 좋습니다 . 데이터베이스에는 여러 소스의 정보가 포함되는 경우가 많으며 누락된 값에 대한 검사를 도입하면 데이터 무결성이 향상됩니다. 또한 DBMS 수준에서 null 검사가 있으면 Java 코드에서 null이 줄어듭니다. 데이터베이스에서 Java 객체로 데이터를 로드하면 해당 존재를 확인하고 != null프로그램 코드에서 불필요한 " "를 제거할 수 있습니다.

Null 개체 패턴 사용

특수 Null객체를 생성하는 것은 Java에서 NullPointerExcpetion을 피하는 또 다른 방법입니다. 애플리케이션의 일부 메소드가 이후에 해당 메소드를 호출하여 프로그램이 작업할 객체를 반환한다고 가정해 보겠습니다. 예를 들어, 이 메서드는 컬렉션을 반복하는 데 사용되는 Collection.iterator()클래스의 개체를 반환합니다 . Iterator그런 다음 원본 객체에 반복자가 없으면 대신 항상 를 반환하는 메서드가 있는 null특수 객체를 반환할 수 있습니다 . 이것이 전부입니다, 독자 여러분, 여기서 Java 프로그램의 NullPointerException 오류를 제거하는 팁을 마치겠습니다. 이 간단하고 부담스럽지 않은 규칙이 얼마나 유용할 수 있는지 이해하게 될 것입니다. 참고로, Java 프로그램의 다른 NullPointerException 트릭을 공유하고 싶다면 댓글을 통해 자유롭게 공유해 주세요. JavaRush 학생들을 위해 특별히 번역되었습니다. 원래의NullhasNext()false
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION