2016-05-22 3 views
0

Ich habe 2 Arraylisten innerhalb einer Anordnung angeordnet, wie folgt:Arraylisten und Arrays

public Object[] loopthrougharrays() { 
    Object[] tables = new Object[2]; 
    tables[0] = list; 
    tables[1] = listB15; 
    return tables; 
} 

My 2 Arraylisten sind list und listB15 genannt.

dann kann ich meine Arraylisten aus einer anderen Methode aufrufen, wie

loopthrougharrays()[1] = new ArrayList(); 

die listB15 ist.

Allerdings, wenn ich versuche, ein Element in die ArrayList wie

loopthrougharrays()[1].add(s) 

hinzufügen wo s ist eine Variable

Java nicht die loopthrougharrays()[1] als ArrayList erkennen.

Wie kann ich die Variable über diese Methode hinzufügen?

erscheinen ich die folgende Fehlermeldung zu erhalten:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 

Mein ganzer Code funktioniert gut, wenn ich folgendes tun:

listB15 = new ArrayList(); 
listB15.add(s) 

wie ich erwarten würde.

+2

Sie haben, ist eine Reihe von 'Object', wie soll der Compiler wissen, welche Instanzen es enthält? Und btw: Sie erhalten die NPE, weil 'loopthroughharrays()' ein neues Array erstellt und das Ihre loopthroughharrays() [1] = new ArrayList(); 'Anweisung nicht interessiert. – Tom

+0

tl; dr: mache 'tables' eine' ArrayList [] '(oder besser noch eine' List [] '). – Turing85

Antwort

2

Das Problem ist, dass Sie Zuweisungen auf Verfahren tun Anrufe. Sie rufen die Methode zweimal auf. so die zweite Zeile erzeugt eine weitere Array-Liste

loopthrougharrays()[1] = new ArrayList(); 
loopthrougharrays()[1].add(s) //This one will call the method again 
// and get new array list and the previous value is lost 

Einfach fix

Object[] getTwoArrays = loopthrougharrays() 
ArrayList L0 = <ArrayList> getTwoArrays[0]; 
ArrayList L1 = <ArrayList> getTwoArrays[1]; 

L1 = new ArrayList(); 
L1.add(s); 

Hier werden die loopthrougharrays() aufgerufen einmal und der Rückgabewert wird in eine lokale Referenz gespeichert und dann funktioniert es

Während ich versuche, eine schnelle Lösung zur Verfügung gestellt, würde ich nicht Null Arraylits in einem Objekt-Array zurückgeben und dann außerhalb der Methode initiieren und Zuweisungen tun. es ist ungeschickt.

Eine kleinere Übel Weg

class SomeX { 
    private List Ll = new ArrayList(); 
    private List L2 = new ArrayList(); 
    public addToL1(Object s) { 
     L1.add(s); 
    } 
    public addToL2(Object s) { 
     L2.add(s) 
    } 
} 

//main method 
SomeX x = new SomeX(); 
x.addToL1(s); 
x.addToL2(s); 
+0

Ich habe gelernt, deinen weniger bösen Weg zu benutzen, viel besser! – Ingram

0

Wirf es, bevor du etwas zu deiner Liste hinzufügst.

((ArrayList<YourVariableType>)(loopthrougharrays()[1])).add(s); 

Aber denken Sie daran, dies ist keine gute Praxis. Ich bin mir ziemlich sicher, dass Sie mit einem besseren Design und Best Practices erreichen können, was Sie erreichen wollen.

1

Ich weiß nicht, was Sie damit tun wollen, aber es ist keine gute Praxis. Allerdings könnte es funktionieren, wenn Sie an einem Arraylist Ihr Objekt Array-Element gegossen wie:

((ArrayList)t.loopthrougharrays()[1]).add(s); 

Und loopthrougharrays()[1] = new ArrayList(); löschen (wie @ Tom Kommentar sagt, danke) oder ersetzen Sie es durch

ArrayList myNewArrayList = (ArrayList)loopthrougharrays()[1]; 
myNewArrayList.add(s); 
0

Ihre Tabellen ist ein Array von Objekten,

tables[1] = listB15; // Tabellen bleibt noch als array of object und listB15 gilt als ein Objekt seit Object is the Super class.

Gew Um das zu erreichen u wollen Sie diese Methoden versuchen:

  1. ((List<String>) tables[1]).add("hello world"); // cast it with List<String> (for example)

  2. erstellen Sie eine Liste

    List<List<String>> tables = new ArrayList<List<String>>(); 
    
        tables1.add(list) ; 
        tables1.add(listB15) ; 
    
        tables1.get(1).add("hello world"); 
        System.out.println(tables);