这段代码什么时候崩溃了?

时间:2012-05-11 07:24:51

标签: java windows file file-io

此代码来自我使用的库,并且由于错误而反编译。

在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,不确定我是否必须考虑该功能或错误。

非常感谢所有回答的人。

6 个答案:

答案 0 :(得分:4)

不知道Java,但看起来你收到了拒绝访问错误(“java.io.FileNotFoundException:.dcm(Accesso negato)”)。

您确定自己拥有正确的访问权限吗?

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

另见chmod

答案 3 :(得分:1)

它就在堆栈跟踪中。

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

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

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

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

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

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

返回零,然后返回此行

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

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

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

答案 4 :(得分:1)

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

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

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

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

答案 5 :(得分:0)

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