Java代码运行提示变量i不存在,try/catch外无法访问变量如何修复?
问题原因分析
你遇到的报错和try/catch、异常处理都没有关系,核心是变量作用域问题:
你在for(int i=startPortRange; i <=stopPortRange; i++)的循环头部定义了变量i,这个变量的作用域仅局限在for循环的大括号内部,循环执行结束后变量i就会被销毁,因此你在循环结束后执行System.out.println("Port not in use: " + i );时,自然会找不到变量i。
你此前通过添加throws UnknownHostException解决的是受检异常必须捕获或抛出的问题,和本次的变量语法错误属于完全不同的两类问题,无需通过新增throws声明解决本次问题。
修复方案
1. 基础语法修复(仅解决变量找不到的报错)
只需要把变量i的定义移动到for循环外部,扩大它的作用域即可:
//Finding Free Port int startPortRange=0; int stopPortRange=65365; int i; // 将i的定义提到for循环外 for(i=startPortRange; i <=stopPortRange; i++) { try { Socket ServerSok = new Socket(hostIP,i); System.out.println("Port in use: " + i ); ServerSok.close(); } catch (Exception e) { e.printStackTrace(); } } System.out.println("Port not in use: " + i );
注意:这个修复仅解决了语法错误,但你的业务逻辑存在问题:循环结束后
i的值会是65366,打印出来的结果并不是实际可用的端口。
2. 逻辑优化(实现端口扫描的正确效果)
你的代码逻辑中,Socket连接失败抛出异常时对应的端口才是未被占用的端口,因此可以直接在catch块中记录可用端口,如果你只需要找第一个可用端口,还可以提前终止循环:
//Finding Free Port int startPortRange=0; int stopPortRange=65365; Integer freePort = null; for(int i=startPortRange; i <=stopPortRange; i++) { try { Socket ServerSok = new Socket(hostIP,i); System.out.println("Port in use: " + i ); ServerSok.close(); } catch (Exception e) { // 抛出异常说明端口未被占用 freePort = i; System.out.println("Found available port: " + i); // 如果只需要第一个可用端口,就打开下面的注释提前退出循环 // break; } } if(freePort != null){ System.out.println("First available port: " + freePort ); }else{ System.out.println("No available port found in range 0-65365"); }
内容的提问来源于stack exchange,提问作者Sina Aghily
相关产品推荐
相关产品推荐

