Spin ner选定的项目得到NullpointerExceptionError

问题描述 投票:0回答:2

我想传递所选微调器项目的值。在我的活动中,有2对微调器,每对中第二个微调器取决于第一个微调器的值。由于需要将值传递给另一个活动,因此我将值带入了不同的字符串变量,并将其传递给另一个活动。但是活动可能在Spinner.getSelectedItem()。toString()方法中显示了空指针执行。

activityClass

package com.example.bohon_final__001;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

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

public class SqlitemainActivity extends AppCompatActivity {
    Spinner pickupspinner1,pickupspinner2,destspinner1,destspinner2;
    Button selectbtn;
    EditText inputLabel;


    String pickdistrict,pickarea,destdistrict,destarea,vehicletype;

    ArrayList<String>disarray;
    ArrayAdapter<String>disarray_adapter;

    ArrayList<String>sylhet,moulovibazar,sunamgonj,habiganj;
    ArrayAdapter<String>area;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sqlitemain);


        pickupspinner1 = (Spinner)findViewById(R.id.pickupspinner1);
        pickupspinner2 = (Spinner)findViewById(R.id.pickupspinner2);

        destspinner1=(Spinner)findViewById(R.id.destinationspinner1);
        destspinner2=(Spinner)findViewById(R.id.destinationspinner2);

        selectbtn=findViewById(R.id.selectbutton);

        String vehicletype=getIntent().getStringExtra("vehicleType");

        disarray=new ArrayList<>();
        disarray.add("Sylhet");
        disarray.add("Sunamgonj");
        disarray.add("Moulovibazar");
        disarray.add("Habiganj");

        disarray_adapter=new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_spinner_item,disarray);
        pickupspinner1.setAdapter(disarray_adapter);
        destspinner1.setAdapter(disarray_adapter);


        sylhet=new ArrayList<>();
        sylhet.add("Sylhet Sadar");
        sylhet.add("Dakshin Surma");
        sylhet.add("Moglabazar");
        sylhet.add("Kanaighat");
        sylhet.add("Bishwanath");


        sunamgonj=new ArrayList<>();
        sunamgonj.add("Sunamganj Sadar");
        sunamgonj.add("Chhatak");
        sunamgonj.add("Jagannathpur");
        sunamgonj.add("Jamalganj");
        sunamgonj.add("Derai");



        moulovibazar=new ArrayList<>();
        moulovibazar.add("Barlekha");
        moulovibazar.add("Kulawra");
        moulovibazar.add("Moulovibazar Sadar");
        moulovibazar.add("Rajnagar");
        moulovibazar.add("Sreemongol");




        habiganj=new ArrayList<>();
        habiganj.add("Ajmiriganj");
        habiganj.add("Baniachang");
        habiganj.add("Bahubal");
        habiganj.add("Chunarughat");
        habiganj.add("Habiganj Sadar");

        pickupspinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {

                if(i==0)
                {
                    area=new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_spinner_item,sylhet);

                }

                if(i==1)
                {
                    area=new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_spinner_item,sunamgonj);

                }

                if(i==2)
                {
                    area=new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_spinner_item,moulovibazar);

                }

                else
                {
                    area=new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_spinner_item,habiganj);

                }


                pickupspinner2.setAdapter(area);

            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });





        destspinner1.setOnItemSelectedListener(
        new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if(i==0)
                {
                    area=new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_spinner_item,sylhet);
                }

                if(i==1)
                {
                    area=new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_spinner_item,sunamgonj);
                }

                if(i==2)
                {
                    area=new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_spinner_item,moulovibazar);
                }

                if(i==3)
                {
                    area=new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_spinner_item,habiganj);
                }


                destspinner2.setAdapter(area);

            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });



        pickdistrict=pickupspinner1.getSelectedItem().toString();
        pickarea=String.valueOf(pickupspinner2.getSelectedItem());
        destdistrict=destspinner1.getSelectedItem().toString();
        destarea=destspinner2.getSelectedItem().toString();




        selectbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent submissionintent=new Intent(SqlitemainActivity.this,FinalRequestActivity.class);
                submissionintent.putExtra("pickd",pickdistrict);
                submissionintent.putExtra("picka",pickarea);
                submissionintent.putExtra("desd",destdistrict);
                submissionintent.putExtra("desa",destarea);
                submissionintent.putExtra("vtype",vehicletype);
                startActivity(submissionintent);
            }
        });








    }



}

活动类Xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SqlitemainActivity"
    android:orientation="vertical"
    android:background="#000000"


    >

        <TextView
            android:layout_width="230dp"
            android:layout_height="wrap_content"
            android:text="Select Your District:"
            android:layout_marginStart="0dp"
            android:layout_marginLeft="0dp"
            android:layout_marginTop="50dp"
            android:textStyle="italic"
            android:textColor="#F44336"
            android:textSize="15sp"
            />

    <TextView
        android:layout_width="171dp"
        android:layout_height="wrap_content"
        android:text="Area:"
        android:layout_marginStart="0dp"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="120dp"
        android:textStyle="italic"
        android:textColor="#F44336"
        android:textSize="15sp"
        />

        <TextView
            android:id="@+id/pickuplocationtext"
            android:layout_width="355dp"
            android:layout_height="wrap_content"
            android:layout_marginVertical="20dp"
            android:text="Select your Pickup Location"
            android:textColor="@color/yellow"
            android:textSize="20sp"
            android:textStyle="bold" />

    <Spinner
        android:id="@+id/pickupspinner1"
        android:layout_width="253dp"
        android:layout_height="37dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginStart="0dp"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="70dp"
        android:background="#FF8100" />

    <Spinner
        android:id="@+id/pickupspinner2"
        android:layout_width="203dp"
        android:layout_height="30dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginStart="0dp"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="150dp"
        android:background="#FF8100" />





    <Button
            android:id="@+id/selectbutton"
            android:layout_width="214dp"
            android:layout_height="63dp"
            android:layout_marginLeft="90dp"
            android:layout_marginTop="600dp"
            android:background="@drawable/selectart"
            android:text="" />








        <TextView
            android:id="@+id/destlocationtext"
            android:layout_width="355dp"
            android:layout_height="wrap_content"
            android:layout_marginVertical="230dp"
            android:text="Select your Destination Location"
            android:textColor="@color/yellow"
            android:textSize="20sp"
            android:textStyle="bold" />

    <TextView
        android:layout_width="230dp"
        android:layout_height="wrap_content"
        android:text="Select Your District:"
        android:layout_marginStart="0dp"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="260dp"
        android:textStyle="italic"
        android:textColor="#F44336"
        android:textSize="15sp"
        />

    <TextView
        android:layout_width="171dp"
        android:layout_height="wrap_content"
        android:text="Area:"
        android:layout_marginStart="0dp"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="320dp"
        android:textStyle="italic"
        android:textColor="#F44336"
        android:textSize="15sp"

        />

    <Spinner
        android:id="@+id/destinationspinner1"
        android:layout_width="251dp"
        android:layout_height="37dp"
        android:layout_marginStart="0dp"
        android:background="#FF8100"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="280dp" />

    <Spinner
        android:id="@+id/destinationspinner2"
        android:layout_width="199dp"
        android:layout_height="31dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginStart="0dp"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="350dp"
        android:background="#FF8100" />



</RelativeLayout>

这是我遇到的错误


  Process: com.example.bohon_final__001, PID: 1417
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bohon_final__001/com.example.bohon_final__001.SqlitemainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2952)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3087)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1817)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6746)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
        at com.example.bohon_final__001.SqlitemainActivity.onCreate(SqlitemainActivity.java:181)
        at android.app.Activity.performCreate(Activity.java:7144)
        at android.app.Activity.performCreate(Activity.java:7135)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2932)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3087) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1817) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6746) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

java android spinner
2个回答
0
投票

您获得了NullPointerException或NPE,这是您必须要意识到的最常见的例外,从here中您可以找到富有成果的答案和有关它的解释

在您的特殊情况下,您的NPE异常是由于在空对象上调用toString()方法,因此不允许访问未实例化的对象的字段和方法。

  Process: com.example.bohon_final__001, PID: 1417
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bohon_final__001/com.example.bohon_final__001.SqlitemainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference

查看代码,在选定项目之前,对微调器的选定项目调用toString(),这是NPE的原因

pickdistrict=pickupspinner1.getSelectedItem().toString();
pickarea=String.valueOf(pickupspinner2.getSelectedItem());
destdistrict=destspinner1.getSelectedItem().toString();
destarea=destspinner2.getSelectedItem().toString();

因此您可以通过以下方式解决此问题:

在调用toString()之前设置默认项目,这可以通过以下方式完成

pickupspinner1.setSelection(my_default_item); // replace my_default_item with one of your spinner items
// Then you can call toString() afterwards
destdistrict = String.valueOf(pickupspinner2.getSelectedItem());

或通过在用户选择微调器项目时调用toString(),以确保已选择某项;为此,请实现微调器onItemSelected()setOnItemSelectedListener回调

pickupspinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        String selection = (String) parent.getItemAtPosition(position);
        destdistrict = String.valueOf(selection);
    }
}

0
投票

是的,我已修复错误。唯一的问题是分配字符串的值应该在onCLick Button侦听器方法内,而不是在Oncreate方法内。

selectbtn.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View view) {
                pickdistrict=pickupspinner1.getSelectedItem().toString();
                pickarea=String.valueOf(pickupspinner2.getSelectedItem());
                destdistrict=destspinner1.getSelectedItem().toString();
                destarea=destspinner2.getSelectedItem().toString();
                Intent submissionintent=new Intent(SqlitemainActivity.this,FinalRequestActivity.class);
                submissionintent.putExtra("pickd",pickdistrict);
                submissionintent.putExtra("picka",pickarea);
                submissionintent.putExtra("desd",destdistrict);
                submissionintent.putExtra("desa",destarea);
                submissionintent.putExtra("vtype",vehicletype);
                startActivity(submissionintent);
            }
        });
© www.soinside.com 2019 - 2024. All rights reserved.