Почему я получаю это NullPointerException с getCellType (), если getCellType () содержится в проверке на ноль? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть отличный скрипт, который предназначен для экспорта таблицы Excel в файл уценки.У меня возникла проблема, когда getCellType () выбрасывает исключение нулевого указателя.

Я пытался проверить ячейку, чтобы определить, является ли она пустой в двух местах - как перед передачей ячейки в метод, в котором вызывается getCellType (), так и внутри самого метода.Я пересматривал свою логику снова и снова, и я не могу найти то, что мне не хватает.

Я проверил его, чтобы убедиться, что функционал работает до точки, где найдена нулевая ячейка, и, кажется, работает нормально.Он циклически перебирает таблицу, как я хочу, но затем выдает исключение нулевого указателя в конце.

Примечание: первый цикл for печатает первый столбец, а затем второй цикл for, который печатает все остальныестолбцы под ним, в случае, если цель этого была неясна.

    #!/usr/bin/env groovy

    @Grab(group = 'org.apache.poi', module = 'poi', version = '4.1.0')
    @Grab(group = 'org.apache.poi', module = 'poi-ooxml', version = '4.1.0')

    import org.apache.poi.xssf.usermodel.XSSFWorkbook
    import org.apache.poi.xssf.usermodel.*
    import org.apache.poi.ss.usermodel.*

    Workbook wb = new XSSFWorkbook(new File(this.args[0]))

    DataFormatter formatter = new DataFormatter()
    FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator()

    PrintStream out = new PrintStream(new FileOutputStream(this.args[1]), true, "UTF-8")

    Sheet sheet = wb.getSheetAt(0)
    int lastRow = sheet.getLastRowNum()

    static private void handleCell(Cell cell, FormulaEvaluator evaluator, DataFormatter formatter, PrintStream out){

        if(cell != null){
            CellValue cellValue = evaluator.evaluate(cell);

            switch (cellValue.getCellType()) {
                case CellType.BOOLEAN:
                    out.print("Cell: " + cellValue.getBooleanValue() + " Type: Boolean")
                    break;
                case CellType.NUMERIC:
                    out.print("Cell: " + cellValue.getNumberValue() + " Type: Numeric")
                    break;
                case CellType.STRING:
                    out.print("Cell: " + cellValue.getStringValue() + " Type: String")
                    break;
                case CellType.BLANK:
                    out.print("Cell: BLANK Type: Blank")
                    break;
                case CellType.ERROR:

                    break;

                // CELL_TYPE_FORMULA will never happen
                case CellType.FORMULA:
                    break;

            }
        }
    }

    for ( int r = 0 ; r <= lastRow ; r++ ){
        cell = sheet.getRow(r).getCell(0)
        if(cell.getCellType() != CellType.BLANK){
            out.println(cell)
        }
    }
    for ( int r = 0 ; r <= lastRow ; r++ ) {
        boolean firstCell = true
        int lastCol = sheet.getRow(r).getLastCellNum()
        if ( r == 1){
            for ( int c = 1 ; c <= lastCol ; c++){
                if(firstCell){
                    out.print("| ")
                }
                out.print(" --- |")
                firstCell = false
            }
            out.println()
        }

        firstCell = true
        for( int c = 1 ; c <= lastCol ; c++ ){
            Cell cell = sheet.getRow(r).getCell(c)

            if(firstCell){
                out.print("| ")
            }
            if(cell != null){
                handleCell(cell, evaluator, formatter, out)
            }
            out.print(" | ")
            firstCell = false
        }
        out.println()
    }

Сообщение об ошибке:

Caught: java.lang.NullPointerException: Cannot invoke method getCellType() on null object
java.lang.NullPointerException: Cannot invoke method getCellType() on null object
    at org.apache.poi.ss.usermodel.CellValue$getCellType.call(Unknown Source)
    at excel2md.handleCell(excel2md.groovy:25)
    at excel2md.run(excel2md.groovy:82)

1 Ответ

0 голосов
/ 27 июня 2019

Обе Axel Richter и tim_yates нашли проблему согласно комментариям выше. Пустые ячейки возвращали нулевое значение CellValue, которое было объектом, генерирующим исключение нулевого указателя. Я изменил условие теста в методе на if (cell.getCellType ()! = CellType.BLANK), и проблема была решена.

...