diff --git a/src/main/java/org/apache/datasketches/sampling/VarOptItemsSketch.java b/src/main/java/org/apache/datasketches/sampling/VarOptItemsSketch.java index ad46b4f04..121b6678a 100644 --- a/src/main/java/org/apache/datasketches/sampling/VarOptItemsSketch.java +++ b/src/main/java/org/apache/datasketches/sampling/VarOptItemsSketch.java @@ -827,8 +827,8 @@ void update(final T item, final double weight, final boolean mark) { if (item == null) { return; } - if (weight <= 0.0) { - throw new SketchesArgumentException("Item weights must be strictly positive: " + if (weight <= 0.0 || Double.isNaN(weight) || Double.isInfinite(weight)) { + throw new SketchesArgumentException("Item weights must be strictly positive and finite number: " + weight + ", for item " + item.toString()); } ++n_; diff --git a/src/test/java/org/apache/datasketches/sampling/VarOptItemsSketchTest.java b/src/test/java/org/apache/datasketches/sampling/VarOptItemsSketchTest.java index 1331c57a7..4a9fa3a63 100644 --- a/src/test/java/org/apache/datasketches/sampling/VarOptItemsSketchTest.java +++ b/src/test/java/org/apache/datasketches/sampling/VarOptItemsSketchTest.java @@ -264,6 +264,18 @@ public void checkInvalidWeight() { vis.update("invalidWeight", -1.0); // should fail } + @Test(expectedExceptions = SketchesArgumentException.class) + public void checkNaNWeight() { + final VarOptItemsSketch vis = VarOptItemsSketch.newInstance(5); + vis.update("invalidWeight", Double.NaN); + } + + @Test(expectedExceptions = SketchesArgumentException.class) + public void checkInfiniteWeight() { + final VarOptItemsSketch vis = VarOptItemsSketch.newInstance(5); + vis.update("invalidWeight", Double.POSITIVE_INFINITY); + } + @Test public void checkCorruptSerializedWeight() { final VarOptItemsSketch vis = VarOptItemsSketch.newInstance(24);