-
자바 8에서의 CharBuffer와 ByteBuffer의 flip() 메소드 문제JAVA 2024. 12. 26. 11:04
나는 현재 자바 8을 사용중이고 아래와 같이 코드를 작성했다.
java.nio.CharBuffer charBuffer; java.nio.ByteBuffer byteBuffer; charBuffer.flip(); byteBuffer.flip();이 코드에서 컴파일 시에는 오류가 발생하지 않았지만, 프로그램을 실행할 때 런타임 오류가 발생했다.
오류 메시지는 다음과 같다.
java.lang.NoSuchMethodError: java.nio.CharBuffer.flip()Ljava/nio/CharBuffer;
찾아보니 자바 8에서 실행하기 위한 프로그램을 컴파일하기 위해 JDK 11(상위 JDK 버전)을 사용하고 있기 때문에 실행시에는 예외가 발생할수있다고 한다.
문제의 원인
1. 자바 8의 filp() 메소드
public final Buffer flip() { limit = position; position = 0; mark = -1; return this; }2. 자바 11의 flip() 메소드
ByteBuffer flip() { super.flip(); // Buffer의 flip() 을 호출 return this; } CharBuffer flip() { super.flip(); // Buffer의 flip() 을 호출 return this; }
위 코드에서 오류가 나지않았던 이유는컴파일 환경이 자바 11이기 때문에 CharBuffer와 ByteBuffer의 flip() 메소드를 호출할때 자바 11의 메소드가 사용되었기 때문이다.
결국엔 CharBuffer.filp()메소드는 자바 11에서만 존재하는 메소드인것!
자바8 Buffer 클래스에 정의된 flip() 메소드는 CharBuffer의 flip() 메소드를 찾을 수 없으니 존재하지않는다는 오류가 나온것이다.
그렇기때문에 명시적으로 CharBuffer나 ByteBuffer에 Buffer라고 선언을 해줘야지만, 자바 8의 flip()메소드가 호출된다
해결 방법
현재 자바 버전을 자바 11로 올릴수없는 상황이라면,
해당 메서드를 호출하기 전에 ByteByffer, CharBuffer를 버퍼(Buffer)로 명시적으로 캐스팅하여
Buffer클래스의 filp()메소드를 사용해야한다.
java.nio.CharBuffer charBuffer; java.nio.ByteBuffer byteBuffer; charBuffer.flip(); -> ((Buffer)charBuffer).flip(); byteBuffer.flip(); -> ((Buffer)byteBuffer).flip();결론
자바 8에서는 CharBuffer와 ByteBuffer의 flip() 메소드를 직접 사용할 수 없으므로, 반드시 Buffer로 캐스팅하여 사용하자!
컴파일 시에는 오류가 발생하지 않더라도, 런타임 시에 문제가 발생할 수 있으니 주의!
참고
'JAVA' 카테고리의 다른 글