2015-07-12 2 views
-1

Я получаю исключение NullPointerException, но я не уверен, почему, поскольку этот код должен работать правильно. Ниже приведен метод вызова, где мне нужен JSONObject, который будет создан из файла в «сырой» папке.Проблемы при вызове метода в Android

JSONObject currenciesJsonObject = MiscHelper.getJsonObjectFromResource(R.raw.app_currencies, getActivity()); 

Ниже приводится полный файл класса, который распространяется на DialogFragment:

package uk.co.example.calculator.ui.fragments; 


import android.app.Dialog; 
import android.app.Fragment; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.View; 
import android.widget.LinearLayout; 

import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 

import uk.co.example.calculator.R; 
import uk.co.example.calculator.adapters.SimpleItemRecyclerViewAdapter; 
import uk.co.example.calculator.ui.activities.DividerItemDecoration; 
import uk.co.example.calculator.ui.activities.ExchangeRate; 
import uk.co.example.utils.MiscHelper; 

/** 
* A simple {@link Fragment} subclass. 
*/ 
public class CurrencyConverterDialogFrag extends android.app.DialogFragment { 

    // Declare UI elements 
    private RecyclerView recyclerView; 


    public CurrencyConverterDialogFrag() { 
     // Required empty public constructor 
    } 


    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_currency_converter_dialog_calc, new LinearLayout(getActivity()), false); 

     recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
     initializeRecyclerView(); 

     Dialog dialog = new Dialog(getActivity()); 
     dialog.setTitle("Choose currency"); 

     dialog.setContentView(view); 


     return dialog; 
    } 



     JSONObject currenciesJsonObject = MiscHelper.getJsonObjectFromResource(R.raw.app_currencies, getActivity()); 




    private ArrayList<ExchangeRate> getSampleArrayList() { 
     ArrayList<ExchangeRate> items = new ArrayList<>(); 
     try { 
      items.add(new ExchangeRate(currenciesJsonObject.getJSONObject("GBP").getString("name"), "Valyria")); 
      items.add(new ExchangeRate("Rob Stark", "Winterfell")); 
      items.add(new ExchangeRate("Jon Snow", "Castle Black")); 
      items.add(new ExchangeRate("Tyrion Lanister", "King's Landing")); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return items; 
    } 

     private void initializeRecyclerView() { 

     // Setup layout manager for items 
     LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 

     // Control orientation of the items 
     layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 

     //Customize the position you want to default scroll to 
     layoutManager.scrollToPosition(0); 

     // Attach layout manager to the RecyclerView 
     recyclerView.setLayoutManager(layoutManager); 

     // allows for optimizations if all item views are of the same size: 
     recyclerView.setHasFixedSize(true); 


     RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST); 
     recyclerView.addItemDecoration(itemDecoration); 

     bindDataToAdapter(); 
    } 

    private void bindDataToAdapter() { 
     // Bind adapter to recycler view object 
     recyclerView.setAdapter(new SimpleItemRecyclerViewAdapter(getSampleArrayList())); 
    } 


} 

Ниже приведен метод в классе MiscHelper, где происходит исключение:

 public static JSONObject getJsonObjectFromResource(int resource, Context context) { 

     // PROBLEM OCCURS ON THIS NEXT LINE AS STATED BY THE LOGCAT. LINE:252 
     InputStream inputStream = context.getResources().openRawResource(resource); 
     BufferedReader r = new BufferedReader(new InputStreamReader(inputStream)); 
     StringBuilder stringBuilder = new StringBuilder(); 
     String line; 
     String jsonString = null; 
     JSONObject jsonObject = null; 
     try { 
      while ((line = r.readLine()) != null) { 

       stringBuilder.append(line); 
      } 
      jsonString = stringBuilder.toString(); 
     } 
     catch (Exception e) { 
      Log.e("GetJsonFromResource", Log.getStackTraceString(e)); 
     } 


     try { 
      jsonObject = new JSONObject(jsonString); 
     } catch (JSONException e) { 
      Log.e("GetJsonFromResource", Log.getStackTraceString(e)); 
     } 
     return jsonObject; 
    } 

Ниже LogCat за исключением:

07-12 12:38:01.999: E/AndroidRuntime(6793): FATAL EXCEPTION: main 
07-12 12:38:01.999: E/AndroidRuntime(6793): Process: uk.co.codepix.calculator, PID: 6793 
07-12 12:38:01.999: E/AndroidRuntime(6793): java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at uk.co.codepix.utils.MiscHelper.getJsonObjectFromResource(MiscHelper.java:252) 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at uk.co.codepix.calculator.ui.fragments.CurrencyConverterDialogFrag.<init>(CurrencyConverterDialogFrag.java:56) 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at uk.co.codepix.calculator.ui.fragments.CurrencyConverterInputCalcFrag$1.onClick(CurrencyConverterInputCalcFrag.java:73) 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at android.view.View.performClick(View.java:4780) 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at android.view.View$PerformClick.run(View.java:19866) 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at android.os.Handler.handleCallback(Handler.java:739) 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at android.os.Handler.dispatchMessage(Handler.java:95) 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at android.os.Looper.loop(Looper.java:135) 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at android.app.ActivityThread.main(ActivityThread.java:5254) 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at java.lang.reflect.Method.invoke(Native Method) 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at java.lang.reflect.Method.invoke(Method.java:372) 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
07-12 12:38:01.999: E/AndroidRuntime(6793):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

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

+0

Видимо, контекст равен нулю. Поэтому getActivity() может возвращать значение null. Вам нужно увидеть больше кода, с которого вы вызываете этот метод? –

+0

, где вы вызывали 'getJsonObjectFromResource (....)'? –

+0

Где находится вызов getJsonObjectFromResource? это внутри деятельности? – gioravered

ответ

1

Насколько я вижу, вы инициализируете свою переменную currenciesJsonObject в инициализаторе экземпляра, что означает, что к тому времени, когда вы это сделаете, Fragment не подключен к Activity.

Переместить этот вызов:

MiscHelper.getJsonObjectFromResource(R.raw.app_currencies, getActivity()); 

к жизненным циклом обратного вызова, где getActivity не будет возвращать нуль. onAttach() или onCreate() может быть хорошим местом.

+1

Brillant! Спасибо @Igor Филиппов. Это работает. – CBA110

0

У меня недостаточно репутации, чтобы комментировать, так что вот только быстрый ввод: Попробуйте использовать getBaseContext() вместо getActivity().

getBaseContext() - это метод ContextWrapper. Этот ContextWrapper может быть изменен без изменения исходного контекста. В Javadoc: «Проксирование реализации контекста, который просто делегирует все свои вызовы другому Контексту. Может быть подклассифицирован для изменения поведения без изменения исходного контекста».

Существует также еще один способ, который мог бы работать: getApplicationContext(). Этот метод, с другой стороны, возвращает контекст приложения (всего жизненного цикла приложения). Это означает, что при вызове onDestroy() этот метод возвращает null.

Надеюсь, это поможет.

+0

, и можете ли вы объяснить, почему использование getBaseContext решит issie? – AADProgramming

+0

getBaseContext может решить эту проблему. Для этого нет никакой гарантии, потому что я не знаю, где @ CBA110 называет 'getJsonObjectFromResource()' – guicor

+0

Hi @guicor, этот метод вызывается из диалогового окна «Диалог внутри фрагмента».Я пытаюсь вызвать getBaseContext() и getApplicationContext(), но оба они появляются как неопределенные методы при использовании в рассматриваемом методе. – CBA110

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