【问题标题】:jcifs nullpointerexception at getInputStreamgetInputStream 处的 jcifs nullpointerexception
【发布时间】:2014-10-23 09:20:15
【问题描述】:

我正在编写一个 android 应用程序以从网络下载文件,但我不断收到以下错误:

java.lang.NullPointerException 在 jcifs.smb.ServerMessageBlock.writeString(ServerMessageBlock.java:213) 在 jcifs.smb.ServerMessageBlock.writeString(ServerMessageBlock.java:202) 在 jcifs.smb.SmbComNTCreateAndX.writeBytesWireFormat(SmbComNTCreateAndX.java:170) 在 jcifs.smb.AndXServerMessageBlock.writeAndXWireFormat(AndXServerMessageBlock.java:101) 在 jcifs.smb.AndXServerMessageBlock.encode(AndXServerMessageBlock.java:65) 在 jcifs.smb.SmbTransport.doSend(SmbTransport.java:415) 在 jcifs.util.transport.Transport.sendrecv(Transport.java:70) 在 jcifs.smb.SmbTransport.send(SmbTransport.java:619) 在 jcifs.smb.SmbSession.send(SmbSession.java:240) 在 jcifs.smb.SmbTree.send(SmbTree.java:111) 在 jcifs.smb.SmbFile.send(SmbFile.java:721) 在 jcifs.smb.SmbFile.open0(SmbFile.java:926) 在 jcifs.smb.SmbFile.open(SmbFile.java:943) 在 jcifs.smb.SmbFileOutputStream.(SmbFileOutputStream.java:142) 在 jcifs.smb.SmbFileOutputStream.(SmbFileOutputStream.java:97) 在 jcifs.smb.SmbFileOutputStream.(SmbFileOutputStream.java:67) 在 za.co.ver_tex.itqueries.NetworkShareFileCopy.copyFileUsingJcifs(NetworkShareFileCopy.java:80) 在 za.co.ver_tex.itqueries.ViewQuery.ViewFile(ViewQuery.java:780) 在 za.co.ver_tex.itqueries.ViewQuery$4.onClick(ViewQuery.java:375) 在 android.view.View.performClick(View.java:4633) 在 android.view.View$PerformClick.run(View.java:19330) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:157) 在 android.app.ActivityThread.main(ActivityThread.java:5356) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 在 dalvik.system.NativeStart.main(Native Method)

这是我的代码 :

public void copyFromNetwork(String NetworkFile, String DestinationFile) {
        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("Domain",
                "User", "Password");
 SmbFile remoteFile;
        try {

remoteFile = new SmbFile("smb:" + NetworkFile, auth);

OutputStream os = new FileOutputStream(DestinationFile);

            InputStream is = null;
is = remoteFile.getInputStream();
 int bufferSize = 5096;

            byte[] b = new byte[bufferSize];
            int noOfBytes = 0;
            while ((noOfBytes = is.read(b)) != -1) {
                os.write(b, 0, noOfBytes);
            }
            os.close();
            is.close();
} catch (Exception ex) {
            Log.w("FileCopy", ex);
        }
    }

【问题讨论】:

  • 该代码看起来甚至不应该编译 - 你使用的是 remoteFile 局部变量,但它没有被明确分配......
  • 抱歉错过了复制行
  • 请发帖:ServerMessageBlock.java:213
  • remoteFile = new SmbFile("smb:" + NetworkFile, auth);

标签: java android jcifs


【解决方案1】:

remoteFile 未创建,这就是您的NullPointerException 的原因。 首先在使用它之前为一个类创建对象:

SmbFile remoteFile;//<-- HERE
        try {

OutputStream os = new FileOutputStream(DestinationFile);

            InputStream is = null;
is = remoteFile.getInputStream();

空指针:

is = remoteFile.getInputStream();// Thrown here!

我不知道SmbFile,但你需要这样的东西:

SmbFile remoteFile = new SmbFile();

【讨论】:

  • 我错过了复制我声明新 smbFile 的行
【解决方案2】:

遇到过非常相似的问题,我认为文件路径很可能不符合 SMB URL 要求。如果您调试,并且 SmbFile 实例的 unc 字段为空,我的怀疑得到了证实。它可以通过遵循source code documentation 中的规范来解决(就在初始导入语句之后)。这是一个选择:

SMB URL 示例

smb://users-nyc;miallen:mypass@angus/tmp/
此 URL 以用户 miallen 的身份引用服务器 angus 上名为 tmp 的共享 谁的密码是 mypass。

smb://Administrator:P%40ss@msmith1/c/WINDOWS/Desktop/foo.txt
一个相对复杂的示例,它以管理员用户身份引用文件 msmith1 的桌面。请注意,“@”是使用“%40”十六进制转义码编码的 URL。

smb://angus/
这仅引用服务器。在这种情况下,某些方法的行为是不同的(例如,您不能删除服务器),但是正如您可能期望的那样,list 方法将列出该服务器上的可用共享。

smb://myworkgroup/
这在语法上与上面的示例相同。但是,如果 myworkgroup 碰巧是一个工作组(名称确实暗示了这一点),则 list 方法将返回已将自己注册为 myworkgroup 成员的服务器列表。

smb:// 就像smb://server/ 列出共享和smb://workgroup/ 列出服务器一样,smb:// URL 列出了 netbios LAN 上的所有可用工作组。同样,在这种情况下,许多方法无效并返回默认值(例如 isHidden 将始终返回 false)。

smb://angus.foo.net/d/jcifs/pipes.doc
服务器名称也可以是本例中的 DNS 名称。有关详细信息,请参阅设置名称解析属性。

smb://192.168.1.15/ADMIN$/
服务器名称也可以是 IP 地址。有关详细信息,请参阅设置名称解析属性。

smb://domain;username:password@server/share/path/to/file.txt
一个使用所有字段的典型示例。

smb://myworkgroup/angus/ 尽管工作组、服务器和文件系统之间存在层次关系,但此示例无效。

smb://server/share/path/to/dir 代表工作组、服务器、共享或目录的 URL 需要尾部斜杠“/”。

smb://MYGROUP/?SERVER=192.168.10.15
SMB URL 支持一些查询字符串参数。在此示例中,SERVER 参数用于覆盖服务器名称服务查找,以联系服务器 192.168.10.15(可能已知为主浏览器)以获取工作组 MYGROUP 中的服务器列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2017-05-18
    • 2013-04-19
    • 2019-06-28
    • 2015-04-12
    相关资源
    最近更新 更多