Compiler-Fehler unreported exception java.lang.Exception; must be caught or declared to be thrown

aurel

Mitglied
Hallo,

Ich bin relativ neu zu Java und habe folgendes Szenario:
Aus einer Methode myMethod1 soll gewartet werden (durch Timer). Nach einer gewissen Zeit soll Methode2 aufgerufen werden.
In beiden Methoden sollen Exceptions gefangen werden.

JavaCode siehe unten. Bekomme folgenden Kompilierfehler:
myfile.java:11: unreported exception java.lang.Exception; must be caught or declared to be thrown. Also bei Zeile myMethod2();

Ich habe das Problem ungefähr verstanden: Timer erzeugt einen neuen Thread der keine Exceptions fangen kann etc.
Ich habe mir schon einiges über Exceptions, catch/try/finally/throws usw durchgelesen aber komme irgendwie nicht weiter.
Alternativ wollte ich es mit wait() lösen (im Code als Kommentar), das wait() bringt andere Probleme mit sich (observer, lock etc). Kann mir jemand helfen, wie das richtig heißen müsste? Alternativen?

Vielen Dank.


Java:
public void myMethod1() throws Exception
{
	try 
	{					
		......
		timer = new Timer();
		TimerTask task = new TimerTask() 
		{
			public void run()
			{
				myMethod2();
			}
		};
		//~ this.wait(delay);
		//~ myMethod2();
		timer.schedule(task, 0, delay);
		.....	
	}
	catch (Exception e) 
	{
		System.out.println( "Something...");
	}
}
public void myMethod2() throws Exception
{
	try 
	{	
		System.out.println("This will give an unreported exception");	
	}
		catch (Exception e) 
	{
		System.out.println( "Something...");
	}
}
 
Du schreibst dass deine Methode myMethod2() eine Exception wirft (throws Exception).
Im Timer musst du die Exception dann verarbeiten:

Java:
    public void run() {
    	try {
    		myMethod2();
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    }
 
Zuletzt bearbeitet von einem Moderator:
Er wirft in Methode2 keine Exception höher, sondern fängt sie auf. Auf jeden Fall scheint es mir eher so, als ob der Sinn von "throws" nicht verstanden wurde.

Laut der Beschreibung müsste man das "throws Exception" bei der zweiten Methode löschen. (Wobei es bei der 1. Methode auch keinen Sinn macht).

Java:
public void myMethod2() {
    try 
    {   
        System.out.println("This will give an unreported exception");   
    }
        catch (Exception e) 
    {
        System.out.println( "Something...");
    }
}
 
Zuletzt bearbeitet:
Danke erstmal für die Vorschläge.

Der erste Lösungsvorschlag "Im Timer musst du die Exception dann verarbeiten oder weiterwerfen" funktioniert nicht. Man bekommt
Rendition.java:277: illegal start of type try
Rendition.java:277: ';' expected

Laut dem was ich gelesen habe, kann man keine Exceptions im Timer (TimerTask imlements Runnable) verarbeiten.

Zweiter Vorschlag:
Das die Exceptions nicht ganz sauber sind weiss ich. Ich will es erstmal zum kompilieren bringen :shock:
Wenn man throws Exception von Methode2 rausnimmt, hat man mehr Fehler:
Rendition.java:279: unreported exception java.lang.Exception; must be caught or declared to be thrown
getRendition();
^
Rendition.java:320: unreported exception java.net.URISyntaxException; must be caught or declared to be thrown
httpcall = getRenditionURL.toURI();
^
Rendition.java:324: unreported exception java.io.IOException; must be caught or declared to be thrown
response = httpclient.execute(httpget);
^
Rendition.java:340: unreported exception java.io.IOException; must be caught or declared to be thrown
resEntityAsString = EntityUtils.toString(resEntity);




Bis jetzt funktioniert Thread.sleep(millis) gut. Ich würde trotzdem gerne wissen wie man das mit dem Timer lösen kann, falls jemand noch eine Idee hat..

Vielen Dank.
 
Der erste Lösungsvorschlag "Im Timer musst du die Exception dann verarbeiten oder weiterwerfen" funktioniert nicht. Man bekommt
Rendition.java:277: illegal start of type try
Rendition.java:277: ';' expected

Laut dem was ich gelesen habe, kann man keine Exceptions im Timer (TimerTask imlements Runnable) verarbeiten.
Doch, das funktioniert:

Java:
public class Main {
	public static void main(String[] args) {
		Timer timer = new Timer();
		TimerTask task = new TimerTask() {
			public void run() {
				try {
					myMethod2();
					System.out.println("This will never happen...");
				} catch (Exception e) {
					System.out.println("Exception caught: " + e);
				}
				System.out.println("Task completed");
			}
		};
		timer.schedule(task, 0, 1000);
	}

	public static void myMethod2() throws Exception {
		System.out.println("Test");

		throw new IllegalStateException("Buuuuhhhh");
	}
}

EDIT:
Weiterreichen kannst du die halt natürlich nicht, wer soll die auch behandeln?
 
Zuletzt bearbeitet von einem Moderator:
Das kannst du selbst erledigen (wenn du deine Anmeldung abgeschlossen hättest -> hab ich für dich gemacht), dafür gibt es einen Button linksseitig unterhalb dieses Theads.
 

Zurück
Oben