# UnsupportedClassVersionError:



## ZAntjeZ (13. Dezember 2004)

Hallo, 

ich moechte waehrend meines Programmablaufs, eine neue Klasse ausfuehren. Dazu habe ich folgenden Quellcode:


```
File file=File.createTempFile("Jav",".java",new File(System.getProperty("user.dir")));

file.deleteOnExit();

String filename=file.getName();

String classname=filename.substring(0,filename.length()-5);

 

ausgabeDatei = new PrintWriter (new FileOutputStream(file));

ausgabeDatei.println(//HIER KOMMT DER TEXT DER KLASSE);                    ausgabeDatei.flush();

ausgabeDatei.close();

 

//Main javac= new Main();

 

String[] args =new String[]{"-d",System.getProperty("user.dir"),filename};

int status =Main.compile(args);

 

switch(status)

{

    case 0: 

     new File(file.getParent(),classname + ".class").deleteOnExit();

     try

     {

     Class clazz=Class.forName(classname);

     Method main =clazz.getMethod("main",new Class[]{String[].class});

     main.invoke(null,new Object[]{new String[0]}); 

     }catch(InvocationTargetException ex)

     {

     System.out.println("Exception in main "+ ex.getTargetException());

     ex.getTargetException().printStackTrace();

     }catch(Exception ex)

     {

     System.out.println(ex.toString());

     }

     break;

    case 1: System.out.println("Compile status: ERROR");break;

    case 2: System.out.println("Compile status: CMDERR");break;

    case 3: System.out.println("Compile status: SYSERR");break;

    case 4: System.out.println("Compile status: ABNORMAL");break;

    default: System.out.println("Compile status: Unknown exit status");

}
```

Beim ausfuehren kommt nun folgende Fehlermeldung:

"java.lang.UnsupportedClassVersionError: com/sun/tools/javac/Main (Unsupported major.minor version 49.0)"

Was stimmt da nicht?

Die compile()-Methode sollte ich laut Compiler statisch aufrufen, obwohl ich im Netz immer nur die nicht statische Variante gefunden habe.

Wer kann mir helfen?



tschau

Antje


----------



## Thomas Darimont (13. Dezember 2004)

Hallo!

Dieser Fehler passiert u.A. dann, wenn du versuchst eine Klasse innerhalb eines alten JRE's (z.Bsp. 1.3.1) auszuführen welche mittels eines neueren Java Compilers (1.4.2)  kompiliert wurde. Manchmal befinden sich noch alte Java Installationen in der $PATH Umgebungsvariable. (Z.Bsp. nach einer Oracle installation findet man das von Oracle mitgelieferte (alte) JRE (1.3.1) ganz vorne im Path, weshalb alle Anwendungen die nicht explizit eine andere Java Runtime angeben unter dem alten JRE laufen... diese Sache ist manchmal recht ärgerlich.)

Die Java Laufzeitugebung ist abwärts kompatibel sprich auf ihr kann man Klassen laufen lassen die mit einem älteren JDK kompiliert wurden. Neue Klassen aktzeptiert eine alte Runtime jedoch nicht so ohne weiteres ... es sei denn die "neuen Klassen" wurden mittels der target Option in für alte Laufzeitugebungen kompatiblen bytecode umgewandelt.

Gruß Tom


----------



## ZAntjeZ (13. Dezember 2004)

Ich habe die tool.jar von 1.5 genommen, der Interpreter war aber noch 1.4. Das habe ich nun geändert, aber jetzt gibts neue Fehler:
Die show()-Methode fuer einen Dialog ist jetzt deprecated, und meine Konsolenausgabe in einer JTextArea ist nun auch fehlerhaft: 



```
//Klasse zum Umleiten des StandardAusgabeStream 
   class MeinPrintStream extends PrintStream 
   { 
      public MeinPrintStream(JTextArea anzeige) 
      { 
         super(new MeinOutputStream(anzeige)); 
      } 
   } 
    
   class MeinOutputStream extends OutputStream 
   { 
      private JTextArea anzeigeText; 
       
      public MeinOutputStream(JTextArea anzeige) 
      { 
         this.anzeigeText=anzeige; 
      } 
       
      public void write(int b) 
      { 
         char c=(char)b; 
         anzeigeText.append(String.valueOf(c)); 
      } 
   }
```
 


Fehler: 

```
The return type is incompatible with Appendable.append(CharSequence), PrintStream.append(CharSequence), PrintStream.append(CharSequence)
```
 
Was muss ich hier nun ändern?


----------

