2012-05-11 2 views
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) 

Где "комплек negato" означает "Access Denied".

Помогите мне понять причину ошибки?


UPDATE: Причина проблемы заключалась в том, что я проезжал пустую строку в args[2].

В Windows с правами администратора он не разбился, потому что он создал файл C:\.dcm, не уверен, что мне нужно учитывать эту функцию или ошибку.

Благодарим всех, кто ответил.

ответ

1

Это прямо в трассировке стека.

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

Он не может найти файл с именем ".ДХМ»так кажется:

Либо функция вызова передается пустая строка для имени файла, другими словами арг [2] возвращает пустую строку в этой строке

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

ИЛИ (с это происходит на Linux) арг [2] содержит значение, как «.something» так что эта линия

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

возвращает ноль, а затем эту строку

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

Возвращает только пустую строку + "." + Расширение. (Т.е. ".dcm ")

Linux использует" .filename" для обозначения скрытых файлов

+0

Grazie mille Paolo! Я просто передавал пустую строку этому параметру. –

0

Вы должны проверить, действительно ли файл существует и имеет правильное разрешение.

1

Вызов this.dcm.getNomeDcm() возвращает строку ".dcm" (по какой-либо причине), и файл с таким именем не существует. Что неудивительно, так как приложения Windows обычно не называют файлы с таким расширением.

4

Не знаю Java, но похоже, что вы получили ошибку отказа в доступе ("java.io.FileNotFoundException: .dcm (Accesso negato)").

У вас есть правильные права доступа?

+0

Да, это папка, на которой все пользователи могут читать записи и выполнять –

+0

Имеет ли учетная запись, на которой запущена ваша программа, правильные права на запись в эту папку? – Julien

1

Я думаю, что «Accesso negato» означает, что у вас нет разрешения на открытие файла. Вы можете попытаться переместить файлы в другой каталог, запустить программу как администратор или изменить необходимые разрешения.

В Linux вы можете проверить права доступа с помощью ls -l <file> и изменить их с chmod 666 <file> (чтение и запись для всех)

Смотрите также chmod

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

nomeFile Если это пустая строка, то это вернет -1 и условие followgin верно:

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

Это вернет конкатентацию пустой строки, точки и переданного в расширение файла, возвращая таким образом «.dmc». Файл с таким именем, похоже, не существует.

Смежные вопросы