Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Java: "Exception must be caught or declared to be thrown"
Autor
Universität/Hochschule J Java: "Exception must be caught or declared to be thrown"
curious_mind
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 10.11.2012
Mitteilungen: 482
  Themenstart: 2021-04-18

Hallo, wo ist hier das Problem? \sourceon Java package KE2; public class Wochentag { private int tag; public Wochentag() { tag = 0; } public void setTag(int i) throws KeinTagException { if ((0 <= i)&&(i<=6)) tag = i; else throw new KeinTagException(); } public int getTag() { return tag; } public void naechsterTag(){ tag = (tag+1) % 7; } public void vorhergehenderTag(){ if (tag == 0) tag = 6; else tag--; } public String toString(){ switch(tag) { case 0: return "Montag"; case 1: return "Dienstag"; case 2: return "Mittwoch"; case 3: return "Donnerstag"; case 4: return "Freitag"; case 5: return "Samstag"; case 6: return "Sonntag"; default: return "ERROR"; } // end switch } // end toString } // end Wochentag class KeinTagException extends Exception{} class Main{ public static void main(String[] args){ System.out.println("Starte Programm..."); Wochentag w = new Wochentag(); w.setTag(2); } } \sourceoff Fehlermeldung lautet: \quoteon ...\src\KE2\Wochentag.java:52:17 java: unreported exception KE2.KeinTagException; must be caught or declared to be thrown \quoteoff


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 2932
  Beitrag No.1, eingetragen 2021-04-18

\quoteon(2021-04-18 11:05 - curious_mind im Themenstart) wo ist hier das Problem? \quoteoff Die Meldung sagt doch schon alles: \quoteon(2021-04-18 11:05 - curious_mind im Themenstart) ...\src\KE2\Wochentag.java:52:17 java: unreported exception KE2.KeinTagException; must be caught or declared to be thrown \quoteoff In Zeile 52 verwendest du setTag und diese Methode kann eine KeinTagException werfen, um die du dich kümmern musst. Du musst sie also entweder durch ein try/catch fangen oder du musst deklarieren, dass deine main-Methode diese Exception werfen kann. --zippy


   Profil
curious_mind
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 10.11.2012
Mitteilungen: 482
  Beitrag No.2, vom Themenstarter, eingetragen 2021-04-18

Ich hab doch schon in der setTag Methode die if-else, wo sie ggf. geschmissen wird. Verstehe ich nicht. Edit: Ich hab's. \sourceon Java class Main{ public static void main(String[] args){ System.out.println("Starte Programm..."); Wochentag w = new Wochentag(); try { w.setTag(2); } catch (KeinTagException e) { System.out.println("Error"); } } \sourceoff Dann hätte es aber eigentlich mehr Sinn gemacht, gleich in der setTag Methode dieses try-catch Gefüge, statt der if-else zu nutzen, oder? Kurze Frage noch zu den Klassen: Ist wichtig, wo die "class [Ausnahme] extends Exception" hier steht, also ob in oder außerhalb von class Wochentag?


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 2932
  Beitrag No.3, eingetragen 2021-04-18

\quoteon(2021-04-18 15:25 - curious_mind in Beitrag No. 2) Verstehe ich nicht. \quoteoff Was verstehst du nicht?


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 2932
  Beitrag No.4, eingetragen 2021-04-18

\quoteon(2021-04-18 15:25 - curious_mind in Beitrag No. 2) Dann hätte es aber eigentlich mehr Sinn gemacht, gleich in der setTag Methode dieses try-catch Gefüge, statt der if-else zu nutzen, oder? \quoteoff Ich verstehe überhaupt nicht, worin der Sinn einer deklarierten Exception in setTag besteht. Hätte nicht eine RuntimeException wie die IllegalArgumentExcception genügt?


   Profil
curious_mind
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 10.11.2012
Mitteilungen: 482
  Beitrag No.5, vom Themenstarter, eingetragen 2021-04-18

Das Code-Beispiel ist zum Lernen und war so in der Literatur vorgegeben. Ich habe nur die class Main selbst geschrieben, weil ich es mal testen wollte.


   Profil
curious_mind
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 10.11.2012
Mitteilungen: 482
  Beitrag No.6, vom Themenstarter, eingetragen 2021-04-19

Kurze Frage noch zu den Klassen: Ist wichtig, wo die "class [Ausnahme] extends Exception" hier steht, also ob in oder außerhalb von class Wochentag?


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 2932
  Beitrag No.7, eingetragen 2021-04-19

\quoteon(2021-04-19 10:21 - curious_mind in Beitrag No. 6) Ist wichtig, wo die "class [Ausnahme] extends Exception" hier steht, also ob in oder außerhalb von class Wochentag? \quoteoff Du könntest die Exception auch zu einer statischen Klasse innerhalb von Wochentag machen. In der main-Methode würdest du dich dann auf diese Exception über Wochentag.KeinTagException beziehen.


   Profil
Bilbo
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 03.01.2005
Mitteilungen: 2030
  Beitrag No.8, eingetragen 2021-04-19

Hallo curious_mind, wenn die KeinTagException innerhalb der Klasse Wochentag definiert würde, könntest Du jedenfalls beim Abfangen der Exception in der Klasse Main nicht einfach so darauf zugreifen, wie Du es jetzt tust. Es müsste dann heißen: \sourceon Java try{ w.setTag(2) } catch (Wochentag.KeinTagException e) { System.out.println("Error"); } \sourceoff Davon abgesehen, geht in diesem Fall beides. \quoteon Dann hätte es aber eigentlich mehr Sinn gemacht, gleich in der setTag Methode dieses try-catch Gefüge, statt der if-else zu nutzen, oder? \quoteoff Nein, dort kannst Du noch kein "try-catch" verwenden, weil an dieser Stelle ja die Exception erst erzeugt wird. Dagegen dient "try-catch" dazu, eine Exception, die irgendwo anders (d.h. in einer aufgerufenen Funktion) erzeugt wurde, abzufangen. Das sind zwei unterschiedliche Dinge. Viele Grüße Thorsten [Die Antwort wurde nach Beitrag No.6 begonnen.]


   Profil
curious_mind
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 10.11.2012
Mitteilungen: 482
  Beitrag No.9, vom Themenstarter, eingetragen 2021-04-19

Aaaaaaaaah! Ok, danke sehr! Dann noch eine kurze Rückfrage an Euch: Ich habe jetzt in der Main class noch etwas herumgespielt und festgestellt, dass im Code \sourceon Java public static void main(String[] args){ System.out.println("Starte Programm..."); Wochentag m = new Wochentag(); try { m.setTag(0); System.out.println(m.toString()); m.vorhergehenderTag(); System.out.println("Tag davor..."); System.out.println(m.toString()); <--- System.out.println(m); <--- } catch (KeinTagException e) { System.out.println("Error"); } \sourceoff ...beide markierten (<---) Zeilen dasselbe liefern. Das wird irgendeine implizite Umwandlung sein, oder? Ansonsten frage ich mich nämlich, woher er beim "Objekt m" (zweite markierte Zeile) weiß, was da auszudrucken ist.


   Profil
Bilbo
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 03.01.2005
Mitteilungen: 2030
  Beitrag No.10, eingetragen 2021-04-19

Richtig, die Funktion println(Object obj) ruft intern bereits obj.toString() auf, um die Darstellung für die Ausgabe zu ermitteln.


   Profil
curious_mind
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 10.11.2012
Mitteilungen: 482
  Beitrag No.11, vom Themenstarter, eingetragen 2021-04-19

ok, danke :)


   Profil
curious_mind hat die Antworten auf ihre/seine Frage gesehen.
curious_mind hat selbst das Ok-Häkchen gesetzt.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]