我有这段代码:
public void onPlayerInteract(PlayerInteractEvent event) {
final Action action = event.getAction();
if (action == Action.LEFT_CLICK_BLOCK){
Location l1 = event.getClickedBlock().getLocation();
} else if (action == Action.RIGHT_CLICK_BLOCK) {
Location l2 = event.getClickedBlock().getLocation();
}
Thread t = new Thread() {
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000*60*60);
//Insert code here
} catch (InterruptedException ie) {
}
}
}
};
t.start();
如何从l1
访问//insert code here
?
答案 0 :(得分:7)
只需在l1
块之外声明if
,否则它就是该块的本地。
答案 1 :(得分:3)
你不能,除非你在if块之外声明它。
使用当前代码,可以从一行访问名为l1
的变量。
如果你想在它之外使用它,不应该在if块中定义。
,如果要在线程中使用变量,则必须将变量声明为final。
答案 2 :(得分:3)
实际上你正在处理两个问题:
l1
应移到if块之外(因此l1
不会超出您想要使用它的范围。)l1
必须是最终的。内部类不会使用非final变量,因为变量必须复制到内部类实例。答案 3 :(得分:2)
我通常坚持使用最佳实践(特别是如果你要在IF块之外使用变量),就是在方法的顶部声明变量。
或者做这样的事......
Location loc;
if (action == Action.LEFT_CLICK_BLOCK){
loc = event.getClickedBlock().getLocation();
} else if (action == Action.RIGHT_CLICK_BLOCK) {
loc = event.getClickedBlock().getLocation();
}
答案 4 :(得分:1)
也许我错过了一些东西,但如果你在两种情况下使用相同的方法调用链,为什么要使用条件块呢?
我按如下方式更改您的代码:
public void onPlayerInteract(PlayerInteractEvent event) {
final Location l = event.getClickedBlock().getLocation();
Thread t = new Thread() {
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000*60*60);
//Insert code here
} catch (InterruptedException ie) {
}
}
}
};
t.start();
或者,如果有更多其他条件,您应该使用这样的位置:
public void onPlayerInteract(PlayerInteractEvent event) {
final Action action = event.getAction();
final Location l = null;
if (action == Action.LEFT_CLICK_BLOCK){
l = event.getClickedBlock().getLocation();
} else if (action == Action.RIGHT_CLICK_BLOCK) {
l = event.getClickedBlock().getLocation();
}
Thread t = new Thread() {
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000*60*60);
//Insert code here
} catch (InterruptedException ie) {
}
}
}
};
t.start();
但话又说回来......也许我错过了什么。
答案 5 :(得分:0)
您需要了解,在创建时,通常可以使用适应症。但它们通常可以设置在具有该范围的任何范围内。
所以试试这个
public void onPlayerInteract(PlayerInteractEvent event) {
final Action action = event.getAction();
Location l1; // Created at function scope
Location l2;
if (action == Action.LEFT_CLICK_BLOCK){
l1 = event.getClickedBlock().getLocation(); // l1 available here
} else if (action == Action.RIGHT_CLICK_BLOCK) {
l2 = event.getClickedBlock().getLocation(); // l1 available here
}
and l1 & l2 available here and below
.
.
.
} // l1 & l2 go out of scrope here.
你也应该认为l1&现在不需要l2,因为只有一个设置为左边或roght点击。