Frage

Dieses Stück Code Gegeben:

public static void writeFile(File file,List buffer)throws IOException{
    File fic = new File(file.getCanonicalPath());
    cat.debug("writing file : "+fic.getAbsolutePath());
    FileOutputStream out = new FileOutputStream(fic);
    PrintStream ps = new PrintStream(out);
    for(int i=0;i<buffer.size();i++){
        ps.println(buffer.get(i));
    }
    ps.flush();
    ps.close();
    out.close();
}

(bitte keine Ratschläge, wie Ströme sicher zu schließen, ist diese Legacy-Code und die neue Version macht Gebrauch von try / finally)

Ich erhalte eine Classcast im "ps.println (BUFFER.GET (i))"

Diese Methode wird aufgerufen, mehrmals (etwa 5 mal) mit einer Liste nur mit Strings gefüllt dann wird es mit einer Liste namens mit String und einem anderen Objekt gefüllt (sagen ErrorObject) An dem Punkt, wir die ersten ErrorObject erreichen, erhalten wir die Classcast.

com.mycompany.ErrorObject incompatible with java.lang.String

Dieses Problem tritt in der Produktionsumgebung, kann aber nicht in Dev-Umgebung wiedergegeben werden: Prod: JVM = IBM J9 VM 2.4 J2RE 1.6.0 IBM AIX 2.4 J9 ppc-32 jvmap3260-20081105_25433 (JIT aktiviert, AOT aktiviert) Dev: WinXP, JDK 1.6.0_16

Gibt es einen Grund dieser Code könnte scheitern?

Es wurde vor kurzem geflickt, ich fürchte, dass das Produktionsteam das Glas richtig nicht aktualisieren, aber mein Chef bereits überprüft, dass der Patch Correclty angewandt wurde ...

Ich frage mich, ob die Just in Time Compiler könnte "Draht" die ps.println zum ps.println (String) anstelle der ps.println (Object).  Das könnte erklären, ein solches Problem, aber ich habe keine Ahnung, ob dies möglich.

Jede Ratschläge gern gesehen, danke im Voraus

EDIT: Ich war voller Stack-Trace frage so ist es hier:

java.lang.ClassCastException: com.mycompany.util.ErrorObject incompatible with java.lang.String
    at com.mycompany.util.FileUtils.writeFile(FileUtils.java:91)
    at com.mycompany.util.FileUtils.writeFile(FileUtils.java:50)
    at com.mycompany.itools.task.DBCompareInits.doDBTask(DBCompareInits.java:959)
    at com.mycompany.itools.task.DBTask.doTask(DBTask.java:115)
    at com.mycompany.itools.task.TaskGroup.startGroup(TaskGroup.java:115)
    at com.mycompany.runner.Runner.main(Runner.java:209)

EDIT 2: javap -c

   65:  invokeinterface #20,  1; //InterfaceMethod java/util/List.size:()I
   70:  if_icmpge   92
   73:  aload   4
   75:  aload_1
   76:  iload   5
   78:  invokeinterface #21,  2; //InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
   83:  invokevirtual   #31; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V
   86:  iinc    5, 1
   89:  goto    62
   92:  aload   4
   94:  invokevirtual   #32; //Method java/io/PrintStream.flush:()V
   97:  aload   4
   99:  invokevirtual   #33; //Method java/io/PrintStream.close:()V
   102: aload_3
   103: invokevirtual   #28; //Method java/io/FileOutputStream.close:()V
War es hilfreich?

Lösung

  

Ich frage mich, ob die Just in Time Compiler könnte "Draht" die ps.println zum ps.println (String) anstelle der ps.println (Object). Das könnte erklären, ein solches Problem, aber ich habe keine Ahnung, ob dies möglich.

Es ist nicht möglich. Oder zumindest nicht, es sei denn es gibt einen Bytecode-Compiler oder JIT-Compiler-Fehler. Und Sie sollten nur Compiler-Fehler verantwortlich machen, wenn Sie unwiderlegbare Beweise haben, dass dies so ist.

Allerdings ist die erste Sache, die ich überprüfen würde, ist, dass der Code tatsächlich ausgeführt wird, aus dem Quellcode kompiliert wurde, die Sie zu suchen. Eine Möglichkeit, dies zu bestätigen, wäre von der Quelle neu zu kompilieren, und vergleichen Sie dann die Ergebnisse der javap auf entsprechenden Kopien der Klasse ausgeführt wird. an den Bytecode der Suche wird Ihnen auch sagen, welche Überlastung von println der Bytecode-Compiler zu verwenden, sagt.

Bearbeiten - die javap Ausgabe zeigt deutlich, dass die Version des Bytecode sollte println(Object) nennen, und es gibt keine checkcast Opcode in Sicht. Ein JIT-Compiler Fehler, der die falsche Methode ruft und spontan fügt Code ein classcast zu tun ist, mehr und mehr unglaubwürdig klingen.

Andere Tipps

Deklarieren toString () -Methode mit innen in ErrorObject Klasse String konvertieren und fügt + "" zu () -Aufruf println. Wie pintln (errorObjList + "");

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top