2010-08-16 5 views
1

Кажется, что не существует разрешения Android-манифеста, которое должно быть установлено для файла io.Почему этот Android FileOutputStream запускает исключение NullPointerException?

public class Device extends Activity { 
    private static final Configuration config = new Configuration(); 
    ... 
    private boolean applyMenuChoice(MenuItem item) { 
     switch (item.getItemId()) { 
     ... 
     case R.id.menuSave: 
      ... 
      configuration.modify(name, to, from, user); 
      configuration.write(); 
      ... 

public class Configuration extends Activity { 
    private final static String CONFIG = "config.txt"; 
    private static StringBuilder config = new StringBuilder(); 
    ... 
    public void write() { 
     try { 
      FileOutputStream fos = openFileOutput(CONFIG, Context.MODE_PRIVATE); 
      fos.write(config.toString().getBytes()); 
      ... 
+0

Когда метод записи вызывается? –

+0

write() находится в классе Configuration (см. Фрагмент, добавленный в исходный вопрос) и вызывается applyMenuChoice() в классе Device, когда в конфигурацию внесено изменение. Отладчик использовался для проверки того, что конфигурация заполнена так, как ожидалось, перед любой реальной попыткой записи, но исключение создается до того, как оно даже попытается выполнить фактическую запись (в openFileOutput). Нельзя ли использовать openFileOutput в applyMenuChoice? – jacknad

+1

Ваш код является очень незаконным. Вы не можете создать экземпляр активности (ну, я думаю, вы можете, но вы не должны) напрямую с помощью new(). Если вы хотите записать данные из одного действия внутри другого действия, вам, скорее всего, придется передавать данные через службу или сделать другой метод write() внутри устройства – Falmarri

ответ

1

Замена незаконного экземпляра действия правильными методами позволила решить эту проблему. Большое вам спасибо (снова) Falmarri.

0

Где вы пытаетесь написать свой файл? Если он находится на SD-карте устройства, вам необходимо установить разрешение WRITE_EXTERNAL_STORAGE в манифесте Android. Вам также может потребоваться установить путь, а не просто использовать имя файла.

+0

Это небольшой файл. Я не пытаюсь писать на внешнее хранилище, и я уверен, что openFileOutput не принимает пути к файлам. – jacknad

+0

Я добавил WRITE_EXTERNAL_STORAGE разрешение манифесту, чтобы узнать, поможет ли оно, но это не так, и я не понимаю, почему этот ответ отмечен как полезный, если он не является (по крайней мере, не в этом случае). – jacknad

0

Исключение выбрано в этом сценарии, если этот указатель неверен. Вероятно, вы создали свою деятельность, используя свой ctor, как обычный объект, и не использовали начальную активность намерения. В этом случае Dont вызвать openFileOutput или this.openFileOutput, но вы должны послать контекст, который вы в качестве аргумента, чтобы написать функцию(), и использовать этот контекст, т.е .:

write(Context context) 
{ 
    context.openFileOutput(...) 
    ... 
Смежные вопросы