Uploaded image for project: 'Keikai'
  1. Keikai
  2. KEIKAI-457

evaluating IF() produces a NullPointerException

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Critical
    • Resolution: Fixed
    • Affects Version/s: 5.7.0
    • Fix Version/s: 5.8.0
    • Component/s: None
    • Security Level: Jimmy
    • Labels:
      None

      Description

      Steps to Reproduce

      1. load the attached xlsx
      Or
      Test case io.keikai.model.FormulaEvalTest.keikai457()

      Current Result

      2021-03-29 14:35:26 [ERROR] FormulaEngineImpl:491 - null when eval IF(B1>10, 1,0)
      java.lang.NullPointerException
      at org.zkoss.poi.ss.formula.eval.RelationalOperationEval.evaluate(RelationalOperationEval.java:72)
      at org.zkoss.poi.ss.formula.functions.Fixed2ArgFunction.evaluate(Fixed2ArgFunction.java:48)
      at org.zkoss.poi.ss.formula.OperationEvaluatorFactory.evaluate(OperationEvaluatorFactory.java:134)
      at org.zkoss.poi.ss.formula.WorkbookEvaluator.evaluateFormula(WorkbookEvaluator.java:625)
      at org.zkoss.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:355)
      at org.zkoss.poi.ss.formula.WorkbookEvaluator.evaluate(WorkbookEvaluator.java:294)
      at io.keikai.model.impl.sys.formula.FormulaEngineImpl.evaluateFormula(FormulaEngineImpl.java:587)
      at io.keikai.model.impl.sys.formula.FormulaEngineImpl.evaluate(FormulaEngineImpl.java:467)
      at io.keikai.model.impl.CellImpl.evalFormula(CellImpl.java:201)
      at io.keikai.model.impl.CellImpl.getFormulaResultType(CellImpl.java:218)
      at io.keikai.ui.SpreadsheetCtrlImpl.getCellAttr(SpreadsheetCtrlImpl.java:495)
      at io.keikai.ui.SpreadsheetCtrlImpl.getRangeAttrs(SpreadsheetCtrlImpl.java:382)
      at io.keikai.ui.Spreadsheet.createActiveRange(Spreadsheet.java:1970)
      at io.keikai.ui.Spreadsheet.renderProperties(Spreadsheet.java:1923)

      Expected Result

      no error

      Debug Information

      1. in RelationalOperationEval, context becomes null after calculating vA with OperandResolver.getSingleValue()

      			vA = context.isEvalNameFormula()
      					? OperandResolver.getSingleValueInNameFormula(arg0, srcRowIndex, srcColumnIndex)
      					: OperandResolver.getSingleValue(arg0, srcRowIndex, srcColumnIndex);
      			vB = context.isEvalNameFormula()
      					? OperandResolver.getSingleValueInNameFormula(arg1, srcRowIndex, srcColumnIndex)
      					: OperandResolver.getSingleValue(arg1, srcRowIndex, srcColumnIndex);
      

      RelationalOperationEval is used as singleton, so while evaluating one RelationalOperationEval and evaluating another RelationalOperationEval will turn context into null. Should not put context in a singleton

      Workaround


        Attachments

          Issue Links

            Activity

              People

              Assignee:
              DevChu DevChu
              Reporter:
              hawk hawk
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: