Java Sonarcube及其异常处理机制

Java Sonarcube及其异常处理机制,java,exception,try-catch,Java,Exception,Try Catch,我已经实现了一些允许在应用服务器上处理套接字连接的功能。以下是我的代码摘录: @Dependent public class SocketServerService { @Resource(name = "DefaultManagedThreadFactory") private ManagedThreadFactory threadFactory; private ServerSocket serverSocket; private Thread socketServerT

我已经实现了一些允许在应用服务器上处理套接字连接的功能。以下是我的代码摘录:

@Dependent
public class SocketServerService {

  @Resource(name = "DefaultManagedThreadFactory")
  private ManagedThreadFactory threadFactory;

  private ServerSocket serverSocket;
  private Thread socketServerThread;
  private volatile boolean isListening = false;

  public void startListening(int port) {
     socketServerThread = threadFactory.newThread(() ->   listeningOnSocket(port));
     socketServerThread.setName("ServerSocketThread");
     socketServerThread.start();
  }

  private void listeningOnSocket(int port) {
     try {
         serverSocket = new ServerSocket(port);
         waitForRequestAndProcessData();
     } catch (IOException e) {
         logger.error("Could not listen on socket: " + port, e);
     }
  }

 private void waitForRequestAndProcessData() {
     while (isListening) {
         try {
             final Socket socket = serverSocket.accept();
             process(socket);// do something on data received from socket that 
                             // can throw some checked or unchecked exceptions

          } catch (Exception e) {
             logger.error("Error while processing data.", e);
          }
      }
  } 

  private void stopServerSocket() {
      socketServerThread.interrupt();
  }

...
}

如您所见,我使用ManagedThreadFactory创建可管理线程。当我使用Sonarcube验证代码时,它显示了以下错误:

而是捕获特定异常子类型的列表。

我知道使用
catch(exception e)
处理所有异常是一种不好的做法,但我不知道如何更改代码来解决这个问题。当
process
方法中发生错误时,我不想退出
while(isListening){}
循环(我只想记录错误并处理套接字中的下一段数据)。但是我应该捕获什么类型的异常呢?当然,我可以在
process
方法中声明一些选中的异常,并在
waitForRequestAndProcessData
方法中捕获它,但在这种情况下,我将在
process
方法中添加
catch(异常e)
。在这种情况下,Sonarcube也将显示 捕获特定异常子类型的列表,而不是
过程
方法的
消息。也许我应该以某种方式重新设计我的代码?或者在这种情况下,缓存所有异常并不是那么糟糕的做法?

ServerSocket.accept()
只能引发以下异常:

  • IOException
    及其子类,它是一个已检查的异常
  • 任何数量的
    RuntimeException
    及其子类
因此,您可以用以下内容替换捕获物:

  } catch (IOException | RuntimeException e) {
     logger.error("Error while processing data.", e);
  }
现在仍然可以肯定的是,所有的异常都会被捕获

您还可以使
运行时异常显式,这将导致:

  } catch (IOException | SecurityException | IllegalBlockingModeException e) {
     logger.error("Error while processing data.", e);
  }
ServerSocket.accept()
只能引发以下异常:

  • IOException
    及其子类,它是一个已检查的异常
  • 任何数量的
    RuntimeException
    及其子类
因此,您可以用以下内容替换捕获物:

  } catch (IOException | RuntimeException e) {
     logger.error("Error while processing data.", e);
  }
现在仍然可以肯定的是,所有的异常都会被捕获

您还可以使
运行时异常显式,这将导致:

  } catch (IOException | SecurityException | IllegalBlockingModeException e) {
     logger.error("Error while processing data.", e);
  }