2013-06-01 3 views
0

Я столкнулся с довольно сложной задачей при написании своего приложения. Вот мой вопрос:Инициализация в Try/Catch

Я пытаюсь инициализировать входной поток файла, как так:

FileInputStream fis 
fis = openFileInput(selectedFile); 

Затем поместите этот 1 строку позже:

byte[] input = new byte[fis.available()]; 

Проблема оба бита кода нужно попробовать/catch, а второй блок не может распознать fis, поскольку он был инициализирован в try/catch. Вот мой код:

private void openFile(String selectedFile) { 
     String value = ""; 
     FileInputStream fis; 
     try { 
      fis = openFileInput(selectedFile); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 


     try { 
      byte[] input = new byte[fis.available()]; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

Что мне делать? (Заранее спасибо)

+0

инициализации фП временного значения (это будет работать, если вы пытаетесь 'null'). Дело в том, как программа должна работать. –

+2

Объявите переменные за пределами try/catch или поймайте оба исключения. –

+0

Вы пытаетесь открыть файл, и если он не работает, вы распечатываете только трассировку стека и пытаетесь продолжить ... Что даст NPE. Сделайте свой метод 'openFile()' самым коротким методом IOException! – fge

ответ

0

Установить FileInputStream fis = null;, когда вы впервые объявите переменную.

Вы также можете запустить свой код, так как IOException также поймает исключение, не найденное в файле.

String value = ""; 
FileInputStream fis; 
try { 
    fis = openFileInput(selectedFile); 
    byte[] input = new byte[fis.available()]; 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

Вы также захотите вернуться после первого исключения или добавить нулевую проверку во втором блоке. – kcoppock

+0

Большое спасибо! Я буду отмечать ваш ответ как правильный, но мне нужно еще 12 минут –

+0

Я сделал небольшое редактирование, которое дает вам еще один способ исправить ваш код. –

0

Установить FileInputStream во временное значение. null будет лучшим вариантом, так как в:

FileInputStream fis = null; 

Причина этого в том, что если ваша попытка оператор выдает ошибку, то диез никогда меня инициализируется. Тогда у вас будут проблемы. Если вы не полностью выходите из этой цели, вы также должны добавить инструкцию после блоков try/catch, которые проверяют, имеет ли значение значение NULL, а именно, чтобы программа не выбрала исключение нулевого указателя.

Так что, может быть что-то вроде:

if(fis == null) { 
    return; // Which will just end the method. 
} 

Кроме того, возможно, захотите поставить попробовать/улавливает вместе (вы все равно должны объявить другие вещи за пределами попытки, по крайней мере, все, что вы планируете использовать непосредственно в дальнейшем в код), но это только могло бы быть более эффективным кодирования мудрым), как:

FileInputStream fis = null; 
byte[] input = null; 
try { 
    fis = openFileInput(selectedFile); 
    input = new byte[fis.available()]; 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
1

лучший подход в этой ситуации не поймать IOException вообще.

private void openFile(String selectedFile) throws IOException { 
     FileInputStream fis = openFileInput(selectedFile); 
     byte[] input = new byte[fis.available()]; 

Это не имеет смысла продолжать после вы получили FileNotFoundException

+0

не забывайте, что вам нужно закрыть поток ввода на блоке finally, хотя даже это должно быть окружено 'try/finally'. –

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