当我在其他类中使用一个方法时,它会返回一个nullpointerexception



好的,所以我目前正在开发一个提供模因的应用程序,这是我自己学习的项目,但我真的从4天开始就陷入了困境,这个错误只是其中的一小部分……所以现在我在一个名为Explore Fragment的方法中创建了一个方法,并在mainactivity中创建了开关,当点击底部导航中的特定按钮时,该开关会更改片段,因此,当用户单击exploretab时,我调用这个方法,但当我单击exploreTab时,应用程序崩溃并返回2个错误。错误为-

java.lang.NullPointerException:尝试对null对象引用调用虚拟方法"boolean java.util.ArrayList.add(java.lang.Object("网址:com.example.memeit.ExploreFragment$2.onResponse(ExploreFragment.java:148(网址:com.example.memeit.ExploreFragment$2.onResponse(ExploreFragment.java:136(

第148行-list.add(class_object(;

第136行-JsonObjectRequest响应=新JsonObjectRequest(Request.Method.GET,url,null,new response.Lister((

请帮助

主要活动-

package com.example.memeit;
import android.content.Context;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
BottomNavigationView bottomnavigation;
Toolbar toolbar;
FragmentTransaction transaction;
ArrayList<exploreclass> list;
public RecyclerView rcv1_explore;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setSupportActionBar(toolbar);
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.framelayout, new HomeFragment());
transaction.commit();
toolbar = (Toolbar) findViewById(R.id.toolbar);
bottomnavigation = (BottomNavigationView) findViewById(R.id.bottom_navigation);
rcv1_explore =(RecyclerView) findViewById(R.id.rcv_explore);
list = new ArrayList<>();
bottomnavigation.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@org.jetbrains.annotations.NotNull MenuItem item) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
switch (item.getItemId())
{
case R.id.home :
transaction.replace(R.id.framelayout, new HomeFragment());
break;
case R.id.explore:
transaction.replace(R.id.framelayout, new ExploreFragment());
ExploreFragment exploreFragment = new ExploreFragment();
exploreFragment.ExtractMemes(getApplicationContext(), "https://meme-api.herokuapp.com/gimme/30");
break;
case R.id.saved:
transaction.replace(R.id.framelayout, new SavedFragment());
break;
case R.id.settings:
transaction.replace(R.id.framelayout, new SettingsFragment());
break;
}
transaction.commit();
return true;
}
});
}
}

探索碎片-

package com.example.memeit;
import static com.android.volley.VolleyLog.TAG;
import android.content.Context;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.Adapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
* Use the {@link ExploreFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class ExploreFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public String BASEURL = "https://meme-api.herokuapp.com/gimme/30";
public TextView tv1_likes;
public RecyclerView rcv1_explore;
public Context context;
public ArrayList<exploreclass> list;
public boolean isScrolling = false;
public int currentItems, totalItems, scrolledOutItems;
public LinearLayoutManager manager;
public explore_adapter adapter;
public ExploreFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment ExploreFragment.
*/
// TODO: Rename and change types and number of parameters
public static ExploreFragment newInstance(String param1, String param2) {
ExploreFragment fragment = new ExploreFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_explore, container, false);
tv1_likes =(TextView) view.findViewById(R.id.tv1_explore);
list = new ArrayList<>();
rcv1_explore =(RecyclerView) view.findViewById(R.id.rcv_explore);
rcv1_explore.setHasFixedSize(true);
rcv1_explore.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if(newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
isScrolling = true;
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
totalItems = manager.getItemCount();
currentItems = manager.getChildCount();
scrolledOutItems = manager.findFirstVisibleItemPosition();

if(isScrolling && (totalItems == currentItems + scrolledOutItems)) {
isScrolling = false;
fetchMoreData();
}
}
});
return view;
}

public void ExtractMemes(Context context, String url) {
RequestQueue queue = Volley.newRequestQueue(context);
JsonObjectRequest response = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray memes_array = response.getJSONArray("memes");
for(int i=0; i<memes_array.length(); i++) {
JSONObject memes_object = memes_array.getJSONObject(i);
exploreclass class_object = new exploreclass();
class_object.setUps(memes_object.getInt("ups"));
class_object.setUrl(memes_object.getString("url"));
class_object.setPostLink(memes_object.getString("postLink"));
list.add(class_object);
}
} catch (JSONException e) {
e.printStackTrace();
}
LinearLayoutManager manager = new LinearLayoutManager(getContext());
explore_adapter adapter = new explore_adapter(list, getContext());
rcv1_explore.setLayoutManager(manager);
rcv1_explore.setAdapter(adapter);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getContext(), error.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
}
});
queue.add(response);
}

private void fetchMoreData() {
RequestQueue queue = Volley.newRequestQueue(getContext());
JsonObjectRequest response = new JsonObjectRequest(Request.Method.GET, BASEURL, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray memes_array = response.getJSONArray("memes");
for(int i=0; i<memes_array.length(); i++) {
JSONObject memes_object = memes_array.getJSONObject(i);
exploreclass class_object = new exploreclass();
class_object.setUps(memes_object.getInt("ups"));
class_object.setUrl(memes_object.getString("url"));
class_object.setPostLink(memes_object.getString("postLink"));
list.add(class_object);
adapter.notifyDataSetChanged();
Toast.makeText(getContext(), "Success", Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getContext(), error.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
}
});
queue.add(response);
}
}

当您调用方法ExtractMemes时,您的list似乎没有初始化,因此对象为null。

该方法在onCreateView之前调用

尝试在声明处初始化它。

编辑:

在第一种情况下,您将初始化片段两次,并在实例中使用未发送到FragmentTransaction的方法。这里有一个正确的方法:

case R.id.explore:
ExploreFragment exploreFragment = new ExploreFragment();
transaction.replace(R.id.framelayout, exploreFragment);
exploreFragment.ExtractMemes(getApplicationContext(), "https://meme-api.herokuapp.com/gimme/30");
break;

然后,在ExtractMemes方法中,您使用的是在OnCreatView中初始化的list

但是,createView是在transaction.commit()之后调用的。您必须在声明或创建Fragment时初始化list

最新更新