【发布时间】:2015-09-30 18:55:36
【问题描述】:
我收到 NullPointerException,但我不知道为什么,因为这段代码应该可以正常工作。下面是调用方法,我需要从“原始”文件夹中的文件创建 JSONObject。
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)
谁能告诉我我做错了什么?任何关于我应该如何解决问题的详细解释将不胜感激。
【问题讨论】:
-
显然,上下文为空。所以 getActivity() 可能会返回 null。需要看更多代码,你从哪里调用这个方法?
-
你在哪里打电话给
getJsonObjectFromResource(....)? -
getJsonObjectFromResource 的调用在哪里?它在活动中吗?
-
嗨@IgorFilippov,好问题。因此,该方法是从 Fragment 内的 DialogFragment 调用的。我认为你是正确的,上下文可能返回 null 但我试图调用 getBaseContext() 和 getApplicationContext() 但在方法上使用时两者都是未定义的方法。
-
嗨 @MD,我刚刚向 Igor 发表了一条评论,这可能会更好地为您解释这种情况。
标签: java android methods nullpointerexception