Java 通过if语句NullPointerException初始化值

Java 通过if语句NullPointerException初始化值,java,android,android-fragments,android-spinner,Java,Android,Android Fragments,Android Spinner,我正试图在片段之间传递一个值,就像我在上一篇文章中所说的(同样的问题): 我对传递值没有问题。但是如果我添加if语句来赋值,我得到的是NPE 此代码没有问题: public int getInt() { int a = 5; return a; } public int getInt() { int a; String s1 = spinner1.getSelectedItem().toString();

我正试图在片段之间传递一个值,就像我在上一篇文章中所说的(同样的问题):

我对传递值没有问题。但是如果我添加if语句来赋值,我得到的是NPE

此代码没有问题:

public int getInt() {

        int a = 5;

        return a;
    }
public int getInt() {

        int a;
        String s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
           a = 5;  
        }

        return a;
    }
public int getInt() {

        int a = 0;
        String s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
           a = 5;  
        }

        return a;
    }
public class FragA extends Fragment {

    String s1;

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

        View view = inflater.inflate(R.layout.fraga, container, false); 

        Spinner spinner1 = (Spinner) view.findViewById(R.id.spinner1);  
        ArrayAdapter<CharSequence>  adapter_a = ArrayAdapter.createFromResource(getActivity(), R.array.spinner1,android.R.layout.simple_spinner_item );
        spinner1.setAdapter(adapter_a);

        return view;
    }

    public int getInt() {

        int a = 0;
        s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
            a = 5;
        }

        return a;    
    }

}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="30sp"
        android:textSize="20sp"
        android:gravity="center"
        android:text="@string/text_a" />

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>
我在说“局部变量a可能尚未初始化”时出错,代码如下:

public int getInt() {

        int a = 5;

        return a;
    }
public int getInt() {

        int a;
        String s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
           a = 5;  
        }

        return a;
    }
public int getInt() {

        int a = 0;
        String s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
           a = 5;  
        }

        return a;
    }
public class FragA extends Fragment {

    String s1;

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

        View view = inflater.inflate(R.layout.fraga, container, false); 

        Spinner spinner1 = (Spinner) view.findViewById(R.id.spinner1);  
        ArrayAdapter<CharSequence>  adapter_a = ArrayAdapter.createFromResource(getActivity(), R.array.spinner1,android.R.layout.simple_spinner_item );
        spinner1.setAdapter(adapter_a);

        return view;
    }

    public int getInt() {

        int a = 0;
        s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
            a = 5;
        }

        return a;    
    }

}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="30sp"
        android:textSize="20sp"
        android:gravity="center"
        android:text="@string/text_a" />

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>
但是当我尝试初始化它时,我在“String s1=spinner1.getSelectedItem().toString();”处得到了NPE:

public int getInt() {

        int a = 5;

        return a;
    }
public int getInt() {

        int a;
        String s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
           a = 5;  
        }

        return a;
    }
public int getInt() {

        int a = 0;
        String s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
           a = 5;  
        }

        return a;
    }
public class FragA extends Fragment {

    String s1;

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

        View view = inflater.inflate(R.layout.fraga, container, false); 

        Spinner spinner1 = (Spinner) view.findViewById(R.id.spinner1);  
        ArrayAdapter<CharSequence>  adapter_a = ArrayAdapter.createFromResource(getActivity(), R.array.spinner1,android.R.layout.simple_spinner_item );
        spinner1.setAdapter(adapter_a);

        return view;
    }

    public int getInt() {

        int a = 0;
        s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
            a = 5;
        }

        return a;    
    }

}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="30sp"
        android:textSize="20sp"
        android:gravity="center"
        android:text="@string/text_a" />

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>
这就是我得到错误的地方。在我的FragA片段中:

public int getInt() {

        int a = 5;

        return a;
    }
public int getInt() {

        int a;
        String s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
           a = 5;  
        }

        return a;
    }
public int getInt() {

        int a = 0;
        String s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
           a = 5;  
        }

        return a;
    }
public class FragA extends Fragment {

    String s1;

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

        View view = inflater.inflate(R.layout.fraga, container, false); 

        Spinner spinner1 = (Spinner) view.findViewById(R.id.spinner1);  
        ArrayAdapter<CharSequence>  adapter_a = ArrayAdapter.createFromResource(getActivity(), R.array.spinner1,android.R.layout.simple_spinner_item );
        spinner1.setAdapter(adapter_a);

        return view;
    }

    public int getInt() {

        int a = 0;
        s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
            a = 5;
        }

        return a;    
    }

}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="30sp"
        android:textSize="20sp"
        android:gravity="center"
        android:text="@string/text_a" />

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>
公共类FragA扩展片段{
字符串s1;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fraga,容器,假);
Spinner spinner1=(Spinner)view.findViewById(R.id.spinner1);
ArrayAdapter_a=ArrayAdapter.createFromResource(getActivity(),R.array.spinner1,android.R.layout.simple_微调器_项);
喷丝头1.固定接头(接头a);
返回视图;
}
公共int getInt(){
int a=0;
s1=喷丝头1.getSelectedItem().toString();
如果(s1等于(“你好”)){
a=5;
}
返回a;
}
}
fraga-xml:

public int getInt() {

        int a = 5;

        return a;
    }
public int getInt() {

        int a;
        String s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
           a = 5;  
        }

        return a;
    }
public int getInt() {

        int a = 0;
        String s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
           a = 5;  
        }

        return a;
    }
public class FragA extends Fragment {

    String s1;

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

        View view = inflater.inflate(R.layout.fraga, container, false); 

        Spinner spinner1 = (Spinner) view.findViewById(R.id.spinner1);  
        ArrayAdapter<CharSequence>  adapter_a = ArrayAdapter.createFromResource(getActivity(), R.array.spinner1,android.R.layout.simple_spinner_item );
        spinner1.setAdapter(adapter_a);

        return view;
    }

    public int getInt() {

        int a = 0;
        s1 = spinner1.getSelectedItem().toString();

        if(s1.equals("Hello")) {
            a = 5;
        }

        return a;    
    }

}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="30sp"
        android:textSize="20sp"
        android:gravity="center"
        android:text="@string/text_a" />

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>


解决这个问题的方法是什么?

空指针异常与
int a
变量及其初始化无关
int
不是引用类型,不能为null


它要么是
spinner1
为null(确保其初始化正确),要么是
spinner1.getSelectedItem()
返回null(未选择任何内容)。

您不能在
方法中保留未初始化的
局部变量。因此,您需要始终初始化它们NPE被抛出是因为
spinner1
spinner1。getSelectedItem()
为null

请检查您的spinner1; 它初始化了吗

否则你的代码就没问题了

Spinner spinner1=(Spinner)视图.findViewById(R.id.spinner1)
onCreateView
中声明和初始化。成为onCreateView的本地对象

 spinner.setOnItemSelectedListener(this);
使用

也不确定在哪里调用
getInt
。可能是您试图在微调器初始化之前调用
getInt

编辑:

查看评论中的链接

零碎

public interface OnSpinnerSelectedListener {
    public void onValueSelected(String position);
}
然后

然后覆盖onAttach并初始化
mCallback

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        mCallback = (OnSpinnerSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnSpinnerSelectedListener");
    }
}
然后在onCreateView中

 spinner.setOnItemSelectedListener(this);
然后

现在,当您在微调器中选择“值”时

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
        long arg3) {  
    String s1= spinner1.getSelectedItem().toString();
    mCallback.onValueSelected(s1);
    }
然后

一旦在“活动”中选择了值,请将该值传递给另一个片段

参考:



检查您是如何初始化spinneer1的。在这里发布代码和堆栈跟踪,希望您能通过微调器获得NPE。上一个代码中的变量a没有问题。
spinner1
spinner1.getSelectedItem()
为空。请核实。你什么时候调用
getInt()
方法?你在哪里初始化了你的微调器?是的,我的微调器得到了一个NPE。我已经在我的微调器中选择了“Hello”,但我总是得到NPE。是的,我的微调器得到NPE。我已经在微调器中选择了“Hello”,但我总是得到NPE。请确保它已正确初始化。您选择“Hello”的微调器引用可能不是由“spinner1”引用的。我现在已更新并发布了微调器的代码。我是否正确初始化了它?请将此行“Spinner spinner1=(Spinner)view.findViewById(R.id.spinner1);”在使用“spinner1”参考之前的所有方法中。您在getInt()方法中错过了这一点。我现在已经更新并发布了微调器的代码。我是否正确初始化了它?您必须在类上声明
spinner1
变量,以便它在所有方法中都可用。我现在已经更新并发布了我的spinner的代码。全局声明spinner1。我仍然在spinner上获得NPE。我们可以去我以前的职位吗?我也把它贴在那里,我叫它getInt@user2942600,你叫它
getInt
。我在MainActivity中没有看到调用
getInt
。@user2942600所有片段到片段的通信都应该通过托管活动进行。请仔细阅读文件是的,我做了。你能查一下我以前的代码,我发布的链接,我在哪里得到NPE