You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java装配线模拟中processLinhaDeProducao方法空指针异常求助

装配线模拟程序空指针异常解决

我正在开发装配线模拟程序,其中public void processLinhaDeProducao(int tempo)方法用于模拟指定时长内的零件生产,但从主类调用该方法时,程序抛出异常:Cannot invoke "java.util.List.iterator()" because "this.postos" is null。相关代码如下:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * A class linhaDeProducao representa a linha que interliga os postos de trabalho e as transpoortadoras
 */
public class LinhaDeProducao {
    private List<Transportadoras> transportadoras;
    private List<Postos> postos;
    private String descriLinha;
    private int simulDuracao;

    private int peças = 0;

    public LinhaDeProducao()
    {
        transportadoras = new ArrayList<>();
        postos          = new ArrayList<>();

    }

    public LinhaDeProducao(String linha, int tempoSimulacao)
    {
        this.descriLinha = linha;
        this.simulDuracao = tempoSimulacao;
    }

    /**
     * adiciona transportadora à linha de peodução.
     *
     * @param transporatdoras
     */
    public void addTransportadora(Transportadoras transporatdoras) {
        transportadoras.add(transporatdoras);
    }

    /**
     * Adiciona postos à linha de produção
     *
     * @param postos
     */
    public void addPosto(Postos postos) {
        this.postos.add(postos);
    }

    /**
     *
     * simula a produção na linha de acordo com a descrição fornecida e o tempo de duração
     *
     * @return numero de peças produzidas
     */
    public int simularLinhaDeProducao() {
        String linhas[] = descriLinha.split("\n");
        //int pecasProduzidas = 0;

        Map<String, Integer> contaTransp = new HashMap<>();
        Map<String , Integer> contaPostos = new HashMap<>();

        int peçasProduzidasPorTransPor, peçasProduzidasHr, peçasProduzidasPosto;
        String outputTranspotID,postoID, inputTransID;

        for (String line : linhas) {
            String[] componentes = line.split(" ");
            String   categoriaPosto = componentes[0];

            if (categoriaPosto.equals("PI")) {
                 postoID = componentes[1];
                 inputTransID = componentes[2];
                 outputTranspotID = componentes[3];
                int tempoDeProcessamento = Integer.parseInt(componentes[4]);

                peçasProduzidasHr = simulDuracao / tempoDeProcessamento;
                peçasProduzidasPosto = peçasProduzidasHr;
                contaPostos.put(postoID, peçasProduzidasPosto);

                 peçasProduzidasPorTransPor = peçasProduzidasPosto;
                if (contaTransp.containsKey(outputTranspotID)) {
                    peçasProduzidasPorTransPor += contaTransp.get(outputTranspotID);
                }
                contaTransp.put(outputTranspotID, peçasProduzidasPorTransPor);
            }
            else if (categoriaPosto.equals("PII")) {
                postoID          = componentes[1];
                inputTransID     = componentes[2];
                outputTranspotID = componentes[3];
                int minT = Integer.parseInt(componentes[4]);
                int maxT = Integer.parseInt(componentes[5]);

                peçasProduzidasHr = simulDuracao / minT;
                peçasProduzidasPosto = peçasProduzidasHr * (maxT - minT + 1) / 2;
                contaPostos.put(postoID, peçasProduzidasPosto);

                peçasProduzidasPorTransPor = peçasProduzidasPosto;
                if (contaTransp.containsKey(outputTranspotID)) {
                    peçasProduzidasPorTransPor += contaTransp.get(outputTranspotID);
                }
                contaTransp.put(outputTranspotID, peçasProduzidasPorTransPor);
            }
        }

        peças = contaTransp.getOrDefault("OUT", 0);

        return getPeças();
    }

    /**
     * Processes the assembly line for the specified processing time.
     *
     * @param tempo the processing time in minutes
     */
    public void processLinhaDeProducao(int tempo) {
        long startTime = System.currentTimeMillis();
        long endTime = startTime + (tempo * 60 * 1000);


        while (System.currentTimeMillis() < endTime) {
            for (Postos postos : postos) {
                if (postos.getEstado() == Estado.ESPERA) {
                    postos.processamento();
                    Transportadoras outputTransporatdoras = findTransByID(postos.getOutPut());
                    if (outputTransporatdoras != null && outputTransporatdoras.temCapacidade()) {
                        outputTransporatdoras.addPeça(postos.getID());
                        postos.setEstado(Estado.OCUPADO);
                    } else {
                        postos.setEstado(Estado.PARADO);
                    }
                } else if (postos.getEstado() == Estado.MANUTENÇÃO) {
                    postos.setEstado(Estado.ESPERA);
                }
            }
        }
    }

    /**
     * Returns the number of products.
     *
     * @return the number of products
     */
    public int getPeças() {
        return peças == 66 ? 62 : peças;
    }

    /**
     * Sets the number of products.
     *
     * @param peça the number of products to be set
     */
    public void setPeças(int peça) {
        this.peças = peça;
    }


    /**
     * Finds a conveyor in the assembly line by its identifier.
     *
     * @param id the identifier of the conveyor
     * @return the found conveyor, or null if not found
     */
    private Transportadoras findTransByID(String id) {
        for (Transportadoras transporatdoras : transportadoras) {
            if (transporatdoras.getID().equals(id)) {
                return transporatdoras;
            }
        }
        return null;
    }
}

受影响方法:

/**
 * Processes the assembly line for the specified processing time.
 *
 * @param tempo the processing time in minutes
 */
public void processLinhaDeProducao(int tempo) {
    long startTime = System.currentTimeMillis();
    long endTime = startTime + (tempo * 60 * 1000);


    while (System.currentTimeMillis() < endTime) {
        for (Postos postos : postos) {
            if (postos.getEstado() == Estado.ESPERA) {
                postos.processamento();
                Transportadoras outputTransporatdoras = findTransByID(postos.getOutPut());
                if (outputTransporatdoras != null && outputTransporatdoras.temCapacidade()) {
                    outputTransporatdoras.addPeça(postos.getID());
                    postos.setEstado(Estado.OCUPADO);
                } else {
                    postos.setEstado(Estado.PARADO);
                }
            } else if (postos.getEstado() == Estado.MANUTENÇÃO) {
                postos.setEstado(Estado.ESPERA);
            }
        }
    }
}

异常原因分析

  • 成员变量未初始化:类的带参构造函数LinhaDeProducao(String linha, int tempoSimulacao)仅赋值了descriLinha和simulDuracao,没有初始化postos和transportadoras这两个List成员,导致它们为null。当processLinhaDeProducao方法尝试遍历postos时,就会触发空指针异常。
  • 变量名冲突:processLinhaDeProducao方法中的增强for循环使用了for (Postos postos : postos),循环变量名和类成员变量名重复,虽然不是直接引发NPE的原因,但会降低代码可读性,容易引发其他逻辑错误。

修复方案

1. 修正带参构造函数

调用无参构造函数复用初始化逻辑,避免重复代码:

public LinhaDeProducao(String linha, int tempoSimulacao) {
    this(); // 调用无参构造函数初始化transportadoras和postos
    this.descriLinha = linha;
    this.simulDuracao = tempoSimulacao;
}

2. 修正循环变量名

将循环变量改为与成员变量不冲突的名称,比如posto:

public void processLinhaDeProducao(int tempo) {
    long startTime = System.currentTimeMillis();
    long endTime = startTime + (tempo * 60 * 1000);

    while (System.currentTimeMillis() < endTime) {
        // 修正循环变量名,避免和成员变量postos冲突
        for (Postos posto : postos) {
            if (posto.getEstado() == Estado.ESPERA) {
                posto.processamento();
                Transportadoras outputTransporatdoras = findTransByID(posto.getOutPut());
                if (outputTransporatdoras != null && outputTransporatdoras.temCapacidade()) {
                    outputTransporatdoras.addPeça(posto.getID());
                    posto.setEstado(Estado.OCUPADO);
                } else {
                    posto.setEstado(Estado.PARADO);
                }
            } else if (posto.getEstado() == Estado.MANUTENÇÃO) {
                posto.setEstado(Estado.ESPERA);
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者lg Jr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:54:58