【问题标题】:When does this code crashes?这段代码什么时候崩溃?
【发布时间】:2012-05-11 07:24:50
【问题描述】:

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

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

非常感谢所有回答的人。

【问题讨论】:

    标签: java windows file file-io


    【解决方案1】:

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

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

    【讨论】:

    • 是的,它是一个所有用户都可以读写和执行的文件夹
    • 运行您的程序的帐户是否具有在此文件夹中写入的正确权限?
    【解决方案2】:

    它就在堆栈跟踪中。

    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”来表示隐藏文件

    【讨论】:

    • 感恩米勒保罗!我只是将一个空字符串传递给该参数。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      另见chmod

      【讨论】:

        【解决方案5】:
        int p = nomeFile.lastIndexOf('.');
        

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

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

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

        【讨论】:

          【解决方案6】:

          你应该检查文件是否真的存在并且有正确的权限。

          【讨论】:

            猜你喜欢
            • 2018-10-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-28
            • 2014-10-05
            相关资源
            最近更新 更多