android-fragments 当从片段[重复]初始化Activity时,Android应用程序崩溃

gstyhher  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(164)

此问题在此处已有答案

What is a NullPointerException, and how do I fix it?(12个答案)
6个月前关闭。
我目前正在尝试在Android Studio中创建一个日历应用程序。该应用程序包含一个具有不同“视图”的日历,如月视图、周视图和日视图。
该应用使用片段作为页面,每个视图都是一个Activity。
这是用于初始化每个视图的片段和按钮的代码

public class CalendarFragment extends Fragment {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_calendar, container, false);
    Button btn1 = (Button) v.findViewById(R.id.openCalendar);
    btn1.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v)
        {
            Intent intent = new Intent(getActivity(),CalendarActivity.class);
            startActivity(intent);

        }
    });

    Button btn2 = (Button) v.findViewById(R.id.openWeek);
    btn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v)
        {
            Intent intent = new Intent(getActivity(), WeekViewActivity.class);
            startActivity(intent);
        }
    });
    return v;
}

第一个按钮显示日历的月视图,在代码中称为“CalendarActivity”,工作正常,但当单击第二个按钮显示日历的周视图时,会导致应用程序崩溃,并在logcat中显示以下错误

2022-05-13 14:44:59.642 15183-15183/com.example.finalyearproject E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.finalyearproject, PID: 15183
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.finalyearproject/com.example.finalyearproject.WeekViewActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.time.LocalDate.format(java.time.format.DateTimeFormatter)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3685)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3842)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2252)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.app.ActivityThread.main(ActivityThread.java:7842)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.time.LocalDate.format(java.time.format.DateTimeFormatter)' on a null object reference
    at com.example.finalyearproject.CalendarUtils.monthYearFromDate(CalendarUtils.java:16)
    at com.example.finalyearproject.WeekViewActivity.setWeekView(WeekViewActivity.java:40)
    at com.example.finalyearproject.WeekViewActivity.onCreate(WeekViewActivity.java:29)
    at android.app.Activity.performCreate(Activity.java:8054)
    at android.app.Activity.performCreate(Activity.java:8034)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1341)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3666)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3842) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2252) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loopOnce(Looper.java:201) 
    at android.os.Looper.loop(Looper.java:288) 
    at android.app.ActivityThread.main(ActivityThread.java:7842) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 

我不知道是什么问题,因为我一直在遵循一个教程和其他功能的工作。我也包括了下面的每个活动的代码。
每月检视

public class CalendarActivity extends AppCompatActivity implements CalendarAdapter.OnItemListener {
private TextView monthYearText;
private RecyclerView calendarRecyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_calendar);
    initWidgets();
    CalendarUtils.selectedDate = LocalDate.now();
    setMonthView();
}

private void initWidgets()
{
    calendarRecyclerView = findViewById(R.id.calendarRecyclerView);
    monthYearText = findViewById(R.id.monthYearTV);
}

private void setMonthView()
{
    monthYearText.setText(monthYearFromDate(CalendarUtils.selectedDate));
    ArrayList<LocalDate> daysInMonth = daysInMonthArray(CalendarUtils.selectedDate);

    CalendarAdapter calendarAdapter = new CalendarAdapter(daysInMonth, this);
    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(), 7);
    calendarRecyclerView.setLayoutManager(layoutManager);
    calendarRecyclerView.setAdapter(calendarAdapter);
}

public void nextMonth(View view)
{
    CalendarUtils.selectedDate = CalendarUtils.selectedDate.plusMonths(1);
    setMonthView();
}

public void previousMonth(View view)
{
    CalendarUtils.selectedDate = CalendarUtils.selectedDate.minusMonths(1);
    setMonthView();
}

每周检视

public class WeekViewActivity extends AppCompatActivity implements CalendarAdapter.OnItemListener {
private TextView monthYearText;
private RecyclerView calendarRecyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_week_view);
    initWidgets();
    setWeekView();
}

private void initWidgets()
{
    calendarRecyclerView = findViewById(R.id.calendarRecyclerView);
    monthYearText = findViewById(R.id.monthYearTV);
}

private void setWeekView()
{
    monthYearText.setText(monthYearFromDate(CalendarUtils.selectedDate));
    ArrayList<LocalDate> days = daysInWeekArray(CalendarUtils.selectedDate);

    CalendarAdapter calendarAdapter = new CalendarAdapter(days, this);
    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(), 7);
    calendarRecyclerView.setLayoutManager(layoutManager);
    calendarRecyclerView.setAdapter(calendarAdapter);
}


public void previousWeek(View view)
{
    CalendarUtils.selectedDate = CalendarUtils.selectedDate.minusWeeks(1);
    setWeekView();
}

public void nextWeek(View view)
{
    CalendarUtils.selectedDate = CalendarUtils.selectedDate.plusWeeks(1);
    setWeekView();
}

如有任何建议,我们将不胜感激。

ia2d9nvy

ia2d9nvy1#

当尝试在setWeekView内执行monthYearFromDate(CalenderUtils.selectedDate)时,由于空指针引用而引发错误。所以我猜CalenderUtils.selectedDate没有初始化。

7gyucuyw

7gyucuyw2#

我的建议:

  • 首先,您没有初始化CalendarUtils。selectedDate
  • 用断点覆盖代码以进行. debugging或用Log.d()消息查找,哪个变量为空

相关问题