Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法解决“局部变量需要是最终变量”_Java_Android_Variables - Fatal编程技术网

Java 无法解决“局部变量需要是最终变量”

Java 无法解决“局部变量需要是最终变量”,java,android,variables,Java,Android,Variables,嗨,我正试图根据用户的请求从我的数据库中添加计算,但我的浮点将不起作用,除非它是最终的,我如何才能解决这个问题 代码: 这就是我得到错误v+=float d的地方 变量“v”是从内部类访问的,需要是最终的或有效的最终的可能相反谁保留了什么 StringBuilder upcoming = new StringBuilder("Upcoming\n\n"); StringBuilder Results = new StringBuilder("Upcoming\n\n"); CompoundBu

嗨,我正试图根据用户的请求从我的数据库中添加计算,但我的浮点将不起作用,除非它是最终的,我如何才能解决这个问题

代码:

这就是我得到错误v+=float d的地方


变量“v”是从内部类访问的,需要是最终的或有效的最终的

可能相反谁保留了什么

StringBuilder upcoming = new StringBuilder("Upcoming\n\n");
StringBuilder Results = new StringBuilder("Upcoming\n\n");

CompoundButton.OnCheckedChangeListener lister = new CompoundButton.OnCheckedChangeListener() {

    float v = 0.0;
    public float getV() { return v; }

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if(!isChecked)
        {
            for(FAssessment a : assessmentList) {
                if(!a.getType().equals("Final"))
                {
                    double d = CalculatePercentage(a.getTotal(),a.getAchieved(),Double.parseDouble(a.getWeight()));
                    v += (float) d;
                }                        
            }
        }
        else
        {
            for(FAssessment a : assessmentList) {
                double d = CalculatePercentage(a.getTotal(),a.getAchieved(),Double.parseDouble(a.getWeight()));
                v += (float) d;
            }
        }
    }
};
switchExam.setOnCheckedChangeListener(lister);
然后,当封闭程序需要知道v是什么时,它可以调用

lister.getV();
注意:除了将0转换为浮点数,您还可以说:

float v = 0f;

据我所知,您希望稍后再次使用这个变量v。如果是这样,您可以获取所需的代码并将其放入方法中。这样,您就可以在侦听器中声明变量,这将为它提供它要查找的最后一个变量

像这样:

switchExam.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            StringBuilder upcoming = new StringBuilder("Upcoming\n\n");
            StringBuilder Results = new StringBuilder("Results\n\n");
            float v= 0;
            if(!isChecked)
            {

                for(FAssessment a : assessmentList) {
                    if(!a.getType().equals("Final"))
                    {
                        double d = CalculatePercentage(a.getTotal(),a.getAchieved(),Double.parseDouble(a.getWeight()));
                        v += (float) d;
                    }

                    upcoming.append(a.getDesc()+" "+a.getDate()+"\n");
                    Results.append(a.getDesc()+" "+format.format(((a.getAchieved()/a.getTotal())*100))+"%\n");
                }                    
                SetInit(v,upcoming,Results);
            }
            else
            {
                for(FAssessment a : assessmentList) {
                    double d = CalculatePercentage(a.getTotal(),a.getAchieved(),Double.parseDouble(a.getWeight()));
                    v += (float) d;
                    upcoming.append(a.getDesc()+" "+a.getDate()+"\n");
                    Results.append(a.getDesc()+" "+format.format(((a.getAchieved()/a.getTotal())*100))+"%\n");
                }
                SetInit(v,upcoming,Results);

            }
        }
    });
    switchExam.setChecked(true);
然后,在您的方法中,您将粘贴希望对变量v执行的操作:


希望这有帮助

您正在创建一个匿名类,用作OnCheckedChangeListener。这个事件con将来会发生在switchExam对象上,在当前函数完成之后,我指的是float v的作用域,那么新值将存储在哪里?由于该变量将不再可用,因此存储对它的引用是没有意义的。看,谢谢你,给了我一个深刻的理解:原因:如果两个方法看到相同的局部变量,Java希望你发誓你不会改变它-用Java语言来说,final。再加上没有按引用参数,这条规则确保了局部变量只被分配到它们所属的方法中…非常感谢您的输入,我尝试过,但没有效果非常感谢您,这很有帮助!
switchExam.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            StringBuilder upcoming = new StringBuilder("Upcoming\n\n");
            StringBuilder Results = new StringBuilder("Results\n\n");
            float v= 0;
            if(!isChecked)
            {

                for(FAssessment a : assessmentList) {
                    if(!a.getType().equals("Final"))
                    {
                        double d = CalculatePercentage(a.getTotal(),a.getAchieved(),Double.parseDouble(a.getWeight()));
                        v += (float) d;
                    }

                    upcoming.append(a.getDesc()+" "+a.getDate()+"\n");
                    Results.append(a.getDesc()+" "+format.format(((a.getAchieved()/a.getTotal())*100))+"%\n");
                }                    
                SetInit(v,upcoming,Results);
            }
            else
            {
                for(FAssessment a : assessmentList) {
                    double d = CalculatePercentage(a.getTotal(),a.getAchieved(),Double.parseDouble(a.getWeight()));
                    v += (float) d;
                    upcoming.append(a.getDesc()+" "+a.getDate()+"\n");
                    Results.append(a.getDesc()+" "+format.format(((a.getAchieved()/a.getTotal())*100))+"%\n");
                }
                SetInit(v,upcoming,Results);

            }
        }
    });
    switchExam.setChecked(true);
private void SetInit(float v, StringBuilder coming, StringBuilder results) {
    txtUpcoming.setText(coming);
    txtResults.setText(results);
    //And whatever you want to do with `v`
 }