java - 来自内部类的奇怪错误

标签 java android

我遇到了这个奇怪的错误。我不明白为什么会这样。

问题来了

如果我将这段代码放在 firebaseproblem.onDataChange 中,我会得到一个错误。

String pl = "Ali";
     items[0] = pl;

如果我把它放在其他地方,它会完美地工作...它是 items[0] 用于调试目的

错误日志

07-20 12:16:06.605 2720-2720/azcrew.eatapp E/UncaughtException: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
                                                                at azcrew.eatapp.halfdone.listComp$2.onDataChange(listComp.java:98)
                                                                at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
                                                                at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
                                                                at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
                                                                at android.os.Handler.handleCallback(Handler.java:739)
                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                at android.os.Looper.loop(Looper.java:155)
                                                                at android.app.ActivityThread.main(ActivityThread.java:5696)
                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                at java.lang.reflect.Method.invoke(Method.java:372)
                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
07-20 12:16:06.845 2720-2720/azcrew.eatapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                         Process: azcrew.eatapp, PID: 2720
                                                         java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
                                                             at azcrew.eatapp.halfdone.listComp$2.onDataChange(listComp.java:98)
                                                             at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
                                                             at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
                                                             at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
                                                             at android.os.Handler.handleCallback(Handler.java:739)
                                                             at android.os.Handler.dispatchMessage(Handler.java:95)
                                                             at android.os.Looper.loop(Looper.java:155)
                                                             at android.app.ActivityThread.main(ActivityThread.java:5696)
                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                             at java.lang.reflect.Method.invoke(Method.java:372)
                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

完整代码如下

public class listComp extends AppCompatActivity {
    ListView listView;
    String[] id;
    String[] items = new String[20];
    int index = -1;
    static String pl;
    listMVP l = new listMVP();

    private static final String TAG = "test";

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

        listView = (ListView) findViewById(R.id.listcomp);

        Bundle b = this.getIntent().getExtras();
        id = b.getStringArray("id");

        firebaseproblem1();

        removingnull();

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item1, items);
        listView.setAdapter(adapter);



        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int d, long l) {
                String a = ((TextView) view).getText().toString();

                for(int ind = 0; d<items.length;ind++){
                 if(items[ind].equals(a)){
                        index = ind;
                     break;
                    }
                }
                //intentIn();
            }
        });
}


    private void firebaseproblem1() {
        for(int i=0; i<id.length;i++){
            if(id[i]!= null){
                DatabaseReference ref5 = FirebaseDatabase.getInstance().getReference();
                DatabaseReference q = ref5.child("Restoran").child(id[i]).child("id");

                l.setI(i);
                final int finalI = i;
                q.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    pl = "Ali";
                    items[0] = pl;
                }

                @Override
                 public void onCancelled(DatabaseError databaseError) {
                }
                });
            }
        }
    }

    private void removingnull() {
        List<String> list = new ArrayList<String>();
        for(String s: items){

            if(s!= null){
                list.add(s);
            }
        }
        items = list.toArray(new String[list.size()]);
    }

    private void intentIn() {
        Bundle c = new Bundle();
        c.putString("resId",id[index]);
        Intent i1 = new Intent(this, ListMain.class);
        i1.putExtras(c);
        startActivity(i1);
    }
}

最佳答案

你的 onDataChanged将来可以随时调用函数。

与此同时,您的代码调用了 removingnull功能,它重置了items数组到空数组。

If I put anywhere else it works perfectly

那是因为那是在removingnull之前同步执行的功能,因此 items数组仍然是 String[20]

您可以记录一些消息来让自己相信代码的执行顺序。


建议的修复:

忘掉数组,让 items 成为 List<String> ,你不会遇到这种问题。

关于java - 来自内部类的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45209396/

相关文章:

java - 使用扫描仪在java中自定义用户输入的输出

java - @OneToMany/@ManyToOne 如何使用表单保存数据

java - 将 null 转换为 void 数组

java - 如何读取 firestore 子集合并将其传递给 FirestoreRecyclerOptions

java - Views Navigation 使用 Swipe Gesture android

java - 使用快速搜索框进行动态 Android 搜索

java - 更改 Hadoop 作业的拆分数

java - 如何在录音时为语音留言设置定时器(与 WhatsApp 语音留言录音功能相同)?

android - 如何将项目传递给 ViewHolder?

android - 如何检测 Android 应用程序加载了哪些 native 共享库