【问题标题】:Creating new ArrayLists Instances in a Constructor在构造函数中创建新的 ArrayLists 实例
【发布时间】:2018-11-25 20:57:19
【问题描述】:

全球理念:我有一个程序可以读取文本文件(编写汇编程序的地方)并解释它。现在我正在尝试使用 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 用于寄存器。

【问题讨论】:

  • 调用类的静态方法时,不会调用类构造函数。由于静态字段仅在构造函数中初始化(这显示出严重的设计错误),因此在调用静态方法时它不会被初始化。您需要了解静态变量(以及命名约定)。使用线程,这很难正确地做到,对你来说太早了。
  • 谢谢@JBNizet 我会考虑这些点:)
  • 删除所有内容,即静态的。每个线程都需要自己的变量。你需要用 new Hall_int().start() 启动一个线程,这样你的静态尝试就不起作用了。

标签: java multithreading arraylist constructor


【解决方案1】:

您的 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
[]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多