【问题标题】:NullPointerException calling getIntent().getStringExtra(...)NullPointerException 调用 getIntent().getStringExtra(...)
【发布时间】:2020-08-05 12:55:09
【问题描述】:

首先,我刚开始尝试编码,而且对 Firebase 的功能也很陌生。问题是,我试图通过放置与该值关联的数字来从 Firebase 中获取特定值。正如我将其设计为我的第一个活动 (Buffer2) 一样,将序列号与 EditText 一起放置,从而将值从该活动传递给下一个活动 (Buffer3)。并分配此 intent.getExtra 字符串,然后将其设为 int 以放置序列号。但是这个过程会崩溃(或停止说它为空)。 有没有另一种方法来完成这项工作?任何帮助将不胜感激。

这是我用于 buffer2 和 buffer3 的代码(xml 和 java)

buffer2 xml----------------------------

<LinearLayout
    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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Buffer2">

    <LinearLayout
        android:layout_gravity="center"
        android:gravity="center"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <EditText
            android:id="@+id/etGo"
            android:hint="Go To Page No"
            android:inputType="number"
            android:textSize="18sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/btnGo"
            android:text="Go"
            android:textStyle="bold"
            android:textSize="18sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    </LinearLayout>
</LinearLayout>

Buffer2 java---------------------------

public class Buffer2 extends AppCompatActivity {

    Button BtnGo;
    EditText EtGo;

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

        BtnGo=findViewById(R.id.btnGo);
        EtGo=findViewById(R.id.etGo);
        String number = Buffer2.this.EtGo.getText().toString();

        BtnGo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Buffer2.this, Buffer3.class);
                intent.putExtra("numberto", number);
                startActivity(intent);
            }
        });


    }
}

buffer3 xml-------------------------------

<LinearLayout
    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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Buffer3">

    <TextView
        android:id="@+id/nameTv"
        android:textSize="28sp"
        android:gravity="center"
        android:text="Loading..."
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="0dp"/>

    <TextView
        android:id="@+id/professionTv"
        android:textSize="28sp"
        android:gravity="center"
        android:text="Loading..."
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="0dp"/>

</LinearLayout>

Buffer3 java------------------------------

public class Buffer3 extends AppCompatActivity {

    TextView Name, Profession;
    DatabaseReference reference;
    String Number = getIntent().getStringExtra("numberto");

    int count = Integer.parseInt(String.valueOf(Number));

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

        Name = findViewById(R.id.nameTv);
        Profession = findViewById(R.id.professionTv);

        reference=FirebaseDatabase.getInstance().getReference().child("What")
                .child(String.valueOf(count));
    }

    protected void onStart() {
        super.onStart();

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String name = dataSnapshot.child("name").getValue().toString();
                String type = dataSnapshot.child("type").getValue().toString();
                Name.setText(name);
                Profession.setText(type);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}

Logcat------------------------

2020-04-22 18:39:48.939 11231-11231/com.potato.manpower I/Timeline: Timeline: Activity_launch_request time:419024820 intent:Intent { cmp=com.potato.manpower/.Buffer3 (has extras) }
2020-04-22 18:39:48.969 11231-11231/com.potato.manpower D/AndroidRuntime: Shutting down VM
2020-04-22 18:39:48.970 11231-11231/com.potato.manpower E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.potato.manpower, PID: 11231
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.potato.manpower/com.potato.manpower.Buffer3}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getStringExtra(java.lang.String)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2649)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2808)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1541)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:165)
        at android.app.ActivityThread.main(ActivityThread.java:6375)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getStringExtra(java.lang.String)' on a null object reference
        at com.potato.manpower.Buffer3.<init>(Buffer3.java:17)
        at java.lang.Class.newInstance(Native Method)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1079)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2639)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2808) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1541) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:165) 
        at android.app.ActivityThread.main(ActivityThread.java:6375) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802) 
2020-04-22 18:39:48.999 11231-11231/com.potato.manpower I/Process: Sending signal. PID: 11231 SIG: 9

Firebase 结构 enter image description here

【问题讨论】:

    标签: java android android-intent


    【解决方案1】:

    看起来getIntent() 在这一行返回null

    String Number = getIntent().getStringExtra("numberto");
    

    如果您将Number 的初始化移到onCreate 方法中,我希望这个问题会消失:

    
    public class Buffer3 extends AppCompatActivity {
        TextView Name, Profession;
        DatabaseReference reference;
        String Number;
    
        int count = Integer.parseInt(String.valueOf(Number));
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.buffer3);
    
            Number = getIntent().getStringExtra("numberto");
    
            Name = findViewById(R.id.nameTv);
            Profession = findViewById(R.id.professionTv);
    
            reference=FirebaseDatabase.getInstance().getReference().child("What")
                    .child(String.valueOf(count));
        }
        ...
    

    其他几点说明:

    【讨论】:

    • 感谢您的建议。我已经按照你所说的程序(放在 onCreate 和小写字母中),但情况和以前一样。什么都没有改变。
    • 搜索“getIntent() 何时可以返回 null”导致stackoverflow.com/questions/37856407/…
    • 嘿,再次感谢。我不知道是什么问题,但我认为......它发生了。我通过 intet.getExtra 方法获得的数据可以由 textview 显示(作为字符串或 int),但在这种情况下它不能传递到代码中合并......作为计数的值。参考=FirebaseDatabase.getInstance().getReference().child("What") .child(String.valueOf(count));只是不算数,而且如果我想更改从可用的字符串中获取“什么”值,则无法合并逻辑。为什么?合并这样的逻辑有什么需要注意的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多