0

这段代码来自我使用的一个库,由于错误而我反编译了。

在 Windows 32 上,如果启动程序的用户是机器的管理员,它可以正常工作,否则它会崩溃。在linux上它也崩溃了。

/*      */   public static String cambiaEstensione(String nomeFile, String nuovaEstensione)
/*      */   {
/*  140 */     int p = nomeFile.lastIndexOf('.');
/*  141 */     if (p < 0) {
/*  142 */       return nomeFile + "." + nuovaEstensione;
/*      */     }
/*  144 */     return nomeFile.substring(0, p) + "." + nuovaEstensione;
/*      */   }

该函数的调用者是这样的:

/* 182 */       if (this.fl_scrivi) {
/* 183 */         stato = "Apertura archivio dichiarazioni da inviare...";
/* 184 */         this.dcm = new Dcm();
/* 185 */         this.dcm.setNomeDcm(Util.cambiaEstensione(args[2], "dcm"));
/* 186 */         this.dcm.setFileDcm(new FileOutputStream(this.dcm.getNomeDcm()));
/*     */       }

例外是:

java.io.FileNotFoundException: .dcm (Accesso negato)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at it.finanze.entrate.sco.main.M77S11.elaboraFile(M77S11.java:186)

其中“Accesso negato”的意思是“拒绝访问”。

你能帮我理解错误的原因吗?


更新:问题的原因是我在args[2].

在具有管理员权限的 Windows 上,它没有崩溃,因为它创建了文件C:\.dcm,不确定我是否必须考虑该功能或错误。

非常感谢所有回答的人。

4

6 回答 6

4

不了解 Java,但您似乎收到拒绝访问错误(“java.io.FileNotFoundException: .dcm (Accesso negato)”)。

你确定你有正确的访问权限吗?

于 2012-05-11T07:27:34.920 回答
1

该调用this.dcm.getNomeDcm()返回字符串".dcm"(无论出于何种原因),并且不存在具有该名称的文件。这并不奇怪,因为 Windows 应用程序通常不会只使用这样的扩展名来命名文件。

于 2012-05-11T07:27:17.783 回答
1

我猜“Accesso negato”意味着您没有打开文件的权限。您可以尝试将文件移动到另一个目录,以管理员身份运行程序,或更改所需的权限。

在 linux 上,您可以使用检查权限ls -l <file> 并更改它们chmod 666 <file>(所有人的读写权限)

另请参阅

于 2012-05-11T07:27:41.327 回答
1

它就在堆栈跟踪中。

java.io.FileNotFoundException: .dcm (Accesso negato)

它找不到名为“.dcm”的文件,所以看起来:

调用函数为文件名传递了一个空字符串,换句话说,args[2] 在这一行返回一个空字符串

this.dcm.setNomeDcm(Util.cambiaEstensione(args[2], "dcm"));

(因为这发生在 Linux 上)args[2] 包含一个类似“.something”的值,所以这一行

int p = nomeFile.lastIndexOf('.');

返回零,然后是这一行

return nomeFile.substring(0, p) + "." + nuovaEstensione;

只返回空字符串 + "." + 扩展。(即“.dcm”)

Linux 使用“.filename”来表示隐藏文件

于 2012-05-11T07:28:21.203 回答
1
int p = nomeFile.lastIndexOf('.');

如果nomeFile是空字符串,那么这将返回 -1 并且以下条件为真:

 if (p < 0) {
     return nomeFile + "." + nuovaEstensione;
 }

这将返回一个空字符串、一个点和传入的文件扩展名的连接,从而返回“.dmc”。具有此名称的文件似乎不存在。

于 2012-05-11T07:30:16.603 回答
0

您应该检查文件是否确实存在并具有正确的权限。

于 2012-05-11T07:26:56.840 回答