java报错:Variable ‘i‘ is accessed from within inner class, needs to be final or effectively final

Variable ‘i’ is accessed from within inner class, needs to be final or effectively final

class Sample{
    public static void main(String[] args) {
        final CountDownLatch count = new CountDownLatch(100);
        //java的线程池
        final ExecutorService executorService = Executors.newFixedThreadPool(100);
        for (int i = 0; i < 100; i++) {
           // int j = i;
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(i);
                }
            });
        }
    }
}

原因:内部类中使用但未声明的任何局部变量必须在内部类的正文之前明确分配。
解决办法:在for循环内,将i的值重新赋值给另外一个变量 int j = i;

class Sample{
    public static void main(String[] args) {
        final CountDownLatch count = new CountDownLatch(100);
        //java的线程池
        final ExecutorService executorService = Executors.newFixedThreadPool(100);
        for (int i = 0; i < 100; i++) {
            int j = i;
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(j);
                }
            });
        }
    }
}
  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个错误意味着你在内部类中访问了一个外部类的变量,但是该变量没有被声明为 finaleffectively finalJava 中,内部类访问外部类的变量时,这些变量必须是 finaleffectively final。一个变量被称为 effectively final,如果它在初始化后没有被修改过,即使它没有被声明为 final。 为了解决这个问题,你可以将变量声明为 finaleffectively final。如果你需要在内部类中修改该变量的值,你可以将该变量转换为一个包含在一个对象中的属性,然后将该对象声明为 final 或者 effectively final。 以下是一个示例代码: ```java public class OuterClass { public void doSomething() { int i = 0; final int j = 0; // 声明为 final class InnerClass { public void doSomething() { System.out.println(i); // 编译错误 System.out.println(j); // 可以访问 } } } } ``` ```java public class OuterClass { public void doSomething() { int i = 0; class InnerClass { public void doSomething() { final int j = 0; // 声明为 effectively final System.out.println(i); // 编译错误 System.out.println(j); // 可以访问 } } } } ``` ```java public class OuterClass { public void doSomething() { class InnerClass { private final int i; // 包含在一个对象中的属性 public InnerClass(int i) { this.i = i; } public void doSomething() { System.out.println(i); // 可以访问 } } InnerClass innerClass = new InnerClass(0); // 声明为 finaleffectively final } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值