2015-02-05 5 views
-1

Почему следующий метод выбрасывает NPE,бросать Исключение нулевого указателя

public ActivityOne extends Activity{ 
    DataManager dtMan = new DataManager(this) 

    public onCreate(){ 
    ...some source code here... 
    dtMan.check(); 
    } 
} 

public class DataManager(){ 
    private Context myContext; 

    public DataManager (Context context){ 
    myContext = context; 
    } 

    Helper helper = new Helper(this); 

    public boolean check(){ 
    helper.open(); 
    ...some source code here... 
    } 
} 

Когда я просмотреть LogCat; Я получаю исключение java.null.pointer, так что я сделал что-то вроде

public class DataManager(){ 
    private Context myContext; 

    public DataManager (Context context){ 
    myContext = context; 
    } 

    public boolean check(Context context){ 
    **Helper helper = new Helper(context);** 
    helper.open(); 
    ...some source code here... 
    } 
} 

И это сработало, так что разница между этими двумя DataManager в перспективе/Android программирования Java, таким образом, этот подход, если я правильно понял должен реплицировать как следующие:

public class DataManager(){ 
    private Context myContext; 

    public DataManager (Context context){ 
    myContext = context; 
    } 

    public boolean check(Context context){ 
    **Helper helper = new Helper(context);** 
    helper.open(); 
    ...some source code here... 
    } 

    public boolean check2(Context context){ 
    **Helper helper = new Helper(context);** 
    helper.open(); 
    ...some source code here... 
    } 

    public boolean check3(Context context){ 
    **Helper helper = new Helper(context);** 
    helper.open(); 
    ...some source code here... 
    } 
} 

Значение Я просто не могу объявить вспомогательный класс один раз и использовать его в любом месте класса вызова, я забыл некоторые основы? Просьба уточнить.

Будет ли контекст также приводить к утечкам памяти ?, если да, то как я его исправлю?

@EDIT:

Ну я забыл включить вспомогательный класс

общественного класса Helper { частный контекст myContext;

public Helper(Context context){ 
    myContext = context; 
} 

public void open(){ 
    //do stuff here 
} 

}

+2

интересного 'нового помощник (это),' 'где this' является экземпляром 'DataManager', и кажется, что Helper принимает контекст как paramater ... это должно даже не компилироваться ... – Selvin

+0

Контекст' this' не инициализирован! запустите свой Datamanager в onCreate, и все будет в порядке –

+0

@ A.S. на самом деле enogh будет инициализацией хелпера перемещения в конструктор 'DataManager' ... – Selvin

ответ

1

Ваш код не работает, потому что DataManager инициализируется в области действия в Activity.

Классы, которые нуждаются в контексте всегда должны быть инициализированы в одном из методов жизненного цикла своей деятельности по:

OnCreate, OnStart, OnDestroy и т.д.

Как это:

private DataManager dataManager; 

public void on create(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    dataManager = new DataManager(this): 
} 

Вы также должен инициализировать класс Helper в конструкторе DataManager:

public class DataManager(){ 
    private Context context; 
    private Helper helper; 

    public DataManager (Context context){ 
     this.context = context; 
     this.helper = new Helper(this.context); 
    } 

    public boolean check(Context context){ 
     helper.open(); 
     //...some source code here... 
    } 
} 

Чтобы предотвратить утечку памяти, вам просто нужно убедиться, что класс DataManager не является статическим экземпляром с контекстом активности.

Если не нужен контекст деятельности, но вы также хорошо с контекстом приложения, вы должны использовать:

public DataManager(Context context){ 
    this.context = context.getApplicationContext(); 
    //... 
} 
+0

, которого я никогда не знал, я всегда практиковал, чтобы инициализировать все, что было снаружи метода, подумав, что это будет общедоступным, это то, о чем я думал, когда-то. –

+0

См. Edit;) Добавлен код для класса Helper. –

+0

"this.helper = новый помощник (this.context);" - Это решение, не так ли? –

0

Попробуйте поместить

dtMan = новый DataManager (это)

в методе OnCreate в деятельности?

+0

это не поможет, так как проблемы здесь нет ...вы можете передать ссылку на действие, но вы не можете использовать ее до тех пор, пока onCreate ... – Selvin

+0

@Selvin, вы можете передать ссылку на действие, но вы не можете использовать ее до тех пор, пока она не будет создана. Не могли бы вы рассказать немного больше, чуть больше. .. PLS. –

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