当前位置: 首页 > 知识库问答 >
问题:

变量是从内部类中访问的,需要声明为final[重复]

松旻
2023-03-14

我已经签出了答案,比如变量是在内部类中访问的。需要被宣布为最终,但它没有解决我想要的。

我正在使用GraphView绘制从Google Firebase检索到的数据。数据应该是如下所示的连续线:

但当我运行程序时,它却是这样进行的:

public class RetrieveApp extends AppCompatActivity {

Integer hrValue;
ArrayList<Integer> array2; //array to contain hrValue
private ListView mListView;
LineGraphSeries<DataPoint> series ;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_retrieve_app);

    GraphView graph = (GraphView)findViewById(R.id.graph);
    series = new LineGraphSeries<DataPoint>();

    DatabaseReference userdatabase = FirebaseDatabase.getInstance().getReference().child("Users");
    auth = FirebaseAuth.getInstance();
    user = auth.getCurrentUser();

    DatabaseReference ref = userdatabase.child(user.getUid());

    array2 = new ArrayList<>(); //array untuk hr



    //RETRIEVE DATA HR VALUE 
    ref.child("hrvalue").child("nilaihr").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            hrValue = dataSnapshot.child("tmpHR").getValue(Integer.class);
            showData(dataSnapshot);
            double y,x ;
            x = 0.0;
GraphView graph = (GraphView)findViewById(R.id.graph);
        series = new LineGraphSeries<DataPoint>();
            for (int i=0; i<1000; i++){
                x = x+i;
                y = hrValue;
                series.appendData(new DataPoint(x, y), true, 1000);
            }
            graph.addSeries(series);
        }
GraphView graph = (GraphView)findViewById(R.id.graph);
        series = new LineGraphSeries<DataPoint>();

我应该做些什么来解决这个问题?任何形式的帮助都将不胜感激。谢谢!

共有1个答案

管景天
2023-03-14

基本上,您需要执行错误消息暗示您应该执行的操作。将graph声明为final。像这样:

protected void onCreate(Bundle savedInstanceState) {

    ...

    final GraphView graph = (GraphView)findViewById(R.id.graph);

    ...

    ref.child("hrvalue").child("nilaihr").addChildEventListener(
        new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                ...

                graph.addSeries(series);
            }
        });
     ...

规则(在Java8之前)是,如果变量声明为final,则内部类只能使用在封闭作用域中声明的局部变量(如graphis...)。

在Java8中,他们放宽了这一规则。现在,变量只需要在捕获时有效地为final。(如果使用与Java8兼容的编译器编译,您的代码将是有效的。)

 类似资料:
  • 我正在尝试创建一个布局为“是”或“否”的警报对话框。我想通过单击“否”按钮而不是对话框视图来关闭该对话框。Disclose() 有错误。 这是我的密码。

  • 我得到了一个问题,对内部类的局部变量访问需要声明为final。从方法createGrids()->“”中,i是一个需要声明为final的局部变量。我不知道为什么,我在字段中添加了final,但它并不起作用。 //略

  • 我知道这个话题听起来像是重复的,但我并不是想在这里调试这个问题,而是想绕过它。 我的程序应该做的是:对于文件夹中的每个文件,创建一个新按钮。如果您单击此按钮,请输入您刚输入的文件夹的名称。 现在我遇到的问题是,“fileName”变量需要放在final中,因为Java提供的是对象的指针,而不是值本身。但如果我这样做,则只会为任何按钮发送最后选择的文件名。

  • 我的代码有上述错误。我尝试通过将我的btnsav声明为最终版本来修复此问题,但随后我收到另外两个错误: 未知类:“btnsave” 不是一个声明 你知道我如何修复这个错误吗?

  • 我正在尝试让一个按钮将其值与其他变量进行比较。在onClick方法中,我收到一个错误,说变量在内部类中被访问,需要声明为最终变量。问题是变量应该被更改,所以我无法使其成为最终变量。我如何解决这个问题?这是我的代码:

  • 问题内容: 尝试在内部类内部使用一个类的本地成员时遇到此错误。我知道将其声明为final将解决此问题,但我读到Java 8应该自动处理它,因为我将Intellij与Java 8一起使用,但它仍然无法编译。还有其他方法可以在不将其声明为final的情况下进行修复吗?谢谢。 问题答案: 我知道将其声明为final将解决此问题,但我读到Java 8应该自动处理它。 如果变量 有效地为final ,则Ja