unhandled exception type IOException

Joerg66

Erfahrenes Mitglied
Hallo,

ich möchte aus u.g. java Programm ein anderes Programm aufrufen und bis zu dessen Beendigung warten. Doch leider bekomme ich bei den Zeilen
Java:
Process dnc = rt.exec( "d:\\program files (x86)\\DNC\\BIN\\Dncver.exe download " + Programmnummertext.getText() + " " + datei + " 1 1" );
dnc.waitFor();
den in der Titelzeile genannten Fehler. Genauer zeigt mir Eclipse folgendes an:

Code:
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	Unhandled exception type IOException
	Unhandled exception type InterruptedException

	at TVManager.TV.<init>(TV.java:73)
	at TVManager.TV.main(TV.java:84)


Kann mir jemand anfängerkonform erklären was ich wo ändern muß, damit das läuft.

Java:
package TVManager;

import java.io.*;

import org.eclipse.swt.SWT;

import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class TV {
	private static Display display;
	public Shell shell;
	private static Label Programmnummerlabel;
	private static Text Programmnummertext;
	private static Label extensionlabel;
	private String datei;
		
	public TV()throws IOException{
		display = new Display ();
		shell = new Shell (display);
		shell.setLayout (new FillLayout ());
		Programmnummerlabel = new Label(shell, SWT.FLAT);
		Programmnummertext = new Text (shell, SWT.SINGLE | SWT.BORDER);
		extensionlabel = new Label(shell, SWT.FLAT);
		Button OKbtn = new Button(shell, SWT.PUSH);
		
		GridLayout anzeigegroupLayout = new GridLayout ();
		anzeigegroupLayout.numColumns = 3;
		anzeigegroupLayout.makeColumnsEqualWidth = true;
		shell.setLayout(anzeigegroupLayout);
		GridData anzeigegroupdata = new GridData ();
		anzeigegroupdata.horizontalAlignment = GridData.FILL;
		anzeigegroupdata.verticalAlignment = GridData.FILL;
		shell.setLayoutData (anzeigegroupdata);

		Programmnummerlabel.setText("Programmkopf: ");
		GridData Programmnummerlabeldata = new GridData ();
		Programmnummerlabeldata.verticalAlignment = GridData.BEGINNING;
		Programmnummerlabeldata.horizontalAlignment = GridData.BEGINNING;
		Programmnummerlabel.setLayoutData (Programmnummerlabeldata);
		
		Programmnummertext.setText("");
		GridData Programmnummertextdata = new GridData ();
		Programmnummertextdata.verticalAlignment = GridData.BEGINNING;
		Programmnummertextdata.horizontalAlignment = GridData.END;
		Programmnummertext.setLayoutData (Programmnummertextdata);

		extensionlabel.setText(" _000.CAD");
		GridData extensionlabeldata = new GridData ();
		extensionlabeldata.verticalAlignment = GridData.BEGINNING;
		extensionlabeldata.horizontalAlignment = GridData.BEGINNING;
		extensionlabel.setLayoutData (extensionlabeldata);
		
		OKbtn.setText("Ansehen");
		GridData OKbtndata = new GridData ();
		OKbtndata.horizontalSpan = 3;
		OKbtndata.horizontalAlignment = GridData.CENTER;
		OKbtn.setLayoutData (OKbtndata);
	     OKbtn.addSelectionListener(new SelectionAdapter(){
	            public void widgetSelected(SelectionEvent e){
	            	datei = Programmnummertext.getText()+"_000.CAD";
	            	Runtime rt =Runtime.getRuntime();
					Process dnc = rt.exec( "d:\\program files (x86)\\DNC\\BIN\\Dncver.exe download " + Programmnummertext.getText() + " " + datei + " 1 1" );
					dnc.waitFor();
					
					    MessageBox Sbox = new MessageBox(shell, SWT.OK | SWT.ICON_WARNING);
	           	 		Sbox.setText("Achtung");
	           	 		Sbox.setMessage("und weiter");
	           	 		Sbox.open();
	            }
	     });
	}

	public static void main(String[] args)throws IOException{
		TV elements = new TV();
		elements.mainLoop(500,500);
	}
	
	public void mainLoop(int hSize, int vSize)throws IOException{
		shell.setSize( hSize, vSize);
		shell.setText("Blablabla");
		shell.pack ();
		shell.open ();
		while (!shell.isDisposed ()) {
			if (!display.readAndDispatch ())
				display.sleep ();
		}
		display.dispose ();
	}
}
 
Zuletzt bearbeitet:
1) Fehlermeldungen egal welcher Art sollte man immer in [code][/code]-Tags in den Post schreiben.
2) Zu 1) gilt weiterhin : KOMMPLETTE Fehlermeldung. Also MIT Stacktrace.
3) WANN bekommst du den Fehler ? Compiling oder Runtime ?
4) Für Java-Source bitte [code=java][/code] verwenden und nicht nur [code][/code].
5) Es gibt einen EDIT Button. Falls du also auf dei Idee kommen solltest den Source NOCHMAL zu posten musst du mit Löschung rechnen.
 
So, habe ich geändert, sorry, so oft schreibe ich hier nicht.
Zu Punkt 3 habe ich die Komplette Ausgabe von Eclipse dran gehängt, ich hoffe Du meinst das, denn was ein stacktrace ist weiß ich nicht.
Und wenn java /java gefordert ist, wäre es ja nicht schlecht, wenn der editor das anbieten würde, statt nur html, code und php.
 
Zuletzt bearbeitet:
Dieser Compiler-Fehler tritt auf, weil du eine Methode benutzt, deren Autor markiert hat, dass sie mit großer Wahrscheinlichkeit eine Exception wirft. Der Methodenkopf sieht dann so aus:
Java:
public Process exec(String command) throws IOException {
...
Dieses '.. throws XXXException' führt dazu, dass der Compiler überprüft, ob du diese Exception mit einem try-catch-Block abfängst. Das hast du offensichtlich nicht getan.

Siehe auch http://openbook.galileocomputing.de/javainsel9/javainsel_06_001.htm und http://download.oracle.com/javase/tutorial/essential/exceptions/index.html
 
Danke für die Antwort. In den Beispielen, die ich dazu gefunden hatte, stand auch im Funktions-Beginn das throws IOException -wie bei mir, ich dachte dann brauche ich den try-catch Block nicht. Mit dem Block läuft das Programm dann zwar durch, wartet aber nicht auf die Beendigung des aufgerufenen Programms dncver.exe. Also die Zeile:
Java:
dnc.waitFor();
wird dann ignoriert.
 
Was ein StackTrace ist :
Wenn du eine Exception in einem try-catch-Block fängst kannst du mittelst Exception.printStackTrace() dir den kompletten Stack ausgeben lassen der zu diesem Fehler geführt hat. Also nicht nur die Fehlermeldung selbst sondern auch der gesamte Block WARUM dieser Fehler aufgetreten ist und WER schlussendlich daran schuld ist.
Das sind dann diese kilometerlangen Fehlermeldungen die du sicherlich schon mal gesehen hast.

Dessweiteren bekommst du da garkeine Exception
Da steht deutlich : java.lang.Error
Und laut Doc soll man nicht versuchen einen Error zu fangen da diese speziell dafür gedacht sind die VM zum absturz zu bringen. Error entstehen in der Regel wenn ein schwerwiegender kritischer Fehler in der VM auftritt. Stell dir das als UNerwarteter Fehler vor. Exceptions hingegen sollte man immer abfangen und auswerten da Exceptions dafür gedacht sind Fehler bewusst melden zu können. Man könnte hier auch grob von einem erwarteten Fehler sprechen.

Was genau ruft den Fehler hervor :

Nun .. du hast zwar ein throws Exception gesetzt ... aber nur in die äußere Klasse. Der Aufruf von Runtime.exec() erfolgt aber in einer inneren anonymen Klasse. Da das äußere throws hier nicht gilt musst du alles was eine Exception werfen kann in einen try-catch-Block packen. Das ganze Thema Exceptionhandling und anonnymous-inner classes ist sowieso ganz schön tricky. Warum du trotzdem diese Meldung bekommst : die innere Klasse wird *da es ein Listener ist* vermutlich im EDT verarbeitet. Dieser hat zwar ein wenig Exceptionhandling drin ... aber auf eine IOException ist er nicht gefasst und wirft desshalb diesen Error da es vermutlich zu einem crash im EDT kommt und daher die VM beendet werden MUSS.
 
Das ist ja ein UnresolvedCompilationError, dieser tritt auf, weil der Code Fehler enthält, so dass der Compiler seine Arbeit verweigert. Der Grund dafür ist, dass die Exception nicht abgefangen wird.
@SpiKEe: es geht hier nicht darum, einen Error abzufangen, sondern einen Fehler im Code zu beheben, der diesen Compiler-Error verursacht. Es geht auch nicht um den EDT (Event-Dispatch-Thread), wie gesagt, der Error tritt beim compilieren auf.
 
Hallo,
nochmal vielen Dank euch beiden.
Ich habe den wichtigen Teil jetzt nochmal so geändert:
Java:
public void widgetSelected(SelectionEvent e){
   datei = Programmnummertext.getText()+"_000.CAD";
   Runtime rt =Runtime.getRuntime();
   Process dnc = null;
   try {
	dnc = rt.exec( "d:\\program files (x86)\\DNC\\BIN\\Dncver.exe download " + Programmnummertext.getText() + " " + datei + " 1 1" );
} catch (IOException e1) {
   e1.printStackTrace();
}
try {
   dnc.waitFor();
} catch (InterruptedException e1) {
   e1.printStackTrace();
}
}

Jetzt läuft das Programm durch, ohne Fehler, aber wartet eben nicht. Muß ich jetzt also herausfinden, warum das waitFor nicht funktioniert, richtig?
 
Das ist ja ein UnresolvedCompilationError, dieser tritt auf, weil der Code Fehler enthält, so dass der Compiler seine Arbeit verweigert. Der Grund dafür ist, dass die Exception nicht abgefangen wird.
@SpiKEe: es geht hier nicht darum, einen Error abzufangen, sondern einen Fehler im Code zu beheben, der diesen Compiler-Error verursacht. Es geht auch nicht um den EDT (Event-Dispatch-Thread), wie gesagt, der Error tritt beim compilieren auf.

Gut ... womit wir wieder beim Thema wären das ich keine IDE's verwende und TO nicht gesagt hat ob "das Problem"zur compiletime oder während der runtime auftritt. Wenn J/Eclipse meint sich "java-typisch" mit irgendwelchen zusammengesetzen Fehlermeldungen auszudrücken versucht dann braucht man sich nicht wundern das diejenigen die das halt nicht gewohnt sind aus der eigentlich Fehlermeldung sowas herrauslesen wie ich.
 
@SpiKEe:
Deswegen benutze ich ne IDE. Allerdings ist es vor allem für Anfänger wichtig, dass sie auch mal ohne IDE gearbeitet haben. Sonst kommt so etwas wie ich neulich an der Uni gehört hab:
"Was muss ich in dieses Feld rein schreiben"
Darauf hab ich den Fragesteller gefragt, welches Feld er meint. Nach langem rätseln kam ich dann darauf, dass er das Editor-Fenster meint.

@Joerg66:
Schau dir mal deinen Code an, du greifst im 2. try-Block auf das Objekt 'dnc' zu, das von dort gar nicht sichtbar ist! lokale Variablen sind nur im erzeugten Block und den untergeordneten Blöcken sichtbar!
Eigentlich müsste dein Programm hier auch wieder einen Fehler raushauen, und zwar so etwas:
Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem:
dnc cannot be resolved to a variable
Wenn nein, dann wird diese Methode niemals aufgerufen.
 

Neue Beiträge

Zurück