2014-01-14 112 views
0

對Java尤其新穎,使用SimpleFTP庫將文件發送到服務器。使用SimpleFTP從FTP服務器斷開連接的正確方法是什麼?

看起來像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,它會編譯......但是如果我的應用程序連接到服務器,然後在執行其他任務時拋出異常呢?

回答

1

什麼你沒有提到的是,你所遇到的問題的原因是,disconnect()也宣稱拋出IOException

縱觀源SimpleFTP你發現:

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

所有它做的是發送QUIT命令用來在遠程FTP服務器則只是刪除其finally塊的參考插座。如果拋出....這意味着套接字已經死了,但是因爲你斷開連接,你真的不在乎(如果我寫了這個客戶端,我會因爲這個原因而忽略了異常,而不是它扔了)。

在您的finally塊中,將它包裝在自己的try/catch塊中,不要在catch塊中做任何事情。選項B只是將其放入try區塊。它將拋出的唯一原因是,如果套接字已經斷開連接,並且在發生異常之後讓實例超出範圍,則同樣也會清除事件。

+0

啊,對於缺乏信息感到抱歉。雖然Java與C#非常相似,但有一點我不熟悉,因爲它不存在或者我沒有遇到它。由於更長的解釋標記你的答案:) – sab669

1

環繞斷開通話與它自己的try catch塊...

finally 
{ 
    if (ftp != null) { 
    try { 
     ftp.disconnect(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 
相關問題