从内部类引用的局部变量必须是最终的或有效的最终

这个程序是我class级的最后一个任务,我有问题弄清楚为什么我收到错误“从内部类引用的局部变量必须是最终的或有效的最终版本”。 程序正在运行并发线程来对#的数组进行排序,然后找到该数组的高值和低值。 当我在没有并发的情况下创建它时,我没有出现此错误。 我在努力确定高低变量的最终位置。

public void HiLo(int[] numbers){ int high = numbers[0]; int low = numbers[0]; Runnable r2 = new Runnable(){ @Override public void run() { System.out.println("The highest value is: "); for (int index = 1; index  high) high = numbers[index]; System.out.println(high); } System.out.println(); System.out.println("The lowest value is: "); for (int ind = 1; ind < numbers.length; ind++){ if (numbers[ind] < low) low = numbers[ind]; System.out.println(low); } } }; pool.execute(r2); } 

这是产生错误的代码块。 如果我做int high = numbers [0]; 或int low = numbers [0]; 最后,我得到一个错误,我不能使该值最终,相反的变量的错误消失。

这是该计划的其余部分。 任何帮助表示赞赏。

 package concurrentthread; import java.util.Arrays; import java.util.Scanner; import java.util.concurrent.Executor; import java.util.concurrent.Executors; public class ConcurrentThread { static Executor pool = Executors.newFixedThreadPool(2); public static void main(String[] args) { int size; Scanner keyboard = new Scanner(System.in); ConcurrentThread sort = new ConcurrentThread(); ConcurrentThread hilo = new ConcurrentThread(); System.out.println("This program will calculate the highest and lowest " + "numbers entered by the user \nand also sort them in " + "ascending order"); System.out.println(); System.out.print("How many numbers would you like in the array? "); size = keyboard.nextInt(); final int[] numbers = new int[size]; for (int index = 0; index  { Arrays.sort(numbers); System.out.println("The sorted values are: "); for (int index = 0; index < numbers.length; index++) System.out.print(numbers[index] + " "); System.out.println(); }; pool.execute(r1); } public void HiLo(int[] numbers){ final int high = numbers[0]; int low = numbers[0]; Runnable r2 = new Runnable(){ @Override public void run() { System.out.println("The highest value is: "); for (int index = 1; index  high) high = numbers[index]; System.out.println(high); } System.out.println(); System.out.println("The lowest value is: "); for (int ind = 1; ind < numbers.length; ind++){ if (numbers[ind] < low) low = numbers[ind]; System.out.println(low); } } }; pool.execute(r2); } 

}

你继续在run()方法中更新highlow ,根据定义使它们不是最终的。

既然你在run()方法之外不需要它们,只需将两条线移到里面。

 public void HiLo(int[] numbers){ Runnable r2 = new Runnable(){ @Override public void run() { int high = numbers[0]; int low = numbers[0]; System.out.println("The highest value is: ");