以下是我的FTPClient重试方法。它有一个bug。当初始连接成功没有问题。但是如果2,3次尝试总是在NullPointerException中结束。显然连接在重试时是成功的,但是当我尝试列出远程文件时,它会抛出异常。
FTPClient ftpConnection(int in, FTPCon objGetFiles) {
FTPClient ftp = null;
if (in < RetryCount) {
try {
in = in + 1;
logger.debug("connecting .........");
ftp = objGetFiles.connectToServer(FTPServer, FTPPort, FTPUser, FTPPasswd, RDir);
logger.debug("connected and the ftp object is "+ftp);
} catch (IOException ioe) {
logger.debug(ioe.toString());
logger.debug("sleeping for " + (RetrySleep / 1000) + " sec");
try {
Thread.sleep(RetrySleep);
logger.debug("retrying connection");
ftpConnection(in, objGetFiles);
} catch (InterruptedException iex) {
logger.debug(iex.toString());
}
}
} else {
logger.debug("maximum retry exceed.");
}
return ftp;
}
DEBUG Starter - retrying connection
DEBUG Starter - connecting .........
DEBUG FTPCon - connecting to server ....
DEBUG FTPCon - 230 Logged on
DEBUG FTPCon - changing working directory
DEBUG FTPCon - 250 CWD successful. "/tmp" is current directory.
DEBUG Starter - connected and the ftp object is org.apache.commons.net.ftp.FTPClient@51e2b2a6
DEBUG Starter - java.lang.NullPointerException
FTPFile n[] = ftp.listFiles();
上面是抛出NullPointerException的地方。我相信它在重试方法中的一个错误(因为初始连接总是工作正常),但到目前为止没有运气
答案 0 :(得分:0)
您以递归方式调用ftpConnection()
,但由于ftp
的每次调用都有自己的ftpConnection()
,因此您最终只返回顶级ftp-variable
变量。您的重试调用生成的FTPClient
- 对象会立即丢失,因为ftpConnection(in, objGetFiles)
的结果未分配给变量。
快速修复
try {
Thread.sleep(RetrySleep);
logger.debug("retrying connection");
ftp = ftpConnection(in, objGetFiles);
} catch (InterruptedException iex) {
logger.debug(iex.toString());
}
但我会考虑使用递归是否正确,或者循环对于这类问题是否更好。