2017-11-27 5 views
-2

Hat mir dabei die Haare gerissen! Es gibt zwei Daten in einer Textdatei. Ich versuchte, sie zurückzuholen, aber ich unten Fehlerjava.util.ArrayList kann nicht in [Ljava.lang.Object umgewandelt werden

########## Error with java.lang.ClassCastException: java.util.ArrayList cannot be cast to [Ljava.lang.Object; ########## 
Size 1 

-Code

try { 
     File file = new File(filePath + "ABC.txt"); 
     BufferedReader br = new BufferedReader(new FileReader(file)); 
     String st; 
     List list = new ArrayList(); 

     try { 
      while ((st = br.readLine()) != null) { 
       String id = st.substring(92, 100); 
       try { 
        list.add(getDetail(id)); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       for (Object[] o : (List<Object[]>) list) { 
        Details x = new Details(); 
        x.setType(o[0].toString()); 
        .... 
       } 
      } 

      br.close(); 

     } catch (Exception ex) { 
      logger.printError(Reader.class, "Error with " + ex); 
     } 
     logger.printInfo(Reader.class, "Size " + list.size()); 

    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 

Abfrage

public List getDetail(int id){ 
     StringBuilder bf = new StringBuilder(); 
     bf.append("SELECT "); 
     bf.append("'ABC', "); 
       .... 
     return em.createQuery(bf.toString()) .getResultList(); 
    } 

bei hier für mehr als 1 Stunde stucked worden. Jede Hilfe oder Beratung wäre sehr willkommen.

+2

Nun ja, Sie versuchen, eine 'list' zu einem' Object [] 'zu werfen. Das wird nicht funktionieren - es ist nicht klar, warum Sie erwartet haben, dass es funktioniert. Um es anders auszudrücken - wenn man den gesamten * äußeren * Listenteil ignoriert, versucht man etwas wie "Objekt [] o = (Objekt []) getDetail (id);" zu schreiben. Würdest du erwarten, dass * das * funktioniert? (Es ist auch sehr unklar, warum Sie bei jeder Iteration Ihrer While-Schleife über die Liste iterieren ...) –

+0

@JonSkeet Wie kann ich das lösen? – Tony

+1

Sie haben uns nicht gesagt, was Sie vorhaben, also können wir Ihnen nicht sagen, wie wir es lösen sollen - wir können Ihnen nur sagen, warum Sie das Problem bekommen, das Sie bekommen. (Sie haben uns nicht gezeigt, wie Sie versuchen, "o" innerhalb Ihrer Schleife zu verwenden.) –

Antwort

0

Dieses Problem scheint zu sein, bezogen auf Query API.

SO hier, ich würde vorschlagen, wie

public List<Object[]> getDetail(int id){ 
     StringBuilder bf = new StringBuilder(); 
     bf.append("SELECT "); 
     bf.append("'ABC', "); 
       .... 
     return em.createQuery(bf.toString()) .getResultList(); -- getResultList returns List. 
    } 

zu verwenden und dann

List<Object[]> list=new Arraylist<Object[]>(); 
..... 
list.addAll(getDetail(id)); -- as we are adding collection here. 

statt

list.add(getDetail(id)); 

in Original-Code.

Für weitere Informationen können Sie vorhandene siehe SO post

+0

keine passende Methode gefunden für add (Liste ) Methode Collection.add (Objekt []) ist nicht anwendbar (Argument nicht übereinstimmend; Liste kann nicht in Objekt []) konvertiert werden Methode List.add (Object []) ist nicht anwendbar (Argument nicht übereinstimmend; Liste kann nicht in Objekt []) konvertiert werden ---- – Tony

+0

@Tony modifizierter Code, bitte überprüfen. –

+0

Ich werde Liste mit Größen 3 bekommen. Die erste und zweite sind doppelt – Tony

1

Verwendung generic types:

 List<Details> list = new ArrayList<>(); 

     try { 
      while ((st = br.readLine()) != null) { 
       String id = st.substring(92, 100); 
       try { 
        list.addAll(getDetail(id)); // add all results 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 

      br.close(); 

     } catch (Exception ex) { 
      logger.printError(Reader.class, "Error with " + ex); 
     } 

Ihre getDetail Methode Zeilen zurückgeben sollte zur Liste Einzelheiten umgewandelt

public List<Details> getDetail(int id){ 
    // prepare your query 
    StringBuilder bf = new StringBuilder(); 
    bf.append("SELECT "); 
    bf.append("'ABC', "); 

    // iterate over search results and convert each row into Details 
    List<Details> results = new ArrayList<>(); 
    ResultSet rs = stmt.executeQuery(bf.toString()); 
    while (rs.next()) { 
     results.add(toDetails(rs)); // convrt single row to Details model 
    } 
    return results; 
} 

Einzel konvertieren result row-Details:

private Details toDetails(ResultSet rs){ 
    Details x = new Details(); 
    x.setType(rs.getString(0)); 
    ... 
    return x; 
} 
+0

inkompatible Typen: Liste kann nicht in Object [] in getDetail-Methode konvertiert werden – Tony

+0

@Tony: Daher" eine Konvertierung hier, wenn erforderlich". –

+0

@JonSkeet Wie konvertiert man? – Tony

Verwandte Themen