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」「Access Denied」を意味します。

エラーの理由を理解するのを手伝ってもらえますか?


更新:問題の理由は、空の文字列を渡していたためです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 を返し、followgin 条件が true になります。

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

これは、空の文字列、ドット、および渡されたファイル拡張子の連結を返し、".dmc" を返します。この名前のファイルは存在しないようです。

于 2012-05-11T07:30:16.603 に答える
0

ファイルが実際に存在し、正しい権限を持っているかどうかを確認する必要があります。

于 2012-05-11T07:26:56.840 に答える