pentaho/pentaho-kettle · error · IllegalArgumentException
Bounds of this rule are not numeric: lowerBound=
Error message
Bounds of this rule are not numeric: lowerBound=
What it means
Thrown from NumberRangeDialog.ok() when parsing the lower or upper bound of a number range rule fails with NumberFormatException; the dialog rethrows it as IllegalArgumentException with both bound strings. addRule requires numeric double bounds.
Solutions
- Enter plain numeric values using dot as decimal separator (e.g. 1.5)
- Remove spaces or stray characters from the bound fields
- Check the JVM/system locale if comma decimals keep failing and use the dot explicitly
- Validate the rule table before saving the dialog
Example fix
// before lowerBound = "1,5"; // comma decimal -> NumberFormatException // after lowerBound = "1.5"; // dot decimal parses as double
Defensive patterns
Strategy: validation
Validate before calling
try { Double.parseDouble(lower); Double.parseDouble(upper); } catch (NumberFormatException e) { throw new IllegalArgumentException("Bounds must be numeric with dot decimal: " + lower + ", " + upper); } Type guard
boolean isNumeric(String s) { if (s == null || s.isBlank()) return false; try { Double.parseDouble(s.trim()); return true; } catch (NumberFormatException e) { return false; } } Try / catch
try { ok(); } catch (IllegalArgumentException e) { showInvalidBoundsDialog(e.getMessage()); } Prevention
- Enter dot-decimal numbers regardless of locale
- Trim pasted values and check for stray characters
- Never leave bound fields empty
When it happens
Trigger: Clicking OK on the Number Range step dialog after entering a non-numeric value (e.g. '10x', '', locale-formatted '1,5') into the lower or upper bound field of a rule.
Common situations: Locale differences (comma vs dot decimal separator), stray spaces or characters pasted into bound fields, or leaving a bound field blank.
Understand the failure class
Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.
Related errors
- JobExecutorDialog.Exception.NoValidMappingDetailsFound
- JobExecutorDialog.Exception.UnableToFindRepositoryDirectory
- MappingDialog.Exception.NotConnectedToRepository.Message
- MappingDialog.Exception.NoValidMappingDetailsFound
- MappingDialog.Exception.UnableToFindRepositoryDirectory
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/452b467dcfab3946.
Report an issue: GitHub.
Appendix: source
Thrown at ui/src/main/java/org/pentaho/di/ui/trans/steps/numberrange/NumberRangeDialog.java:361
input.setOutputField( outputFieldControl.getText() );
int count = rulesControl.nrNonEmpty();
for ( int i = 0; i < count; i++ ) {
TableItem item = rulesControl.getNonEmpty( i );
String lowerBoundStr =
Utils.isEmpty( item.getText( 1 ) ) ? String.valueOf( -Double.MAX_VALUE ) : item.getText( 1 );
String upperBoundStr =
Utils.isEmpty( item.getText( 2 ) ) ? String.valueOf( Double.MAX_VALUE ) : item.getText( 2 );
String value = item.getText( 3 );
try {
double lowerBound = Double.parseDouble( lowerBoundStr );
double upperBound = Double.parseDouble( upperBoundStr );
input.addRule( lowerBound, upperBound, value );
} catch ( NumberFormatException e ) {
throw new IllegalArgumentException( "Bounds of this rule are not numeric: lowerBound="
+ lowerBoundStr + ", upperBound=" + upperBoundStr + ", value=" + value, e );
}
}
dispose();
}
private void loadComboOptions() {
try {
String fieldvalue = null;
if ( inputFieldControl.getText() != null ) {
fieldvalue = inputFieldControl.getText();
}
RowMetaInterface r = transMeta.getPrevStepFields( stepname );
if ( r != null ) {
inputFieldControl.setItems( r.getFieldNames() );
}
if ( fieldvalue != null ) {View on GitHub (pinned to f3058517a1)