如何访问if-block中声明的变量?

时间:2012-05-25 22:12:40

标签: java variables

我有这段代码:

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

6 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

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

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

,如果要在线程中使用变量,则必须将变量声明为final。

答案 2 :(得分:3)

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

  1. 变量l1应移到if块之外(因此l1不会超出您想要使用它的范围。)
  2. 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点击。