2011-09-22 84 views
0

这是我第一次用Java编程,所以我不明白为什么我不能访问函数外部的变量。我试图改变变量决赛,但还是有一个错误:如何访问Java内部类中的非最终变量号?

The final local variable number cannot be assigned, since it is defined in an enclosing type

当有在变量没有final关键字,错误是这样的:

Cannot refer to a non-final variable number inside an inner class defined in a different method

这里是我的代码:

 String[] number = this.nextNumber(); 
     Button submitbutton = (Button)findViewById(R.id.button1); 
     submitbutton.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        // Perform action on clicks 
        //Toast.makeText(Addition.this, inp.getText(), Toast.LENGTH_SHORT).show(); 
        if(inp.getText().toString().equals("")) { 
         Toast.makeText(Addition.this, "Please enter your answer", Toast.LENGTH_SHORT).show(); 
        } else { 
         int answer = Integer.parseInt(inp.getText().toString()); 
         if(Integer.parseInt(number[1]) == answer) { 
          Toast.makeText(Addition.this, "NICE!", Toast.LENGTH_SHORT).show(); 
          int currentPoint = Integer.parseInt((String) points.getText()); 
          currentPoint = currentPoint + 1; 
          points.setText(Integer.toString(currentPoint)); 
          number = Addition.this.nextNumber(); // this part doesn't work. why? 
         } else { 
          Toast.makeText(Addition.this, "Wrong!", Toast.LENGTH_SHORT).show(); 
         } 
        } 
       } 
      }); 

我对不起作用的部分发表评论。请告诉我为什么

回答

5

好吧,你来面对这两个规则是完全一样的编译器状态:

  • 的最后一个变量,必须精确地分配一次 - 你以后不能更改它的值
  • 您可以访问从,如果他们最后一个匿名内部类局部变量

目前尚不清楚你想要做什么或为什么你正在尝试从你的OnClickListener中改变局部变量的值。这里的大图是什么?你能否在匿名内部类中声明一个变量,或者在类中将它变为一个实例变量?

如果你是新来的Java我会强烈劝你写简单的代码开始。匿名内部类相对先进。

我实际上鼓励你在开始Android开发之前在桌面上使用Java作为语言 - 在简单的控制台应用程序中使用核心库(集合,IO等)以及任何有趣的语言位这将很容易启动和调试,没有任何Android特定的复杂情况来阻碍你。

+0

我想要一个按钮被点击时重置的数量。有没有其他方式来改变我的按钮被点击时变量的值? –

+0

@Kevin:但是,这是一个*本地*变量。你认为改变它会有什么影响? –

0

编辑:由于乔恩说,使用监听器来修改局部变量是没有用的,当听者为其分配一个值的局部变量就会超出范围,并没有通过任何其他方式到达。我在下面写的只有在number有这种方法之外的生命时才有意义。

匿名内部类中,你只能访问包含范围内的final变量。但是你不能将分配给最终变量。常用的技巧是在非最终变量周围使用最终的包装。例如,如果numberString,不是数组(String[]),那么下面的工作:

final String[] number = new String[] { this.nextNumber(); } 
      // number[0] has the number, number itself is final wrapper 
    Button submitbutton = (Button)findViewById(R.id.button1); 
    submitbutton.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      // Perform action on clicks 
      //Toast.makeText(Addition.this, inp.getText(), Toast.LENGTH_SHORT).show(); 
      if(inp.getText().toString().equals("")) { 
       Toast.makeText(Addition.this, "Please enter your answer",    
           Toast.LENGTH_SHORT).show(); 
      } else { 
       int answer = Integer.parseInt(inp.getText().toString()); 
       if(Integer.parseInt(number[1]) == answer) { 
        Toast.makeText(Addition.this, "NICE!", Toast.LENGTH_SHORT).show(); 
        int currentPoint = Integer.parseInt((String) points.getText()); 
        currentPoint = currentPoint + 1; 
        points.setText(Integer.toString(currentPoint)); 
        number[0] = Addition.this.nextNumber(); 
        // number is final and cannot be assigned but number[0] can 
       } else { 
        Toast.makeText(Addition.this, "Wrong!", Toast.LENGTH_SHORT).show(); 
       } 
      } 
      } 
     });