Javabibliothek

Status
Nicht offen für weitere Antworten.

janta66

Mitglied
Hallo,

habe ich das richtig verstanden?

Wenn ich eine exception durch "DIE KLASSE" IOException
handeln lassen will, so muss ich zunächst durch die imoprt-Anweisung
"DAS PACKET" java.io importieren?

Ich meine sehe ich es richtig, dass IOException eine Klasse
ist und sich diese Klasse in dem Packet java.io befindet oder
bringe ich da etwas durcheinander?

Das Prog., das ich dazu aus Übungszwecken untersuche ist dieses:


Pcket_Class.JPG


Gruss und Danke
Jan
 

Maximum

Aktives Mitglied
Ja es ist genau so, wie du es beschreibst.

die IOException Klasse liegt in java.io und nicht in java.lang, daher musst du entweder das Package (java.io.*) oder (besser) die Klasse alleine (java.io.IOException) importiren.
 

janta66

Mitglied
ah.. SUPER! Dann habe ich es verstanden.

Danke fuer die rasche Antwort. Man kann also auch NUR die Klasse importieren,
verstehe. Das ist sparsamer oder?

Danke nochmal und Gruss
Jan
 

Maximum

Aktives Mitglied
Wenn du einzelne Klassen importierst geht es, soweit ich weiß, schneller, weil die VM nicht erst die richtige Klasse raussuchen muss. Sie weiß ja dann direkt schon, die und die Klasse muss ich nehmen.
 

Wildcard

Top Contributor
Maximum hat gesagt.:
Wenn du einzelne Klassen importierst geht es, soweit ich weiß, schneller, weil die VM nicht erst die richtige Klasse raussuchen muss. Sie weiß ja dann direkt schon, die und die Klasse muss ich nehmen.
Nein, es ist völlig egal. imports sind nur eine Kurzschreibweise (wie ein XML Namespace Präfix).
Der Compiler ersetzt imports durch voll qualifizierte Namen. Man müsste überhaupt keine imports verwenden.
 

Maximum

Aktives Mitglied
Wildcard hat gesagt.:
Maximum hat gesagt.:
Wenn du einzelne Klassen importierst geht es, soweit ich weiß, schneller, weil die VM nicht erst die richtige Klasse raussuchen muss. Sie weiß ja dann direkt schon, die und die Klasse muss ich nehmen.
Nein, es ist völlig egal. imports sind nur eine Kurzschreibweise (wie ein XML Namespace Präfix).
Der Compiler ersetzt imports durch voll qualifizierte Namen. Man müsste überhaupt keine imports verwenden.

Ok, das ist mir neu, klingt aber logisch. :wink:
 

janta66

Mitglied
Eins bitte noch:

wenn in meinem Beispiel main eine exception hervorrufen
koennte, die mit IOException gehandelt wird, wie kann
diese exception denn aussehen?

Ich habe alles moegliche eingegeben, auch Sonderzeichen...
Ich habe aber keine exception-Meldung bekommen.
Es wird stehts nur das erste Zeichen wieder ausgegeben.

Welche Eingabe führt hier denn zu einer exception?

Gruss
Jan
 

janta66

Mitglied
Hallo,

ich glaube ich habe mich undeutlich ausgedrückt.
Was ich meinte ist Folgendes:

Soweit ich verstanden habe fängt die Klasse IOexception
eine eventuelle exception, die durch die main-Methode hervorgerufen
wird ab und gibt irgendeine Fehlermeldung aus oder macht sonst
irgendwas. (ich beziehe mich dabei auf das oben stehende Prog.)

Ich dachte nun, das so eine exception durch eine "falsche" Eingabe
erzeugt wird, also zum Bspl. indem man zur Laufzeit des oben abgebildeten
Progs. statt eines int-Wertes ein char-Zeichen oder eine Zeichenkette
oder ein Sonderzeichen eingibt. Dies scheint aber nicht der Fall zu sein.

Zur Laufzeit des oben abgebildeten Progs. habe ich mit allen möglichen
Eingaben KEINE exception hervorrufen koennen.

Oder gibt es gar keine Fehlermeldung? Oder wird eine mögliche exception
gar nicht durch eine "Falscheingabe" (also kein int-Wert) erzeugt?

Gruss
Jan
 

Maximum

Aktives Mitglied
janta66 hat gesagt.:
Soweit ich verstanden habe fängt die Klasse IOexception
eine eventuelle exception, die durch die main-Methode hervorgerufen
wird ab und gibt irgendeine Fehlermeldung aus oder macht sonst
irgendwas. (ich beziehe mich dabei auf das oben stehende Prog.)

Nein, so nicht.

throws IOException zeigt an, dass, im Fehlerfall, in der Methode eine IOException "auftreten/geworfen" werden könnte.
Die IOException kann von der Methode System.in.read() geworfen werden, z.B. wenn du etwas eingegeben hast, was kein char ist, oder wenn sonst ein Fehler beim lesen von der Kommandozeile aufgetreten ist.

janta66 hat gesagt.:
Ich dachte nun, das so eine exception durch eine "falsche" Eingabe
erzeugt wird, also zum Bspl. indem man zur Laufzeit des oben abgebildeten
Progs. statt eines int-Wertes ein char-Zeichen oder eine Zeichenkette
oder ein Sonderzeichen eingibt. Dies scheint aber nicht der Fall zu sein.

Weil du mit der Tastatur auch (hauptsächlich) chars eingibst.

janta66 hat gesagt.:
Zur Laufzeit des oben abgebildeten Progs. habe ich mit allen möglichen
Eingaben KEINE exception hervorrufen koennen.

Oder gibt es gar keine Fehlermeldung? Oder wird eine mögliche exception
gar nicht durch eine "Falscheingabe" (also kein int-Wert) erzeugt?

Gruss
Jan

Um auf einen Fehler, der von System.in.read() ausgehen könnte, zu reagieren müsstest du allerdings die Exception auch fangen.

Code:
try {
   i = System.in.read();
}
catch (IOException ioe) {
   ioe.getMessage();
}

So kannst du dann auch (über getMessage()) an eine Fehlermeldung kommen, oder dir mit Exception#printStackTrace() anzeigen lassen, wo die Exceptionaufgetreten ist.
 

Tobias

Top Contributor
Beim Lesen von der Tastatur treten IOExceptions eher nicht auf - weil da nicht allzu viel beteiligt ist, was kaputt gehen könnte (zumindest wenn man davon ausgeht, das der Computer im Normalzustand, also betriebsbereit, ist und bleibt). Du könntest einfach brutal eine IOException selbst auslösen (mittels "throw new IOException();") - das ist aber sicher nur sinnig, um sich das ganze mal anzusehen.

Ansonsten bleibt dir nur wenig anderes übrig, als das ganze erstmal hinzunehmen. Streams sind ein mächtiges Konzept, welches nicht nur Eingaben von der Tastatur, sondern auch von beliebigen anderen Quellen erlaubt - Dateien oder gar Webservern irgendwo im Internet. Bei solchen Streams sind IOExceptions dann schon wahrscheinlicher.

mpG
Tobias

P.S.: Mit verschiedenen Eingaben einen Fehler provozieren zu wollen ist in deinem Fall übrigens aussichtslos. Was von der Tastatur kommt sind chars und die können verarbeitet werden. Und wenn sie nicht als char interpretiert werden können, bekommst du auch keine IOException, sondern eine ClassCastException, weil nicht das Lesen an sich, sondern nur die Typumwandlung (der Cast) fehlschlägt.
 

janta66

Mitglied
Aha..,

heisst das dann, dass durch
Code:
public static void main(String[] args) throws IOException
die Methode lediglich bekannt gibt, dass eine evtl. Ausnahme die
Gestalt einer IOException hat?

Warum steht dann aber in der Codezeile als Kommentar
// wir leiten die exception einfach weiter nach oben...


Gruss
Jan
 

Tobias

Top Contributor
Ja, mit der throws-Klausel machst du einem Aufrufer einer Methode bekannt, das eventuell Ausnahmen der angegebenen Typen auftreten können. Diese Ausnahmen müssen dann vom Aufrufer behandelt werden (durch einen try{}catch(Exception e){}-Block) oder seinerseits ebenfalls an seinen Aufrufer weitergereicht werden.

Exceptions, die wie in deinem Fall die main-Methode verlassen (weitergereicht werden), werden von der JVM in die Konsole ausgegeben.

mpG
Tobias
 

Maximum

Aktives Mitglied
Die throws Anweisung soll der aufrufenden Methode signalisieren, dass es sein könnte, dass da eine Exception ankommt.

Wenn du selber die Exception nicht mit try-catch fänst, weil zB die Fehlerbehandlung nicht an die Stelle gehört, kannst du die Exception weiterleiten (ebenfalls über throws).

Also passiert in deinem Programm folgendes (Bild oben):

Wenn System.in.read() eine IOException wirft, dann leite diese an die Methode weiter, die main aufgerufen hat.

Das wäre in dem Falle dann die Java Virtual Machine.
 

janta66

Mitglied
Tobias hat gesagt.:
Exceptions, die wie in deinem Fall die main-Methode verlassen (weitergereicht werden), werden von der JVM in die Konsole ausgegeben.

mpG
Tobias

Meinst Du damit, dass die exceptions, die die main-Methode verlassen NUR in die Konsole ausgegeben
werden und es passiert nichts weiter? Im Gegensatz dazu dass es andere Weterreichungen gibt, bei
denen man definieren kann, was bei einer Ausnahme passieren soll?

Gruss
Jan
 

janta66

Mitglied
Maximum hat gesagt.:
Die throws Anweisung soll der aufrufenden Methode signalisieren, dass es sein könnte, dass da eine Exception ankommt.

Wenn du selber die Exception nicht mit try-catch fänst, weil zB die Fehlerbehandlung nicht an die Stelle gehört, kannst du die Exception weiterleiten (ebenfalls über throws).

Also passiert in deinem Programm folgendes (Bild oben):

Wenn System.in.read() eine IOException wirft, dann leite diese an die Methode weiter, die main aufgerufen hat.

Das wäre in dem Falle dann die Java Virtual Machine.

Ahh...Ok jetzt habe ich es durchdrungen!
Das heisst: die Ausnahmebehandlung wird immer an die Methode weitergereicht, die die
Methode aufgerufen hat, die vor "throws" steht stimmts?

Gruss
Jan
 

Tobias

Top Contributor
Ja. Und wenn die Methode main Exceptions weiterreicht (main wird von der JVM aufgerufen), dann gibt die JVM die Exception in der Konsole aus und bricht die Programmausführung ab (das Programm hat schließlich einen Fehler signalisiert und befindet sich vermutlich nicht mehr in einem vom Programmierer vorgesehenen Zustand).

mpG
Tobias
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben