A DESCRIPTION OF THE PROBLEM : Please consider this code snippet: ``` public class Temp { public static void main(String[] args) throws IOException, InterruptedException { java.lang.Process unixProcess = new ProcessBuilder("ls").directory(new File(".")).start(); unixProcess.waitFor(Long.MAX_VALUE, TimeUnit.MILLISECONDS); } } ``` it should work, but it dies with "IllegalArgumentException: timeout value is negative" exception. Looking at `java.lang.UNIXProcess#waitFor(long timeout, TimeUnit unit)` method: long remainingNanos = unit.toNanos(timeout); //reporter: this returns Long.MAX_VALUE long deadline = System.nanoTime() + remainingNanos; ``` ... do { // Round up to next millisecond wait(TimeUnit.NANOSECONDS.toMillis(remainingNanos + 999_999L)); //reporter: remainingNanos + 999_999L evaluates to negative value, because remainingNanos == Long.MAX_VALUE ... ``` STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : public class Temp { public static void main(String[] args) throws IOException, InterruptedException { java.lang.Process unixProcess = new ProcessBuilder("ls").directory(new File(".")).start(); unixProcess.waitFor(Long.MAX_VALUE, TimeUnit.MILLISECONDS); } } EXPECTED VERSUS ACTUAL BEHAVIOR : EXPECTED - Successful execution ACTUAL - Exception in thread "main" java.lang.IllegalArgumentException: timeout value is negative at java.lang.Object.wait(Native Method) at java.lang.UNIXProcess.waitFor(UNIXProcess.java:412) ---------- BEGIN SOURCE ---------- public class Temp { public static void main(String[] args) throws IOException, InterruptedException { java.lang.Process unixProcess = new ProcessBuilder("ls").directory(new File(".")).start(); unixProcess.waitFor(Long.MAX_VALUE, TimeUnit.MILLISECONDS); } } ---------- END SOURCE ---------- CUSTOMER SUBMITTED WORKAROUND : Specify smaller timeout
|