If a setter throws ParameterException, don't wrap it into another ParameterException.
diff --git a/src/main/java/com/beust/jcommander/Parameterized.java b/src/main/java/com/beust/jcommander/Parameterized.java
index ec698fa..302d2b6 100644
--- a/src/main/java/com/beust/jcommander/Parameterized.java
+++ b/src/main/java/com/beust/jcommander/Parameterized.java
@@ -178,7 +178,12 @@
} catch (IllegalAccessException ex) {
throw new ParameterException(ex);
} catch (InvocationTargetException ex) {
- throw new ParameterException(ex);
+ // If a ParameterException was thrown, don't wrap it into another one
+ if (ex.getTargetException() instanceof ParameterException) {
+ throw (ParameterException) ex.getTargetException();
+ } else {
+ throw new ParameterException(ex);
+ }
}
}
diff --git a/src/test/java/com/beust/jcommander/JCommanderTest.java b/src/test/java/com/beust/jcommander/JCommanderTest.java
index 9dba74d..8b1e761 100644
--- a/src/test/java/com/beust/jcommander/JCommanderTest.java
+++ b/src/test/java/com/beust/jcommander/JCommanderTest.java
@@ -837,9 +837,26 @@
Assert.assertTrue(arg.help);
}
+ public void setterThatThrows() {
+ class Arg {
+ @Parameter(names = "--host")
+ public void setHost(String host) {
+ throw new ParameterException("Illegal host");
+ }
+ }
+ boolean passed = false;
+ try {
+ new JCommander(new Arg(), new String[] { "--host", "host" });
+ } catch(ParameterException ex) {
+ Assert.assertEquals(ex.getCause(), null);
+ passed = true;
+ }
+ Assert.assertTrue(passed, "Should have thrown an exception");
+ }
+
@Test(enabled = false)
public static void main(String[] args) throws Exception {
- new JCommanderTest().verifyHelp();
+ new JCommanderTest().setterThatThrows();
// class A {
// @Parameter(names = "-short", required = true)
// List<String> parameters;