Currently there are two subclasses of FtpException -
The constructors AuthenticationFailedException(String msg, Throwable th) and DataConnectionException(final String msg, final Throwable th) ignore (do not use) the second parameter, "th". The parameter "th" should be passed to the constructor of super class to have accurate stack trace.
Also, out of curiosity, why does the FtpException has a member variable named "throwable" for storing the cause instead of using the cause defined in java.lang.Throwable? Why were the printStackTrace methods overridden?