Java 使用SmbFileInputStream获取NullPointerException

Java 使用SmbFileInputStream获取NullPointerException,java,nullpointerexception,jcifs,Java,Nullpointerexception,Jcifs,正在尝试修改另一台计算机中的excel。传递IP地址、用户名、密码和文件路径以访问和修改文件,但在新建SmbFileInputStream(sFile)处获取NullPointerException。这是什么原因 NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domin", "username", "password"); String path = "smb:\\\\<I

正在尝试修改另一台计算机中的excel。传递IP地址、用户名、密码和文件路径以访问和修改文件,但在
新建SmbFileInputStream(sFile)
处获取NullPointerException。这是什么原因

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domin", "username", "password");
                String path = "smb:\\\\<IPaddress>\\C$\\<FolderName>\\File%20-%20Input.xlsx";
                SmbFile sFile = new SmbFile(path, auth);



                try {
                    SmbFileInputStream inputStream = new SmbFileInputStream(sFile);
                    Workbook workbook = WorkbookFactory.create(inputStream);

                    Sheet sheet = workbook.getSheetAt(0);
                    int rowCount = sheet.getLastRowNum(),i=0;
                    Cell cell;
                    for(ForemostReservedDataDO obj : unsavedRecords){
                        i++;
                        Row row = sheet.createRow(rowCount+i);
                        cell = row.createCell(0);
                        cell.setCellValue(obj.getPolicyNum());
                        cell = row.createCell(1);
                        cell.setCellValue("Recreational Value");
                    }
                    inputStream.close();

                    SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);
                    workbook.write(sfos);
                    workbook.close();
                    sfos.close();

                } catch (EncryptedDocumentException | InvalidFormatException | IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
NtlmPasswordAuthentication auth=新的NtlmPasswordAuthentication(“域名”、“用户名”、“密码”);
String path=“smb:\ C$\\文件%20-%20Input.xlsx”;
SmbFile sFile=新SmbFile(路径,身份验证);
试一试{
SmbFileInputStream inputStream=新的SmbFileInputStream(sFile);
工作簿=WorkbookFactory.create(inputStream);
工作表=工作簿。getSheetAt(0);
int rowCount=sheet.getLastRowNum(),i=0;
细胞;
对于(ForemostReservedDataDO对象:未保存的记录){
i++;
Row Row=sheet.createRow(rowCount+i);
cell=row.createCell(0);
cell.setCellValue(obj.getPolicyNum());
cell=row.createCell(1);
cell.setCellValue(“娱乐价值”);
}
inputStream.close();
SmbFileOutputStream sfos=新的SmbFileOutputStream(sFile);
工作簿。编写(sfos);
workbook.close();
sfos.close();
}捕获(EncryptedDocumentException | InvalidFormatException | IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
满栈

SEVERE: Servlet.service() for servlet [spring-dispatcher] in context with path [/Foremost] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
    at jcifs.smb.ServerMessageBlock.writeString(ServerMessageBlock.java:213)
    at jcifs.smb.ServerMessageBlock.writeString(ServerMessageBlock.java:202)
    at jcifs.smb.SmbComNTCreateAndX.writeBytesWireFormat(SmbComNTCreateAndX.java:170)
    at jcifs.smb.AndXServerMessageBlock.writeAndXWireFormat(AndXServerMessageBlock.java:101)
    at jcifs.smb.AndXServerMessageBlock.encode(AndXServerMessageBlock.java:65)
    at jcifs.smb.SmbTransport.doSend(SmbTransport.java:439)
    at jcifs.util.transport.Transport.sendrecv(Transport.java:67)
    at jcifs.smb.SmbTransport.send(SmbTransport.java:655)
    at jcifs.smb.SmbSession.send(SmbSession.java:238)
    at jcifs.smb.SmbTree.send(SmbTree.java:119)
    at jcifs.smb.SmbFile.send(SmbFile.java:775)
    at jcifs.smb.SmbFile.open0(SmbFile.java:989)
    at jcifs.smb.SmbFile.open(SmbFile.java:1006)
    at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:73)
    at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:65)
    at com.Foremost.Controllers.DataDownController.saveReservedData(DataDownController.java:217)
SEVERE:Servlet[spring dispatcher]的Servlet.service()在路径为[/premist]的上下文中引发了异常[请求处理失败;嵌套异常为java.lang.NullPointerException],其根本原因是
java.lang.NullPointerException
位于jcifs.smb.ServerMessageBlock.writeString(ServerMessageBlock.java:213)
位于jcifs.smb.ServerMessageBlock.writeString(ServerMessageBlock.java:202)
在jcifs.smb.SmbComNTCreateAndX.WriteBytes重新格式化(SmbComNTCreateAndX.java:170)
在jcifs.smb.AndXServerMessageBlock.writeAndXWireFormat(AndXServerMessageBlock.java:101)
在jcifs.smb.AndXServerMessageBlock.encode(AndXServerMessageBlock.java:65)
位于jcifs.smb.SmbTransport.doSend(SmbTransport.java:439)
位于jcifs.util.transport.transport.sendrecv(transport.java:67)
位于jcifs.smb.SmbTransport.send(SmbTransport.java:655)
位于jcifs.smb.SmbSession.send(SmbSession.java:238)
位于jcifs.smb.SmbTree.send(SmbTree.java:119)
位于jcifs.smb.SmbFile.send(SmbFile.java:775)
在jcifs.smb.SmbFile.open0(SmbFile.java:989)
位于jcifs.smb.SmbFile.open(SmbFile.java:1006)
在jcifs.smb.SmbFileInputStream。(SmbFileInputStream.java:73)
在jcifs.smb.SmbFileInputStream。(SmbFileInputStream.java:65)
在com.premoments.Controllers.DataDownController.saveReservedData(DataDownController.java:217)上

最可能的问题是
sFile
对象是
null


检查您提供的文件路径。

最可能的问题是您的
sFile
对象为
null


检查您提供的文件路径。

您的JCIFS版本似乎已过时,并且与远程系统不兼容。升级到最新的JCIFS(当前版本:2.1.3)或JCIFS ng(),链接的JCIFS现在是其中的一个分支

下面是一些关于如何使用jcifs ng通过SMB读取文件的示例代码:

String fileUrl = "smb://netserver/some/path/to/file.xls";

Properties cifsProps = new Properties();
cifsProps.setProperty("jcifs.smb.client.domain", "my.domain.int");
cifsProps.setProperty("jcifs.smb.client.username", USER_NAME);
cifsProps.setProperty("jcifs.smb.client.password", PASSWORD);

Configuration config = new PropertyConfiguration(cifsProps);
BaseContext context = new BaseContext(config);
SmbResource resource = context.get(fileUrl);

if (!(resource instanceof SmbFile)) {
    throw new CIFSException("File URL does not point to a file on a network share");
}

try (InputStream in = ((SmbFile) resource).getInputStream()) {
    // TODO read from in
} finally {
    context.close();
}

对于编写文件,我认为您将能够发现:-)

您的JCIFS版本似乎已经过时,并且与远程系统不兼容。升级到最新的JCIFS(当前版本:2.1.3)或JCIFS ng(),链接的JCIFS现在是其中的一个分支

下面是一些关于如何使用jcifs ng通过SMB读取文件的示例代码:

String fileUrl = "smb://netserver/some/path/to/file.xls";

Properties cifsProps = new Properties();
cifsProps.setProperty("jcifs.smb.client.domain", "my.domain.int");
cifsProps.setProperty("jcifs.smb.client.username", USER_NAME);
cifsProps.setProperty("jcifs.smb.client.password", PASSWORD);

Configuration config = new PropertyConfiguration(cifsProps);
BaseContext context = new BaseContext(config);
SmbResource resource = context.get(fileUrl);

if (!(resource instanceof SmbFile)) {
    throw new CIFSException("File URL does not point to a file on a network share");
}

try (InputStream in = ((SmbFile) resource).getInputStream()) {
    // TODO read from in
} finally {
    context.close();
}

写一个文件,我想你会明白:-)

请在你的问题中添加NPE的完整Stacktrace。谢谢Stacktrace。您使用的是哪个版本的JCIFS?JCIFS的版本是1.3.17谢谢(您应该将其添加到问题中)。这是一个非常旧的版本,您应该升级到最新版本:(注意:新的groupId)抱歉,下次肯定会提到这个版本。你能根据我的要求提供任何最新版本(2.1.3)的示例代码吗。我写的这篇文章在使用最新的jar时出现了编译错误(因为这些是不推荐使用的方法),请将NPE的完整Stacktrace添加到您的问题中。感谢Stacktrace。您使用的是哪个版本的JCIFS?JCIFS的版本是1.3.17谢谢(您应该将其添加到问题中)。这是一个非常旧的版本,您应该升级到最新版本:(注意:新的groupId)抱歉,下次肯定会提到这个版本。你能根据我的要求提供任何最新版本(2.1.3)的示例代码吗。我写的最新jar出现编译错误(因为这些都是不推荐的方法)这也是我的第一个想法,但作为
sFile=new SmbFile(…)
,如果没有删除关键代码行,如果该行成功,则不能为
null
。否,如果路径不正确,则在这种情况下,sFile可能为空。你能安装一个调试器并检查sFile是否为空吗?我不是OP。不,如果sFile是用
新SmbFile(…)
初始化的,它就不能为空。在使用类的新实例初始化之后,任何Java引用都不能为null,除非构造函数调用因异常而失败(这将导致除OP报告之外的另一行出现异常)。在调试中,sFile不是null。这也是我的第一个想法,但正如
sFile=new SmbFile(…)
,如果没有删除关键代码行,则如果该行成功,则不能为
null