【问题标题】:I'm getting an error (java.lang.NullPointerException) when I try to run my app [duplicate]当我尝试运行我的应用程序时出现错误(java.lang.NullPointerException)[重复]
【发布时间】:2017-09-30 01:20:15
【问题描述】:

我正在学习如何编写代码和开发适用于 Android 的应用程序,并且我目前正在尝试制作一个新闻应用程序。 但是当我尝试运行应用程序时出现此错误: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null对象引用。

这些应用一开始运行良好,当时只有一个 Activity。但是后来我尝试使用 viewpagers 对其进行 bild,我修复了一堆错误,但是这个我无法找出发生了什么。我阅读了一些关于如何修复 NullPointerException 的内容,但我仍然无法修复它。

代码如下:

请忽略葡萄牙语的评论和文档,我只是写了它 任何方式,无组织。 (我计划在完成代码后关注它)。

 package com.example.android.news;

import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.content.Context;
import android.content.Intent;

import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.os.Bundle;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class NewsFragment extends Fragment implements android.support.v4.app.LoaderManager.LoaderCallbacks<List<News>> {

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

    //Contexto do app
    private Context mContext = getContext();

    public static final String LOG_TAG = NewsFragment.class.getName();

    /** Adapter da lista de news */
    private NewsAdapters mAdapter;

    /** URL para o dado da notícia (news) do dataset do The Gardian */
    private static final String THE_GARDIAN_DATASET =
            "https://content.guardianapis.com/search?api-key=4a8dba55-ace9-40bf-8a3c-05a1d2eebd65";

    /**
     * Valor constante para o ID do loader de news. Podemos escolher qualquer inteiro.
     * Isto só importa realmente se você estiver usando múltiplos loaders.
     */
    private static final int NEWS_LOADER_ID = 1;

    /** TextView que é mostrada quando a lista é vazia */
    private TextView mEmptyStateTextView;

    /** ProgressBar que é mostrada enquanto o app busca dados do servidor */
    private ProgressBar mLoadingSpinner;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_news , container, false);

        final ArrayList<News> newses = new ArrayList<News>();

        // Acha uma referência para a {@link ListView} no layout
        ListView newsListView = (ListView) rootView.findViewById(R.id.list);

        if (getTag() != null){
            // Cria um novo adapter que pega uma lista vazia de news como entrada
            mAdapter = new NewsAdapters(mContext, newses);

            // Seta o adapter na {@link ListView}
            // para que a lista pode ser populada na interface do usuário
            newsListView.setAdapter(mAdapter);
        }

        //Acha uma referencia para a {@link TextView}
        mEmptyStateTextView = (TextView) rootView.findViewById(R.id.empty_state_text_view);

        //Acha uma referencia para a {@link ProgressBar}
        mLoadingSpinner = (ProgressBar) rootView.findViewById(R.id.loading_spinner);

        //Seta um emptyState {@ link emptyView} na ListView {@ link earthquakeListView}
        newsListView.setEmptyView(mEmptyStateTextView);

        newsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                // Acha a news atual que foi clicado
                News currentNews = mAdapter.getItem(position);

                //Converte a URL da String em um objeto URI (para passar no construtor da Intent)
                Uri newsUri = Uri.parse(currentNews.getmWebUrl());

                // Cria um novo intent para visualizar o URI
                Intent webIntent = new Intent(Intent.ACTION_VIEW, newsUri);

                // Envia a intent para lançar uma nova activity
                startActivity(webIntent);
            }
        });

        //Cria um objeto da classe para monitorar a conexão com a internet
        ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);

        //Verifica o estado da conexão
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();

        if (isConnected){
            // Obtém uma referência ao LoaderManager, a fim de interagir com loaders.
            LoaderManager loaderManager = getLoaderManager();

            // Inicializa o loader. Passa um ID constante int definido acima e passa nulo para
            // o bundle. Passa esta activity para o parâmetro LoaderCallbacks (que é válido
            // porque esta activity implementa a interface LoaderCallbacks.
            loaderManager.initLoader(NEWS_LOADER_ID, null, this);
        } else {
            mLoadingSpinner.setVisibility(View.GONE);
            mEmptyStateTextView.setText(R.string.no_internet);
        }

        return rootView;
    }

    @Override
    public Loader<List<News>> onCreateLoader(int id, Bundle args) {

        Uri baseUri = Uri.parse(THE_GARDIAN_DATASET);
        Uri.Builder uriBuilder = baseUri.buildUpon();

        // Criar um novo loader para a dada URL
        return new NewsLoader(getContext(), uriBuilder.toString());
    }

    @Override
    public void onLoadFinished(Loader<List<News>> loader, List<News> news) {
        //Hide the LoadingSpinner when the loading is finished
        mLoadingSpinner.setVisibility(View.GONE);

        //Seta o texto a ser mostrado caso não haja news a serem mostrados
        mEmptyStateTextView.setText(R.string.empty_state);

        // Limpa o adapter de dados de news anteriores
        mAdapter.clear();

        // Se há uma lista válida de {@link News}s, então os adiciona ao data set do adapter.
        // Isto ativará a atualização da ListView.
        if (news != null && !news.isEmpty()) {
            mAdapter.addAll(news);
        }
    }

    @Override
    public void onLoaderReset(Loader<List<News>> loader) {
        // Reseta o Loader, então podemos limpar nossos dados existentes.
        mAdapter.clear();
    }
}

还有日志猫:

    09-29 16:17:44.553 26644-26644/com.example.android.news E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: com.example.android.news, PID: 26644
                                                                          java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
                                                                              at android.view.LayoutInflater.from(LayoutInflater.java:233)
                                                                              at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:181)
                                                                              at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:166)
                                                                              at com.example.android.news.NewsAdapters.<init>(NewsAdapters.java:0)
                                                                              at com.example.android.news.NewsFragment.onCreateView(NewsFragment.java:69)
                                                                              at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192)
                                                                              at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299)
                                                                              at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
                                                                              at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
                                                                              at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758)
                                                                              at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363)
                                                                              at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149)
                                                                              at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103)
                                                                              at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1984)
                                                                              at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626)
                                                                              at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
                                                                              at android.support.v4.view.ViewPager.populate(ViewPager.java:1268)
                                                                              at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
                                                                              at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642)
                                                                              at android.view.View.measure(View.java:21051)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459)
                                                                              at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                              at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                              at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                              at android.view.View.measure(View.java:21051)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459)
                                                                              at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                              at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                                                                              at android.view.View.measure(View.java:21051)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459)
                                                                              at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:393)
                                                                              at android.view.View.measure(View.java:21051)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459)
                                                                              at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                              at android.view.View.measure(View.java:21051)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459)
                                                                              at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                              at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                              at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                              at android.view.View.measure(View.java:21051)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459)
                                                                              at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                              at com.android.internal.policy.DecorView.onMeasure(DecorView.java:849)
                                                                              at android.view.View.measure(View.java:21051)
                                                                              at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2583)
                                                                              at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1642)
                                                                              at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1893)
                                                                              at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1522)
                                                                              at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7098)
                                                                              at android.view.Choreographer$CallbackRecord.run(Choreographer.java:927)
                                                                              at android.view.Choreographer.doCallbacks(Choreographer.java:702)
                                                                              at android.view.Choreographer.doFrame(Choreographer.java:638)
09-29 16:17:44.553 26644-26644/com.example.android.news E/AndroidRuntime:     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:913)
                                                                              at android.os.Handler.handleCallback(Handler.java:751)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                              at android.os.Looper.loop(Looper.java:154)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:6682)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

我就是不知道出了什么问题。 如果有人可以帮助我,我会很感激!

【问题讨论】:

  • Re你的'请忽略',最好一开始就写正确,而不是把bug放进去,然后又把它们拿出来。不要这样从事你的职业。
  • 关于 EJP 的观点。请查看如何制作minimal reproducible example

标签: java android android-fragments android-asynctask nullpointerexception


【解决方案1】:

把这个放在onCreateView()方法的顶部:

this.mContext = getActivity();

您的问题将得到解决。片段没有上下文,它们依赖于它们所在的 Activity。

【讨论】:

  • 那么这个方法是如何工作的呢? github.com/android/platform_frameworks_base/blob/master/core/…
  • 您投了反对票,令人惊讶的是,您给出了相同的答案。只有我让它变得更简单。当调用 OnAttach 时,来自 Activity 的相同上下文被传递,所以请!支持我的答案或去尝试测试代码而不是反对真正的答案!
  • 在附加片段之前,上下文为空。更改字段方法并不能解决问题
  • 好的,我已经更改了我的代码,考虑投票!
  • 在那个方法中它仍然可以为空。 stackoverflow.com/questions/31236451/…
【解决方案2】:

改变这个:

//Cria um objeto da classe para monitorar a conexão com a internet
    ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);

到:

//Cria um objeto da classe para monitorar a conexão com a internet
        ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);

【讨论】:

  • 此时上下文字段为空
  • 试试:rootView.getContext()
【解决方案3】:

在 Fragment 附加到 Activity 之前,上下文为空。

你需要这个功能

//Contexto do app
private Context mContext;

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.mContext = context;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-16
    • 2019-12-01
    • 1970-01-01
    • 2014-10-22
    • 2016-04-09
    • 2020-02-20
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多