![](/img/trans.png)
[英]JSlider and JTextField array change listener - Local variables referenced from inner class must be final or effectively final
[英]local variables referenced from an inner class must be final or effectively final
這個程序是我班級的最后一個任務,我有問題弄清楚為什么我收到錯誤“從內部類引用的局部變量必須是最終的或有效的最終版本”。 程序正在運行並發線程來對#的數組進行排序,然后找到該數組的高值和低值。 當我在沒有並發的情況下創建它時,我沒有出現此錯誤。 我在努力確定高低變量的最終位置。
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 < numbers.length; index++){
if (numbers[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 < numbers.length; index++){
System.out.print("Please enter a number between 1 and 100: ");
numbers[index] = keyboard.nextInt();
}
System.out.println();
sort.Sort(numbers);
hilo.HiLo(numbers);
//System.exit(0);
}
public void Sort(int[] numbers){
int sort = numbers[0];
Runnable r1 = () -> {
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 < numbers.length; index++){
if (numbers[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()
方法中更新high
和low
,根據定義使它們不是最終的。
因為在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: ");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.