Java 避免JTable导出到Excel文件时出现NullPointerException

Java 避免JTable导出到Excel文件时出现NullPointerException,java,nullpointerexception,jtable,apache-poi,Java,Nullpointerexception,Jtable,Apache Poi,我有一个没有值的JTable(空列数据)。像这样, |column 1|column 2|column 3|column 4| ------------------------------------- |Java |C# | |Ruby | ------------------------------------- |Java | |PHP |Ruby | 我正在尝试将此JTable导出到Excel文件。当我按下按钮导出它

我有一个没有值的JTable(空列数据)。像这样,

|column 1|column 2|column 3|column 4|
-------------------------------------
|Java    |C#      |        |Ruby    |
-------------------------------------
|Java    |        |PHP     |Ruby    |
我正在尝试将此JTable导出到Excel文件。当我按下按钮导出它时,它会给出NullPointerException。因为这个空值。所以我需要忽略它并继续导出Excel文件

这是我使用的代码

        XSSFWorkbook xb = new XSSFWorkbook();
        XSSFSheet xs = xb.createSheet();

        //Load data to TreeMap
        TreeMap<String,Object[]> data = new TreeMap<>();

        //Add Rows and Cells
        data.put("-1", new Object[]{pageTable.getColumnName(0), pageTable.getColumnName(1), pageTable.getColumnName(2), pageTable.getColumnName(3), pageTable.getColumnName(4), pageTable.getColumnName(5), pageTable.getColumnName(6)});

        for(int i = 0; i<pageTable.getRowCount(); i++)
        {
            data.put(Integer.toString(i), new Object[]{getCellValue(i, 0), getCellValue(i, 1), getCellValue(i, 2), getCellValue(i, 3), getCellValue(i, 4), getCellValue(i, 5), getCellValue(i, 6)});
        }

        //Write data to Excel
        Set<String> ids = data.keySet();
        XSSFRow row;
        int rowID = 0;

        for(String key: ids)
        {
            row = xs.createRow(rowID++);

            //Get data as per Key
            Object[] values = data.get(key);

            int cellID = 0;
            for(Object o: values)
            {
                Cell cell = row.createCell(cellID++);
                cell.setCellValue(o.toString());
            }
        }
它给出了这一排是原因

data.put(Integer.toString(i), new Object[]{getCellValue(i, 0), getCellValue(i, 1), getCellValue(i, 2), getCellValue(i, 3), getCellValue(i, 4), getCellValue(i, 5), getCellValue(i, 6)});
那我该怎么修呢?有没有办法避免这种情况


提前谢谢你的帮助!致以最诚挚的问候。

正如您所说的,有些值可以为null,因此在这个for循环中

for(Object o: values)
{
    Cell cell = row.createCell(cellID++);
    cell.setCellValue(o.toString());
}
o、 toString()必须导致NullPointerException

只需将for循环中的第二行从

cell.setCellValue(o.toString());

这应该可以避免NPException,您的代码应该可以正常工作

让我知道这是否工作良好,否则将帮助你进一步

编辑1:

只要再读一遍,就会发现你怀疑你的NPE在这种方法中

private String getCellValue(int x, int y)
{
    return pageTable.getValueAt(x, y).toString();
}
如果这个return语句导致了这种情况,那么在没有检查getValueAt中的null值的情况下不要调用toString方法,并将您的方法更改为this

private String getCellValue(int x, int y)
{
    if( pageTable.getValueAt(x, y) == null) {
        return "";
    } else {
        pageTable.getValueAt(x, y).toString();
    }
}

需要知道getCellValue方法在做什么。@aglassman我真的很抱歉。我忘了加那个。我试过这个,但它总是出错。你能帮我避免这个吗?是的,我刚刚编辑了我的答案以避免getCellValue方法中的另一个NullPointerException。尝试一下,它应该会起作用。如果仍然没有,请更新您的帖子并添加异常堆栈跟踪,以显示它正在NPEPleased中运行的行和方法,以了解它的帮助:)
private String getCellValue(int x, int y)
{
    return pageTable.getValueAt(x, y).toString();
}
private String getCellValue(int x, int y)
{
    if( pageTable.getValueAt(x, y) == null) {
        return "";
    } else {
        pageTable.getValueAt(x, y).toString();
    }
}