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
相关产品推荐
相关产品推荐

