Java에서 null 값을 확인하는 가장 좋은 방법?
객체의 함수를 호출하기 전에 객체가 null인지 확인해야 합니다.NullPointerException
.
어떻게 하면 좋을까요?나는 이 방법들을 고려했다.
Java에 가장 적합한 프로그래밍 프랙티스는 무엇입니까?
// Method 1
if (foo != null) {
if (foo.bar()) {
etc...
}
}
// Method 2
if (foo != null ? foo.bar() : false) {
etc...
}
// Method 3
try {
if (foo.bar()) {
etc...
}
} catch (NullPointerException e) {
}
// Method 4 -- Would this work, or would it still call foo.bar()?
if (foo != null && foo.bar()) {
etc...
}
방법 4가 최선입니다.
if(foo != null && foo.bar()) {
someStuff();
}
숏 평가를 사용합니다.즉, 숏 평가는 첫 번째 상태가 되면 종료됩니다.logical AND
거짓입니다.
마지막이자 가장 좋은 것, 즉 논리적이고
if (foo != null && foo.bar()) {
etc...
}
왜냐하면 논리적으로&&
오른쪽이 무엇인지 알 필요가 없습니다. 결과는 거짓이어야 합니다.
다음 내용을 읽기를 선호합니다. Java 논리 연산자 단락
Java 8을 사용할 수 있습니다.
if(nonNull(foo)){
//
}
- 잡히지 않다
NullPointerException
그것은 나쁜 습관이다.값이 null이 아닌 것을 확인하는 것이 좋습니다. - 방법 #4가 효과적입니다.Java가 단락되어 있기 때문에 두 번째 조건은 평가되지 않습니다(즉, 부울식의 최종 결과를 변경하지 않으면 후속 조건은 평가되지 않습니다).이 경우 논리 AND의 첫 번째 식이 false로 평가되면 후속 식을 평가할 필요가 없습니다.
방법 4는 어떤 일이 일어날지 명확하게 나타내며 최소한의 코드를 사용하기 때문에 단연코 최선의 방법입니다.
방법 3은 모든 단계에서 잘못된 것입니다.이 아이템은 무효가 될 수 있기 때문에 예외적인 상황은 아닙니다.
방법 2는 필요한 것보다 더 복잡하게 만드는 것입니다.
메서드 1은 코드 행이 추가된 메서드4일 뿐입니다
Java 7에서는Objects.requireNonNull()
. Import 추가Objects
에서 수업하다.java.util
.
public class FooClass {
//...
public void acceptFoo(Foo obj) {
//If obj is null, NPE is thrown
Objects.requireNonNull(obj).bar(); //or better requireNonNull(obj, "obj is null");
}
//...
}
다른 사람들이 말했듯이 라이브러리 방법을 사용하지 않을 때는 4번이 가장 좋습니다.단, 오타가 발생했을 때 실수로 foo에 null을 할당하지 않도록 항상 비교 왼쪽에 null을 입력해야 합니다.이 경우 컴파일러는 오류를 검출합니다.
// You meant to do this
if(foo != null){
// But you made a typo like this which will always evaluate to true
if(foo = null)
// Do the comparison in this way
if(null != foo)
// So if you make the mistake in this way the compiler will catch it
if(null = foo){
// obviously the typo is less obvious when doing an equality comparison but it's a good habit either way
if(foo == null){
if(foo = null){
내가 본 코드 중 가장 일반적인 사자성어는 4번 방법이라고 생각한다.근데 이건 항상 좀 냄새나는 것 같아.foo == null이 foo.bar() == false와 같다고 가정합니다.
그게 항상 옳은 것 같진 않아.
방법 4가 제가 선호하는 방법입니다.& & 오퍼레이터의 단락은 코드를 가장 쉽게 읽을 수 있게 합니다.방법 3, Null Pointer 포착예외는 간단한 null 체크만으로 충분할 경우 대부분 눈살을 찌푸리게 됩니다.
갱신하다
I created a java library(Maven Dependency) for the java developers to remove this NullPointerException Hell from their code. Check out my repository.Java에서의 Null 값을 처리하는 일반적인 방법
<script src="https://gist.github.com/rcvaram/f1a1b89193baa1de39121386d5f865bc.js"></script>
해당 객체가 null이 아닌 경우 다음 작업을 수행합니다.
a. 오브젝트를 변환할 수 있습니다(I).
b. 객체(I)를 변환하는 대신 출력으로 반환할 수 있습니다.
c. 둘 다 할 수 있다
이 경우 객체인 입력 파라미터(I)를 취할 필요가 있는 함수를 전달해야 합니다.이렇게 하면 오브젝트를 원하는 대로 변환할 수 있습니다.또, 그 함수는 무엇인가(O)가 될 수도 있습니다.
개체가 null인 경우 다음 작업을 수행합니다.
a. 커스터마이즈된 방법으로 예외를 둘 수 있습니다.
b. 반품할 수 있습니다.
이 경우 오브젝트는 null이므로 값을 지정해야 합니다.그렇지 않으면 예외를 발생시켜야 합니다.
두 가지 예를 들겠습니다.
- 문자열에서 트림을 실행하려면 해당 문자열이 null이 아니어야 합니다.이 경우 Null 값을 추가로 확인해야 합니다.그렇지 않으면 Null Pointer를 얻을 수 있습니다.예외.
public String trimValue(String s){
return s == null ? null : s.trim();
}
- 오브젝트가 null이 아닌 경우 오브젝트로 새 값을 설정하고 싶은 다른 함수. 그렇지 않은 경우 런타임 예외를 발생시키고 싶습니다.
public void setTeacherAge(Teacher teacher, int age){
if (teacher != null){
teacher.setAge(age);
} else{
throw new RuntimeException("teacher is null")
}
}
이 설명에서는 오브젝트가 늘이 아닌 경우 실행되는 함수(value가 null일 수 있음)와 오브젝트가 늘인 경우 실행되는 다른 공급업체 함수를 만들었습니다.
범용 기능
public <I, O> O setNullCheckExecutor(I value, Function<I, O> nonNullExecutor, Supplier<O> nullExecutor) {
return value != null ? nonNullExecutor.apply(value) : nullExecutor.get();
}
따라서 이 일반적인 함수를 가진 후 예제 방법 1에 대해 다음과 같이 할 수 있습니다.
//To Trim a value
String trimmedValue = setNullCheckExecutor(value, String::trim, () -> null);
여기서 non NullExecutor 함수는 값을 트리밍합니다(Method Reference 사용).null Executor함수는 ID 함수이므로 null을 반환합니다.
2.
// mutate the object if not null otherwise throw a custom message runtime exception instead of NullPointerException
setNullCheckExecutor(teacher, teacher -> {
teacher.setAge(19);
return null;
}, () -> {
throw new RuntimeException("Teacher is null");
});
수정:이는 Java가 아닌 C/C++에만 해당됩니다.
"=="를 이중으로 확인하려면 다음과 같은 개체 참조를 사용하여 null을 선택하십시오.
if(null == obj)
대신
if(obj == null)
single equal if(obj = null)를 잘못 입력하면 true가 반환되기 때문입니다.
호출되는 API를 제어하는 경우 Guava의 Optional 클래스 사용을 고려하십시오.
자세한 것은 이쪽.메서드를 변경하여 다음 명령을 반환한다.Optional<Boolean>
Boolean
.
, 「」의 중 「」의 null 의 가 있는 것이 됩니다.Optional
Commons Apache 라이브러리에 액세스 할 수 없는 경우는, 다음의 조작이 유효하게 됩니다.
if(null != foo && foo.bar()) {
//do something
}
null을 확인하는 간단한 한 줄 코드:
namVar == null ? codTdoForNul() : codTdoForFul();
이 경우에도 하실 수 있습니다.StringUtils.isNoneEmpty("")
무효로 하다
당신의 마지막 프러포즈가 최고입니다.
if (foo != null && foo.bar()) {
etc...
}
이유:
- 읽기가 더 쉬워요.
- 안전: foo == null인 경우 foo.bar()은 실행되지 않습니다.
- Null Pointer를 잡는 등의 악습을 방지합니다.예외(대부분 코드의 버그로 인해)
- 다른 방법보다 빠를 수도 있고 더 빠를 수도 있습니다(단, 거의 알아차릴 수 없다고 생각합니다).
오브젝트 클래스의 Object.requireNonNull 정적 메서드를 사용할 수 있습니다.구현은 다음과 같습니다.
public void someMethod(SomeClass obj) {
Objects.requireNonNull(obj, "Validation error, obj cannot be null");
}
public <T, U> U defaultGet(T supplier, Function<T, U> mapper, U defaultValue) {
return Optional.ofNullable(supplier).map(mapper).orElse(defaultValue);
}
함수 프로그래밍을 선호하는 경우 이 함수를 만들 수 있습니다.
언급URL : https://stackoverflow.com/questions/17302256/best-way-to-check-for-null-values-in-java
'programing' 카테고리의 다른 글
라라벨에서 phpunit을 사용하여 특정 테스트 클래스를 테스트하는 방법 (0) | 2022.09.21 |
---|---|
기존 테이블에 자동 증가 기본 키 삽입 (0) | 2022.09.21 |
Arrays.asList(array)와 새로운 ArrayList(Arrays.asList(array)의 차이점 (0) | 2022.09.21 |
서버 측에서 Google reCAPTCHA v3를 검증하는 방법 (0) | 2022.09.19 |
출시 전 안드로이드 애플리케이션 최적화 (0) | 2022.09.19 |