面试题答案
一键面试- IOException
- 说明:这是一个通用的I/O异常,Socket编程中许多操作如读取、写入数据,连接服务器等都可能抛出此异常。例如,网络连接中断、远程主机拒绝连接等情况。
- 处理:在
try - catch
块中捕获该异常,在catch
块中进行适当的错误处理。可以记录异常日志,关闭相关的Socket连接以避免资源泄漏,根据具体业务逻辑选择是否尝试重新连接等操作。例如:
try { // Socket相关操作 Socket socket = new Socket("localhost", 8080); // 读取或写入数据 InputStream inputStream = socket.getInputStream(); } catch (IOException e) { e.printStackTrace(); // 记录日志 Logger.getLogger(YourClassName.class.getName()).log(Level.SEVERE, "Socket操作出现异常", e); // 关闭Socket if (socket!= null &&!socket.isClosed()) { try { socket.close(); } catch (IOException ex) { ex.printStackTrace(); } } }
- BindException
- 说明:当试图将Socket绑定到一个已经被其他进程占用的端口时,会抛出此异常。
- 处理:捕获该异常后,可以选择提示用户端口已被占用,或者尝试绑定到其他可用端口。例如:
try { ServerSocket serverSocket = new ServerSocket(8080); } catch (BindException e) { e.printStackTrace(); System.out.println("端口8080已被占用,尝试绑定到其他端口"); try { ServerSocket serverSocket = new ServerSocket(8081); } catch (IOException ex) { ex.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); }
- SocketTimeoutException
- 说明:在设置了Socket超时时间后,如果在规定时间内未完成相应操作(如读取数据、连接建立等),就会抛出此异常。
- 处理:捕获该异常后,可以根据业务需求决定是否重新尝试操作,或者向用户反馈操作超时的信息。例如:
try { Socket socket = new Socket(); socket.connect(new InetSocketAddress("localhost", 8080), 5000); // 设置连接超时5秒 // 读取数据 InputStream inputStream = socket.getInputStream(); byte[] buffer = new byte[1024]; int length = inputStream.read(buffer, 0, buffer.length, 3000); // 设置读取超时3秒 } catch (SocketTimeoutException e) { e.printStackTrace(); System.out.println("操作超时,请稍后重试"); } catch (IOException e) { e.printStackTrace(); }
- ConnectException
- 说明:当试图连接到一个拒绝连接的远程主机(例如远程主机未运行或防火墙阻止连接)时,会抛出此异常。
- 处理:捕获该异常后,同样可以记录日志,提示用户连接失败,根据具体情况决定是否尝试重新连接。例如:
try { Socket socket = new Socket("localhost", 8080); } catch (ConnectException e) { e.printStackTrace(); Logger.getLogger(YourClassName.class.getName()).log(Level.SEVERE, "连接远程主机失败", e); System.out.println("无法连接到服务器,请检查服务器状态和网络连接"); // 可以添加尝试重新连接的逻辑 } catch (IOException e) { e.printStackTrace(); }