在线等 Cannot refer to a non-final variable result inside an inner class

partys 2013-06-14 10:23:19

public String controlDoor(final String siteId,String order,final String shutdown,final String loginId,final String ip) throws NumberFormatException, UnknownHostException, IOException{
if(ip.equals(null) || order.equals(null)){
log.info("ip地址、设备id、命令不能为空");
return null;
}

Socket socket = null;
try {
socket = new Socket(ip,Integer.valueOf(Constants.DBMAP.get("WS_DOORLOCK_PORT")));
} catch (Exception e) {
log.info("***********连接失败*************"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
return "fail";
}

log.info("***********连接已经成功*************"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

// 执行开门动作
String result = openDoor(siteId, order, loginId, ip, socket, dis, dos);

// 开门成功
if("true".equals(result))
{
Timer timer = new Timer();
// 当开门成功6s后 自动关门
timer.schedule(new TimerTask() {

@Override
public void run() {
String flagString = "false";
Socket socket = null;
DataInputStream dis = null;
DataOutputStream dos = null;
try
{
socket = new Socket(ip,Integer.valueOf(Constants.DBMAP.get("WS_DOORLOCK_PORT")));
dis = new DataInputStream(socket.getInputStream());
dos = new DataOutputStream(socket.getOutputStream());
flagString =closeDoor(siteId, shutdown,loginId, ip, dis, dos, socket);
}
catch (UnknownHostException e)
{
log.error("第1次关门失败!!");
e.printStackTrace();
}
catch (IOException e)
{
log.error("第1次关门失败!!");
e.printStackTrace();
}
finally
{

// 如果关门失败 则启动保护线程 继续执行关门动作
if ("false".equals(flagString)||flagString.endsWith("false"))
{
TimeoutThread time = new TimeoutThread(2000,dis);
for(int i=1;i<5;i++)
{
try
{
Thread.sleep(400);
} catch (InterruptedException e)
{
e.printStackTrace();
}
if ("false".equals(flagString)||flagString.endsWith("false"))
{
try
{
socket = new Socket(ip,Integer.valueOf(Constants.DBMAP.get("WS_DOORLOCK_PORT")));
dis = new DataInputStream(socket.getInputStream());
dos = new DataOutputStream(socket.getOutputStream());
flagString = closeDoor(siteId, shutdown,loginId, ip, dis, dos, socket);
if ("false".equals(flagString)||flagString.endsWith("false"))
log.error("第"+(i+1)+"次关门失败!!");
}
catch (NumberFormatException e)
{
flagString = "false";
log.error("第"+(i+1)+"次关门失败!!");
e.printStackTrace();
}
catch (UnknownHostException e)
{
flagString = "false";
log.error("第"+(i+1)+"次关门失败!!");
e.printStackTrace();
}
catch (IOException e)
{
flagString = "false";
log.error("第"+(i+1)+"次关门失败!!");
e.printStackTrace();
}
}
if("true".equals(flagString))
break;
else if (4==i && ("false".equals(flagString)||flagString.endsWith("false")))
{
result= "closefail";
}
}
time.cancel();
}
}
}
}, Integer.parseInt(Constants.DBMAP.get("WS_DOOR_TIMEOUT")));

}
return result;
}


...全文
241 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
partys 2013-06-14
  • 打赏
  • 举报
回复
引用 4 楼 dracularking 的回复:
可以直接return,不要赋值了
run 是void不能返回值
dracularking 2013-06-14
  • 打赏
  • 举报
回复
可以直接return,不要赋值了
partys 2013-06-14
  • 打赏
  • 举报
回复
求高手!
partys 2013-06-14
  • 打赏
  • 举报
回复
引用 1 楼 Partys 的回复:
第103行 编译不通过!
Cannot refer to a non-final variable result inside an inner class defined in a different method
partys 2013-06-14
  • 打赏
  • 举报
回复
第103行 编译不通过!
dracularking 2013-06-14
  • 打赏
  • 举报
回复
引用 5 楼 Partys 的回复:
引用 4 楼 dracularking 的回复:
可以直接return,不要赋值了
run 是void不能返回值
根据需求来作灵活变换,除了以上网友回答的,还可以 另建一final型中间变量,因为目测result没有多次赋值 或者改匿名内部类为具名内部类
北吹 2013-06-14
  • 打赏
  • 举报
回复
方法体的局部变量被匿名内部类引用,必须为final的,这个是JAVA的规定。 不清楚你的代码上下文环境,那个result变量不能设置为成员变量么?这样可以规避这个规定,不过要考虑多线程的问题。
oh_Maxy 2013-06-14
  • 打赏
  • 举报
回复
改成静态的会不会影响你的功能?
partys 2013-06-14
  • 打赏
  • 举报
回复
引用 7 楼 oh_Maxy 的回复:
引用 5 楼 Partys 的回复:
[quote=引用 4 楼 dracularking 的回复:] 可以直接return,不要赋值了
run 是void不能返回值
return; 试试[/quote]这样没有给result赋值closefail啊.
partys 2013-06-14
  • 打赏
  • 举报
回复
引用 8 楼 snowcube 的回复:
将 result 定义为 public static final String result 试一下
final是不可变的 改成他也编译不通过
snowcube 2013-06-14
  • 打赏
  • 举报
回复
将 result 定义为 public static final String result 试一下
oh_Maxy 2013-06-14
  • 打赏
  • 举报
回复
引用 5 楼 Partys 的回复:
引用 4 楼 dracularking 的回复:
可以直接return,不要赋值了
run 是void不能返回值
return; 试试
partys 2013-06-14
  • 打赏
  • 举报
回复

67,543

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧