首页 > 解决方案 > 在构造函数中创建新的 ArrayLists 实例

问题描述

全球理念:我有一个程序可以读取文本文件(编写汇编程序的地方)并解释它。现在我正在尝试使用 java 多线程来开发它,这样程序就有可能同时读取和解释不同的文本文件。

问题:我为名为“Hall_int”的类做了一个构造函数,在那里我尝试初始化所有需要的东西,因为每个新线程都必须有它自己的新变量和 ArrayList,但不幸的是,当我尝试向其中添加一些东西时,ArrayList 给了我一个 NullpointerExepction . 这是代码:

public class Hall_int extends Thread {
    public static ArrayList<String> ProgrammSpeicher;
    public static Float[]reg;
    public static Float accu;
    public static Integer pc;
    public static String line;

    Hall_int() {
        ProgrammSpeicher  = new ArrayList();
        reg = new Float[20] ;
        accu = 0.0f ;
        pc = 0 ;
        line = "";
    }
    ...

    public static void readFile(File f) throws FileNotFoundException, IOException {
        FileReader fr = new FileReader(f);
        BufferedReader br = new BufferedReader(fr);
        while((line = br.readLine()) != null) {
            ProgrammSpeicher.add(line);
        }
        br.close();
        fr.close();
    }
}

ProrammSpeicher表示 Programmemory(将存储整个程序),而 reg 用于寄存器。

标签: javamultithreadingarraylistconstructor

解决方案


你的 Arraylist 是静态的。每次调用 ProgrammSpeicher 时,都会返回 Hall_int.ProgrammSpeicher,它甚至没有初始化,即返回空值。此外,如果您希望每个线程都有自己的具有不同值的列表,最好不要将列表设为静态。列表中一个线程所做的更改将被另一个线程看到。

public class test1 {
    public static void main(String [] args){
        System.out.println(test.name);
        System.out.println(test.arr);

        test obj = new test();
        System.out.println(test.name);
        System.out.println(test.arr);

        System.out.println(obj.name);
        System.out.println(obj.arr);
    }
}

import java.util.ArrayList;

public class test {

    public static String name;
    public static ArrayList<Integer> arr;

    public test() {
        this.name="Satyam";
        this.arr= new ArrayList<>();
    }
}

运行 test1.java 时的输出

null
null
Satyam
[]
Satyam
[]

推荐阅读