面试题答案
一键面试在Java NIO中,通过通道(如SocketChannel)读取数据时,常见异常、产生场景及处理方式如下:
1. IOException
- 产生场景:这是一个通用的I/O异常,当发生各种I/O错误时抛出,例如网络连接中断、文件不存在等与I/O操作相关的错误。
- 处理方式:在捕获该异常后,根据具体业务逻辑决定如何处理。通常可以记录日志以便后续排查问题,关闭相关的通道和资源,避免资源泄漏。例如:
try {
// 读取数据操作
int bytesRead = socketChannel.read(buffer);
} catch (IOException e) {
// 记录日志
e.printStackTrace();
// 关闭通道
try {
socketChannel.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
2. ClosedChannelException
- 产生场景:当尝试对已关闭的通道进行读取操作时抛出此异常。比如在多线程环境下,一个线程关闭了通道,而另一个线程不知道通道已关闭,继续尝试读取。
- 处理方式:捕获该异常后,可以选择重新初始化通道(如果适用),或者向用户反馈通道已关闭,操作无法进行的信息。示例代码如下:
try {
int bytesRead = socketChannel.read(buffer);
} catch (ClosedChannelException e) {
// 重新初始化通道
try {
socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("localhost", 8080));
} catch (IOException ex) {
ex.printStackTrace();
}
}
3. AsynchronousCloseException
- 产生场景:在通道处于异步操作时,如果通道被关闭,且当前操作尚未完成,就会抛出此异常。例如,在异步读取数据的过程中,另一个线程关闭了通道。
- 处理方式:捕获异常后,同样需要关闭相关资源,并根据业务需求决定是否重试操作或进行其他处理。如下代码:
try {
Future<Integer> future = socketChannel.read(buffer);
while (!future.isDone()) {
// 等待操作完成
}
int bytesRead = future.get();
} catch (AsynchronousCloseException e) {
// 关闭资源
try {
socketChannel.close();
} catch (IOException ex) {
ex.printStackTrace();
}
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace();
}
4. NotYetConnectedException
- 产生场景:当尝试在尚未连接的通道上进行读取操作时抛出此异常。例如,在使用
SocketChannel
时,调用read
方法前没有先调用connect
方法建立连接。 - 处理方式:捕获异常后,确保先建立连接再进行读取操作。示例如下:
try {
int bytesRead = socketChannel.read(buffer);
} catch (NotYetConnectedException e) {
try {
socketChannel.connect(new InetSocketAddress("localhost", 8080));
int bytesRead = socketChannel.read(buffer);
} catch (IOException ex) {
ex.printStackTrace();
}
}