面试题答案
一键面试常见异常及举例
- BufferOverflowException
- 举例:当向一个容量固定的Buffer中写入数据,而写入的数据量超过了Buffer剩余的可写空间时会抛出该异常。例如:
ByteBuffer buffer = ByteBuffer.allocate(10); byte[] data = new byte[15]; buffer.put(data); // 这里会抛出BufferOverflowException,因为buffer容量为10,而data长度为15
- BufferUnderflowException
- 举例:当从Buffer中读取数据,而当前位置超过了缓冲区中实际包含的数据量时会抛出该异常。例如:
ByteBuffer buffer = ByteBuffer.wrap(new byte[]{1, 2, 3}); buffer.position(5); // 将位置设置到5,超过了实际数据长度3 byte b = buffer.get(); // 这里会抛出BufferUnderflowException
- ReadOnlyBufferException
- 举例:当尝试对只读Buffer进行写操作时会抛出该异常。例如:
ByteBuffer buffer = ByteBuffer.allocate(10); ByteBuffer readOnlyBuffer = buffer.asReadOnlyBuffer(); readOnlyBuffer.put((byte) 1); // 这里会抛出ReadOnlyBufferException
异常处理方式
- BufferOverflowException处理
- 在写入数据前,确保写入的数据量不会超过Buffer的剩余空间。可以通过
remaining()
方法获取Buffer剩余的可写空间。例如:
ByteBuffer buffer = ByteBuffer.allocate(10); byte[] data = new byte[15]; for (int i = 0; i < data.length; i++) { if (buffer.remaining() == 0) { // 处理缓冲区已满的情况,例如扩容或者另起一个缓冲区 break; } buffer.put(data[i]); }
- 在写入数据前,确保写入的数据量不会超过Buffer的剩余空间。可以通过
- BufferUnderflowException处理
- 在读取数据前,确保当前位置加上要读取的数据量不会超过缓冲区实际的数据量。可以通过
hasRemaining()
方法判断是否还有剩余数据可读。例如:
ByteBuffer buffer = ByteBuffer.wrap(new byte[]{1, 2, 3}); while (buffer.hasRemaining()) { byte b = buffer.get(); System.out.println(b); }
- 在读取数据前,确保当前位置加上要读取的数据量不会超过缓冲区实际的数据量。可以通过
- ReadOnlyBufferException处理
- 在对Buffer进行操作前,先判断是否为只读Buffer。可以通过
isReadOnly()
方法判断。例如:
ByteBuffer buffer = ByteBuffer.allocate(10); ByteBuffer readOnlyBuffer = buffer.asReadOnlyBuffer(); if (readOnlyBuffer.isReadOnly()) { // 只读,不进行写操作,或者进行数据复制到可写缓冲区等处理 ByteBuffer writableBuffer = ByteBuffer.allocate(readOnlyBuffer.remaining()); readOnlyBuffer.duplicate().get(writableBuffer.array()); } else { readOnlyBuffer.put((byte) 1); }
- 在对Buffer进行操作前,先判断是否为只读Buffer。可以通过