2015-10-26 80 views
1

我不知道这个错误是什么或为什么发生。我在网上发现的东西与TableViews无关。但是当我的囚犯类中的这个方法被我的TableView访问时,它会抛出一个InvocationTargetException。这是我第一次使用TableView。Java InvocationTargetException当填充TableView

public int getCellBlock() { 
    for (int i = 0; i < Main.getCellBlocks().size(); i++) //for each cellblock 
     for (int j = 0; j < Main.getCellBlocks().get(i).getCells().size(); j++) //for each cell 
      for (int k = 0; k < Main.getCellBlocks().get(i).getCells().get(j).getInmates().size(); k++) 
       if (Main.getCellBlocks().get(i).getCells().get(j).getInmates().get(k).equals(this.idNum)) { 
        return i; 
       } 
    return -1; 
} 

细胞(有两个子类,但即时通讯不访问在其中数据用上述方法):

import java.io.Serializable; 
import java.util.ArrayList; 

public class Cell implements Serializable { 

private ArrayList<Integer> inmateIdNums; 
private int capacity = 0; 


Cell(int cap){ 
    capacity = cap; 
    inmateIdNums = new ArrayList<>(); 

    for (int i = 0; i < capacity; i++) 
     inmateIdNums.add(null); 

} 

public void add (int idNum){ 
    for (int i = 0; i < capacity; i++){ 
     if (inmateIdNums.get(i) == null) { 
      inmateIdNums.set(i, idNum); 
      break; 
     } 
    } 
} 

public void add (int idNum, int dur){} 

public void add (int idNum, String reason){} 

public ArrayList<Integer> getInmates(){ return inmateIdNums; } 

public int getEmptyBunks(){ 
    int emptyBunks = 0; 

    for (int i = 0; i < inmateIdNums.size(); i++){ 
     if (inmateIdNums.get(i) == null) 
      emptyBunks++; 
    } 

    return emptyBunks; 
} 
} 

监狱分区:

import java.io.Serializable; 
import java.util.ArrayList; 

public class CellBlock implements Serializable{ 

private String name; 
private String type; 
private int capacity; 
private int occupancy = 0; 
private ArrayList<Cell> cells; 

CellBlock(int cap, String nName, String nType, int cellCapacity){ 
    name = nName; 
    type = nType; 
    capacity = cap; 
    cells = new ArrayList<>(capacity); 

    if (type == "Maximum Security" || type == "Minimum Security") { 
     for (int i = 0; i < capacity; i++) 
      cells.add(new Cell(cellCapacity)); 
    } 
    else if(type == "Infirmary"){ 
     for (int i = 0; i < capacity; i++) 
      cells.add(new InfirmaryCell(cellCapacity)); 
    } 
    else if(type == "Isolation"){ 
     for (int i = 0; i < capacity; i++) 
      cells.add(new IsolationCell(cellCapacity)); 
    } 
} 

public void addInmate(int cell, int inmateIdNum){ 
    cells.get(cell-1).add(inmateIdNum); 
    occupancy++; 
} 

public void addInmate(int cell, int inmateIdNum, String reason){ 
    cells.get(cell-1).add(inmateIdNum, reason); 
    occupancy++; 
} 

public void addInmate(int cell, int inmateIdNum, int duration){ 
    cells.get(cell-1).add(inmateIdNum, duration); 
    occupancy++; 
} 

public void removeInmate(int inmateIdNum){ 
    //search for inmate and remove from list 
} 

public ArrayList<Cell> getInmates(){ return cells; } 

public boolean checkCapacity(){ 
    if (capacity > occupancy) 
     return true; 

    return false; 
} 

public ArrayList<Cell> getCells(){ return cells; } 

public ArrayList<String> getOpenCells(){ 
    ArrayList<String> openCells = new ArrayList<>(); 

    for (int i = 0; i < cells.size();i++){ 
     if (cells.get(i).getEmptyBunks() > 0) 
      openCells.add(Integer.toString(i+1)); 
    } 

    return openCells; 
} 
} 

的错误:

enter image description here

enter image description here

+0

原因是Prisoner.java第68行有一个'NullPointerException'。 (你应该在问题中指出哪一行是第68行。)这意味着你正在调用一个'null'引用的方法。既然你的代码把方法调用的长序列链接在一​​起,你可能不得不解开那些来弄清楚什么是空的。 –

+1

请不要张贴堆栈跟踪的截图,而是将堆栈跟踪文本复制并粘贴到您的问题中。 – jewelsea

+0

@jewelsea我打算这样做,但是这么长(比图像中的东西还要长),我无法用任何方式来格式化所有那些容易在眼睛上看到的东西。 – Alyssa

回答

0

我不确定它是做了什么,但我自己解决了这个问题。循环很好。

问题是两件事之一 - 比较,或我已写信息的文件(我正在使用二进制文件和ObjectInputStream/ObjectOutputStream)。

在单元构造我:

for (int i = 0; i < capacity; i++) 
     inmateIdNums.add(null); 

,并避免比较Integernull我把它改为:

for (int i = 0; i < capacity; i++) 
     inmateIdNums.add(0); 

这并没有解决我的问题。所以我只能假设某人在写这篇蹩脚的比较的过程中写了一个文件出了问题。作为最后的努力,我删除了我一直在使用的文件并全新运行我的程序以创建新文件并添加新条目。

问题解决。