尤其对于Java而言,这非常新,使用SimpleFTP库将文件发送到服务器。

似乎对SimpleFTP对象的任何方法调用似乎都需要包含在try-catch中。那么,断开服务器连接的正确方法是什么?

例如:

private void ftp()
{
    int portNumber = 21;
    SimpleFTP ftp = new SimpleFTP();

    try
    {
        ftp.connect("serverAddress", portNumber, "userName", "password");

        ftp.bin();

        ftp.cwd("dir");

        ftp.stor(new File("filePath"));

    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        ftp.disconnect();
    }

}


由于fianlly正文中的内容,因此无法编译。如果我将其移至try块并废弃finally,它将进行编译...但是,如果我的应用程序连接到服务器,然后在执行其他任务时抛出异常怎么办?

最佳答案

您没有提到的是您遇到问题的原因是还声明了disconnect()引发IOException

查看SimpleFTP的来源,您会发现:

public synchronized void disconnect() throws IOException {
    try {
        sendLine("QUIT");
    }
    finally {
        socket = null;
    }
}


它所要做的就是将QUIT命令发送到远程FTP服务器,然后仅在其finally块中删除对该套接字的引用。如果抛出....这意味着套接字已经死了,但是由于断开连接,您真的不在乎(如果我编写了该客户端,则由于这个原因我会捕获并忽略该异常,而不是扔了)。

在您的finally块中,将其包装在自己的try / catch块中,并且在catch块中不执行任何操作。选项B只是将其放在try块中。抛出该异常的唯一原因是,如果套接字已经断开连接,并且在异常发生后让SimpleFTP实例超出范围也将清除所有内容。

09-26 06:28