Java 如何保护try with resources语句之外的变量?

Java 如何保护try with resources语句之外的变量?,java,sonarqube,java-11,Java,Sonarqube,Java 11,目前在我的公司,我们收到了Sonarqube评论,其中一篇评论中有这样一条警告:不要使用try with resources语句(见下文): 这个问题的解决方案可能看起来很简单,也就是说,我可以将套接字变量包装在try()资源中,但为了做到这一点,我需要在try语句之外声明主机和端口变量。我对该解决方案的担忧是,如果没有给出主机或端口号,则此try语句之外的变量现在将不受保护 public static void main(String[] args) throws Exception { S

目前在我的公司,我们收到了Sonarqube评论,其中一篇评论中有这样一条警告:不要使用
try with resources
语句(见下文):

这个问题的解决方案可能看起来很简单,也就是说,我可以将套接字变量包装在
try()资源中,但为了做到这一点,我需要在
try
语句之外声明主机和端口变量。我对该解决方案的担忧是,如果没有给出主机或端口号,则此
try
语句之外的变量现在将不受保护

public static void main(String[] args) throws Exception {

String host = InetAddress.getByName("myLocalHost").getHostAddress();
int port = Integer.parseInt(System.getenv("Port");

try (
    Socket s1 = new Socket(host, port);
    Socket s2 = new Socket(host2, port2);
    ) {
      ....
      }
   }

我的问题是,是否有更好的方法来保护这些留在
try
语句之外的变量,或者我所采用的方法是否足够;您可以先创建实例,然后再连接:

try(套接字s1=新套接字();套接字s2=新套接字()){
InetAddress主机=InetAddress.getByName(“myLocalHost”);
int-port=Integer.parseInt(System.getenv(“端口”);
s1.连接(新的InetSocketAddress(主机、端口));
InetAddress主机2=InetAddress.getByName(“第二主机”);
intport2=Integer.parseInt(System.getenv(“port2”);
s2.connect(新的InetSocketAddress(主机2,端口2));
//使用插座
}
关闭从未连接的
套接字
没有问题,即在创建后但在
连接
调用之前发生异常时

请注意,上面的代码使用解析的
InetAddress
,而不是调用
getHostAddress()
,以获取将在连接操作期间再次解析的字符串

通过删除此冗余操作,您还可以编写

try(sockets1=newsocket(“myLocalHost”,Integer.parseInt(System.getenv(“Port”)));
套接字s2=新套接字(“第二个主机”,Integer.parseInt(System.getenv(“Port2”))){
//使用插座
}

这将首先解析套接字构造函数中的名称。如果发生异常,将释放到目前为止分配的所有资源。

我不确定是否理解。是否要在try块中围绕
主机
端口
的声明?因为你可以做到。您认为不能在try块中使用资源进行尝试吗?如果需要,可以嵌套try块。但是打电话的人不应该处理这种情况吗?你不必从源头上压制一切。异常处理意味着允许引发异常,直到它位于可以处理问题的位置。@NathanHughes,但是如果我执行嵌套的
try
,那么这可能是多余的,正如您所提到的,如果没有提供主机或端口,那么这些错误应该由异常处理,因此,我所遵循的方法应该是好的,我想,如果该方法能够让异常从中抛出,并让更高层次的东西来处理它,那就更好了。
public static void main(String[] args) throws Exception {

String host = InetAddress.getByName("myLocalHost").getHostAddress();
int port = Integer.parseInt(System.getenv("Port");

try (
    Socket s1 = new Socket(host, port);
    Socket s2 = new Socket(host2, port2);
    ) {
      ....
      }
   }