At L934 of the FTPClient code, Apache does a check to see whether the data and control connections are at the same IP address (verifyRemote). If they differ, the data connection socket is closed and an exception is raised. This can be disabled, but is the default behavior (__remoteVerificationEnabled = true).
I'm connecting to the FTP via a proxy. In my setup, the L934-939 code path where verifyRemote returns false always raises a java.lang.NullPointerException. socket.getInetAddress() seems to return null after socket.close is called, leading to socket.getInetAdress().getHostAddress() to raise the java.lang.NullPointerException at L938. This obfuscates a really useful error message ("Host attempting data connection is not the same as server") with a difficult to debug NullPointerException.