2014-02-06 150 views
10

我正在製作SFTP的程序NetBeans什麼是解引用可能的空指針?

我的代碼一些部分:

com.jcraft.jsch.Session sessionTarget = null; 
com.jcraft.jsch.ChannelSftp channelTarget = null; 
try { 
     sessionTarget = jsch.getSession(backupUser, backupHost, backupPort); 
     sessionTarget.setPassword(backupPassword); 
     sessionTarget.setConfig("StrictHostKeyChecking", "no"); 
     sessionTarget.connect(); 
     channelTarget = (ChannelSftp) sessionTarget.openChannel("sftp"); 
     channelTarget.connect(); 

     System.out.println("Target Channel Connected"); 
     } catch (JSchException e) { 
      System.out.println("Error Occured ======== Connection not estabilished"); 
      log.error("Error Occured ======== Connection not estabilished", e); 
     } finally { 
      channelTarget.exit();  // Warning : dereferencing possible null pointer 
      channelTarget.disconnect(); // Warning : dereferencing possible null pointer 
      sessionTarget.disconnect(); // Warning : dereferencing possible null pointer 
     } 

我得到警告dereferencing possible null pointer,我怎麼能解決這些警告??? 我可以在哪裏斷開我的SessionChannel ???

回答

18

sessionTarget = jsch.getSession(backupUser, backupHost, backupPort);在這裏,在這條線,getSession()方法可以拋出異常,並且因此變量sessionTargetchannelTarget將是空的,在最終塊,則正在訪問這些變量,這可能引起零指示字例外。

爲了避免這種情況,在finally塊中訪問變量之前檢查null。

finally { 
    if (channelTarget != null) { 
     channelTarget.exit();  
     channelTarget.disconnect(); 
    } 
    if (sessionTarget != null) { 
     sessionTarget.disconnect(); 
    } 
} 
+0

我明白你在說什麼,但我該如何解決這個問題? –

+0

@AnkitLamba:更新回答 –

1

這意味着:如果您的channelTargetsessionTarget在您的finally塊中爲空,該怎麼辦?檢查它們爲空以避免警告。

0

我認爲NetBeans是隻是想提醒你的是,這些可以爲null,可能不是真正的necasarilly。您可以選擇禁用警告。只需將光標置於警告按ALT+ENTER並從選項中選擇即使禁用警告。

+0

作爲一般規則,您不想忽略/禁用警告,除非您知道一切都會好的事實。禁用這種警告不屬於該類別;如果你可能會解引用null,那麼在編譯時計算出來要比調試NullPointerException要好得多。 –