Java 为什么我会得到;从内部类引用的局部变量必须是final";?

Java 为什么我会得到;从内部类引用的局部变量必须是final";?,java,javafx,Java,Javafx,我甚至不确定这段代码即使有效也能做些什么,但我不知道如何消除“从内部类引用的局部变量必须是最终的或有效的最终的”错误消息,它显示在以“fireballRight[I]”开头的三行上 Sprite[]fireballRight=新Sprite[50]; 公共权利{ 对于(int i=0;i

我甚至不确定这段代码即使有效也能做些什么,但我不知道如何消除“从内部类引用的局部变量必须是最终的或有效的最终的”错误消息,它显示在以“fireballRight[I]”开头的三行上

Sprite[]fireballRight=新Sprite[50];
公共权利{
对于(int i=0;i<50;i++){
新的AnimationTimer(){
公共无效句柄(){
fireballRight[i].setImage(“puercosloco/fireballRight.png”);
rightx++;
fireballRight[i]。设置位置(rightx,righty);
fireballRight[i].渲染(gc,80,55);
}
}.start();
}   
}

任何指导都将不胜感激,谷歌似乎没有在这方面帮助我

您可以执行字段private和static。

您可以执行字段private和static。

正如它所说,var
i
需要有
final
前缀。将代码更改为如下内容:-

    for(int i = 0; i < 50; i++) {
        final int i2 = i;
        new AnimationTimer()
        {
            public void handle()
            {      
                fireballRight[i2].setImage("puercosloco/fireballright.png"); // Use i2 instead of i.
for(int i=0;i<50;i++){
最终int i2=i;
新的AnimationTimer()
{
公共无效句柄()
{      
fireballRight[i2].setImage(“puercosloco/fireballRight.png”);//使用i2代替i。

正如它所说,var
i
需要有
final
前缀。将代码更改为如下内容:-

    for(int i = 0; i < 50; i++) {
        final int i2 = i;
        new AnimationTimer()
        {
            public void handle()
            {      
                fireballRight[i2].setImage("puercosloco/fireballright.png"); // Use i2 instead of i.
for(int i=0;i<50;i++){
最终int i2=i;
新的AnimationTimer()
{
公共无效句柄()
{      
fireballRight[i2].setImage(“puercosloco/fireballRight.png”);//使用i2代替i。

您尚未显示所有代码,但我怀疑添加:

final int i0 = i;
在循环内部,使用
i0
而不是
i
作为数组的索引,应该可以修复错误

或者,正如@James_D所评论的,您还可以在匿名类之前添加
Sprite-Sprite=fireballRight[i];
,并在
句柄中使用
Sprite


请注意,
final
修饰符在本例中对于Java 8+是可选的。

您尚未显示所有代码,但我怀疑添加:

final int i0 = i;
在循环内部,使用
i0
而不是
i
作为数组的索引,应该可以修复错误

或者,正如@James_D所评论的,您还可以在匿名类之前添加
Sprite-Sprite=fireballRight[i];
,并在
句柄中使用
Sprite


请注意,
final
修饰符在Java 8+中是可选的。

哪里声明了
rightx
呢?循环变量
i
不是final。将它复制到另一个变量。哪里声明了
rightx
呢?循环变量
i
不是final。将它复制到另一个变量。A)
静态
很少是t他给出了正确的解决方案。B)它不会解决眼前的问题。A)
static
很少是正确的解决方案。B)它不会解决眼前的问题。或者
final-Sprite-Sprite=fireballRight[i];
相反,这对我来说更自然一些……或者
final-Sprite-Sprite-Sprite=fireballRight[i]相反,这让我感觉更自然一点……原来是
i
,原来是
i