Java 无法解决“局部变量需要是最终变量”
嗨,我正试图根据用户的请求从我的数据库中添加计算,但我的浮点将不起作用,除非它是最终的,我如何才能解决这个问题 代码: 这就是我得到错误v+=float d的地方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”是从内部类访问的,需要是最终的或有效的最终的可能相反谁保留了什么
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`
}