> Java > java지도 시간 > 모든 개발자가 알아야 할 주요 ava 버그(및 해당 솔루션)

모든 개발자가 알아야 할 주요 ava 버그(및 해당 솔루션)

WBOY
풀어 주다: 2024-09-03 11:40:44
원래의
694명이 탐색했습니다.
Top ava Bugs (and Their Solutions) Every Developer Should Know 1.

"NullPointerException" 악몽


문제 NullPointerException(NPE)은 아마도 Java에서 가장 악명 높은 버그일 것입니다. 코드에서 null인 개체 참조를 사용하려고 할 때 발생합니다. 이는 null 객체에 대한 메서드 호출, null 객체의 필드 액세스, null 예외 발생 등 다양한 시나리오에서 발생할 수 있습니다.

해결책

NullPointerException을 방지하려면 객체를 사용하기 전에 항상 null을 확인하세요. Java 8에 도입된 Java의 Optional 클래스를 사용하여 잠재적인 null 값을 보다 적절하게 처리할 수도 있습니다.
String str = null;
int length = str.length(); // NullPointerException
로그인 후 복사

전통적인 Null 검사

선택사항 사용

if (str != null) {
    int length = str.length();
} else {
    System.out.println("String is null");
}
로그인 후 복사
참고자료

Optional<String> optionalStr = Optional.ofNullable(str);
int length = optionalStr.map(String::length).orElse(0);
로그인 후 복사
NullPointerException 이해

Java에서 Optional 사용
  • 2.
  • 동시수정 예외: Silent Crasher

문제 ConcurrentModificationException은 iterator(), forEach 또는 for-each 루프와 같은 메서드를 사용하여 컬렉션을 반복하는 동안 컬렉션이 수정될 때 발생합니다. 이는 예기치 않게 발생하는 경우가 많기 때문에 특히 실망스러울 수 있습니다.

해결책

ConcurrentModificationException을 방지하려면 컬렉션을 직접 수정하는 대신 반복자의 Remove() 메서드를 사용하세요. 또는 CopyOnWriteArrayList와 같은 동시 컬렉션을 사용할 수 있습니다.
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
for (String item : list) {
    if ("two".equals(item)) {
        list.remove(item); // ConcurrentModificationException
    }
}
로그인 후 복사

Iterator의 제거() 사용

CopyOnWriteArrayList 사용

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    if ("two".equals(item)) {
        iterator.remove(); // Safe removal
    }
}
로그인 후 복사
참고자료

List<String> list = new CopyOnWriteArrayList<>(Arrays.asList("one", "two", "three"));
for (String item : list) {
    if ("two".equals(item)) {
        list.remove(item); // Safe removal with no exception
    }
}
로그인 후 복사
ConcurrentModificationException 방지

  • 3.
  • 메모리 누수: 숨겨진 적

문제 Java의 자동 가비지 수집 기능은 메모리 관리에 탁월하지만 완벽하지는 않습니다. 메모리 누수는 개체가 의도치 않게 메모리에 보관되어 가비지 수집기가 해당 개체를 회수할 수 없을 때 발생합니다. 이로 인해 OutOfMemoryError가 발생하고 시간이 지남에 따라 애플리케이션 성능이 저하될 수 있습니다.

메모리 누수의 일반적인 원인 중 하나는 객체가 정적 컬렉션에 추가되고 제거되지 않는 경우입니다.

해결책

메모리 누수를 방지하려면 정적 컬렉션 사용에 주의하고 더 이상 필요하지 않은 개체가 제거되었는지 확인하세요. 프로파일러 및 메모리 누수 감지기(예: VisualVM, Eclipse MAT)와 같은 도구는 메모리 누수를 식별하고 진단하는 데 도움이 될 수 있습니다.
public class MemoryLeakExample {
    private static List<String> cache = new ArrayList<>();

    public static void addToCache(String data) {
        cache.add(data);
    }
}
로그인 후 복사

예제 수정

참고자료

public static void addToCache(String data) {
    if (cache.size() > 1000) {
        cache.clear(); // Avoid unbounded growth
    }
    cache.add(data);
}
로그인 후 복사
Java의 메모리 누수 이해

  • 4.
  • ClassCastException: 예상치 못한 충돌

문제 ClassCastException은 객체를 인스턴스가 아닌 하위 클래스로 캐스팅하려고 할 때 발생합니다. 이는 일반적으로 제네릭을 제대로 사용하지 않는 컬렉션이나 레거시 코드로 작업할 때 발생합니다.

해결책

ClassCastException을 방지하려면 캐스팅하기 전에 항상 유형을 확인하세요. 더 나은 방법은 제네릭을 사용하여 컴파일 타임에 유형 안전성을 강화하는 것입니다.
Object obj = "hello";
Integer num = (Integer) obj; // ClassCastException
로그인 후 복사

안전 유형 확인

제네릭 사용

if (obj instanceof Integer) {
    Integer num = (Integer) obj;
}
로그인 후 복사
참고자료

List<String> list = new ArrayList<>();
list.add("hello");
String str = list.get(0); // No casting needed
로그인 후 복사
ClassCastException 방지

  • 5.
  • 무한 루프: CPU 호거

문제 루프 조건이 결코 false가 되지 않기 때문에 루프가 무한정 계속 실행될 때 무한 루프가 발생합니다. 이로 인해 애플리케이션이 중단되고 사용 가능한 CPU가 모두 소모되어 응답하지 않게 될 수 있습니다.

해결책

항상 루프에 유효한 종료 조건이 있는지 확인하세요. 디버깅 도구를 사용하거나 로깅을 추가하여 루프가 예상대로 종료되는지 확인할 수 있습니다.
while (true) {
    // Infinite loop
}
로그인 후 복사

Fixing the Example

int counter = 0;
while (counter < 10) {
    System.out.println("Counter: " + counter);
    counter++; // Loop will terminate after 10 iterations
}
로그인 후 복사

References

  • Preventing Infinite Loops in Java

Conclusion

While Java is a robust and reliable language, these common bugs can trip up even experienced developers. By understanding and implementing the solutions we've discussed, you can write more stable and maintainable code. Remember, the key to avoiding these pitfalls is to be aware of them and to adopt best practices that mitigate their impact. Happy coding!


Written by Rupesh Sharma AKA @hackyrupesh

위 내용은 모든 개발자가 알아야 할 주요 ava 버그(및 해당 솔루션)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿