{"record":{"id":"e8b8ce6cb03a2439","repo":"airbnb/lottie-android","slug":"missing-values-for-keyframe-e8b8ce","errorCode":null,"errorMessage":"Missing values for keyframe.","messagePattern":"Missing values for keyframe\\.","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"lottie/src/main/java/com/airbnb/lottie/animation/keyframe/PointKeyframeAnimation.java","lineNumber":22,"sourceCode":"\nimport com.airbnb.lottie.value.Keyframe;\n\nimport java.util.List;\n\npublic class PointKeyframeAnimation extends KeyframeAnimation<PointF> {\n  private final PointF point = new PointF();\n\n  public PointKeyframeAnimation(List<Keyframe<PointF>> keyframes) {\n    super(keyframes);\n  }\n\n  @Override public PointF getValue(Keyframe<PointF> keyframe, float keyframeProgress) {\n    return getValue(keyframe, keyframeProgress, keyframeProgress, keyframeProgress);\n  }\n\n  @Override protected PointF getValue(Keyframe<PointF> keyframe, float linearKeyframeProgress, float xKeyframeProgress, float yKeyframeProgress) {\n    if (keyframe.startValue == null || keyframe.endValue == null) {\n      throw new IllegalStateException(\"Missing values for keyframe.\");\n    }\n\n    PointF startPoint = keyframe.startValue;\n    PointF endPoint = keyframe.endValue;\n\n    if (valueCallback != null) {\n      //noinspection ConstantConditions\n      PointF value = valueCallback.getValueInternal(keyframe.startFrame, keyframe.endFrame, startPoint,\n          endPoint, linearKeyframeProgress, getLinearCurrentKeyframeProgress(), getProgress());\n      if (value != null) {\n        return value;\n      }\n    }\n\n    point.set(startPoint.x + xKeyframeProgress * (endPoint.x - startPoint.x),\n        startPoint.y + yKeyframeProgress * (endPoint.y - startPoint.y));\n    return point;\n  }","sourceCodeStart":4,"sourceCodeEnd":40,"githubUrl":"https://github.com/airbnb/lottie-android/blob/05ea92e90381eb8a8ae06855ea2b74f322bebbec/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/PointKeyframeAnimation.java#L4-L40","documentation":"Thrown by PointKeyframeAnimation#getValue (the split-dimension overload) when a keyframe's startValue or endValue is null. Point (position) keyframes need two PointF endpoints to interpolate; a null endpoint indicates incomplete keyframe data.","triggerScenarios":"Evaluating a position/path keyframe whose start or end PointF failed to parse (missing \"s\"/\"e\" point arrays in the JSON); the valueCallback branch is reached only after the null check passes, so a missing value throws first.","commonSituations":"Malformed Lottie JSON with a partially-defined position keyframe; an export that omitted the end point on a hold frame; schema mismatch.","solutions":["Inspect the JSON position keyframe and confirm both \"s\" and \"e\" point arrays are present.","Re-export the animation.","Align the lottie-android version with the file.","Simplify the path/position animation to remove the malformed keyframe."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"lottieAnimationView.setFailureListener(t -> {\n  if (t instanceof IllegalStateException && \"Missing values for keyframe.\".equals(t.getMessage())) {\n    Log.w(TAG, \"position keyframe missing point\", t);\n  } else throw new RuntimeException(t);\n});","preventionTips":["Confirm each position keyframe has both start and end point arrays.","Re-export and pin a compatible library version."],"tags":["keyframe","point","position","parsing","animation"],"backgroundTag":null,"analyzedSha":"05ea92e90381eb8a8ae06855ea2b74f322bebbec","analyzedAt":"2026-08-14T00:51:35.636Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}