何为对可能为空的指针进行取消引用操作?

16

我正在使用 NetBeans 编写一个 SFTP 程序。

我的部分代码:

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”(可能的空指针解除引用),如何解决这些警告?我应该在哪里断开我的“Session”和“Channel”连接?
3个回答

23

sessionTarget = jsch.getSession(backupUser, backupHost, backupPort); 在这行代码中,getSession() 方法可能会抛出异常,因此变量 sessionTargetchannelTarget 将为 null,在 finally 块中访问这些变量可能会导致空指针异常。

为了避免这种情况,在 finally 块中在访问变量之前先检查它们是否为 null。

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

@AnkitLamba:已更新答案。 - Abimaran Kugathasan

1
这意味着:如果在finally块中,你的channelTargetsessionTarget为空,检查它们是否为空以避免警告。

-2

我认为NetBeans只是想警告你这些可能为空,但这并不一定是真的。你可以选择禁用这些警告。只需将光标放在警告上,按下ALT+ENTER,然后从选项中选择甚至禁用这些警告。


2
一般来说,除非你确信一切都会没问题,否则不要忽略或禁用警告。禁用这种类型的警告属于该类别;如果可能会解引用空指针,那么在编译时找出问题比调试NullPointerException要好得多。 - Dennis Meng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接