首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

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

2013-06-26 
在线等Cannot refer to a non-final variable result inside an inner classpublic String controlDoor(fi

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


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;
}




[解决办法]
可以直接return,不要赋值了
[解决办法]
引用:
Quote: 引用:

可以直接return,不要赋值了
run 是void不能返回值

return;
试试
[解决办法]
改成静态的会不会影响你的功能?
[解决办法]
方法体的局部变量被匿名内部类引用,必须为final的,这个是JAVA的规定。
不清楚你的代码上下文环境,那个result变量不能设置为成员变量么?这样可以规避这个规定,不过要考虑多线程的问题。
[解决办法]
引用:
Quote: 引用:

可以直接return,不要赋值了
run 是void不能返回值

根据需求来作灵活变换,除了以上网友回答的,还可以

另建一final型中间变量,因为目测result没有多次赋值
或者改匿名内部类为具名内部类

热点排行