0

我有这个代码:

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

4

6 回答 6

7

只需在块l1之外声明if,否则它是该块的本地。

于 2012-05-25T22:15:08.690 回答
3

你不能,除非你在你的 if 块之外声明它。

使用您当前的代码,命名的变量l1可以从一行中访问。

如果您想在 if 块之外使用它,则不应在 if 块中定义它。

此外,如果您想在线程中使用它,您必须将变量声明为 final。

于 2012-05-25T22:15:26.603 回答
3

您实际上正在处理两个问题:

  1. 该变量l1应移到 if 块之外(因此l1在您要使用它的时候不会超出范围)。
  2. l1必须是最终的。内部类不会使用非最终变量,因为必须将变量复制到内部类实例。
于 2012-05-25T22:17:54.963 回答
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();
}
于 2012-05-25T22:16:39.087 回答
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();

或者,如果有更多 else-if 条件,您应该像这样使用 Location:

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();

但话又说回来......也许我错过了一些东西。

于 2012-05-25T22:22:29.360 回答
0

您需要了解变量通常在创建的 cope 中可用。但它们通常可以设置在具有该范围的任何范围内。

所以试试这个

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,因为在左键或右击时只有一个被设置。

于 2012-05-25T22:19:24.273 回答