【问题标题】:Issues When Calling a Method in Android在 Android 中调用方法时的问题
【发布时间】: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


【解决方案1】:

我没有足够的声誉来发表评论,所以这里只是一个快速输入: 尝试使用getBaseContext() 而不是getActivity()

getBaseContext() 是 ContextWrapper 的一个方法。可以在不更改原始上下文的情况下修改此 ContextWrapper。在 Javadoc 中:“Context 的代理实现,只是将其所有调用委托给另一个 Context。可以子类化以修改行为而无需更改原始 Context。”

还有另一种可行的方法: getApplicationContext()。另一方面,此方法返回应用程序上下文(整个应用程序生命周期)。这意味着当onDestroy()被调用时,这个方法返回null。

希望对你有帮助。

【讨论】:

  • 您能解释一下为什么使用 getBaseContext 可以解决问题吗?
  • getBaseContext 可能会解决它。不能保证,因为我不知道@CBA110 在哪里调用getJsonObjectFromResource()
  • 嗨@guicor,这个方法是从片段内的DialogFragment调用的。我正在尝试调用 getBaseContext() 和 getApplicationContext() 但在相关方法上使用时,两者都是未定义的方法。
  • @CBA110 如果您在Fragment 上,则使用getActivity() 访问Context 还将您的代码JSONObject currenciesJsonObject = MiscHelper.getJsonObjectFromResource(R.raw.app_currencies, getActivity()); 移动到onCreateDialog(..)
  • 我同意@MD 你必须移动你的代码。但是根据您要实现的目标,您也可以将其放入 getSampleArrayList(),因为它是唯一使用变量 currenciesJsonObject 的函数
【解决方案2】:

据我所知,您在实例初始化程序中初始化变量 currenciesJsonObject,这意味着当您这样做时,Fragment 未附加到 Activity

移动这个电话:

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

getActivity 不会返回null 的生命周期回调。 onAttach()onCreate() 可能是个好地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 2014-12-12
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多