Heim >Java >javaLernprogramm >Analysieren Sie Mechanismen zur Ereignisbehandlung und Ausnahmebehandlung in Java
1. Ereignisverarbeitung
Tatsächlich erinnert mich der Name Ereignisverarbeitung an den Nachrichtenantwortmechanismus in MFC. Ich vermute, dass dies die Situation von Nanju und Beizhi ist Diese „neue Flasche“ sollte die Botschaft in MFC sein, die auf diesen „alten Wein“ reagiert.
Bei den sogenannten „Events“ handelt es sich um Veränderungen wie Tastaturtasten, Mausklicks etc., die durch Aktionen oder etwas verursacht werden, das eine Zustandsänderung hervorruft und eine entsprechende Reaktion auf diese Änderung erfordern. Wir können Ereignisse in Java in mehrere Kategorien einteilen: Schaltflächen-, Maus-, Tastatur-, Fenster- und andere Ereignisse.
Ereignisverarbeitungsmodell
1. Vererbungsbasiertes Ereignisverarbeitungsmodell (JDK1.0)
In JDK1.0 basiert die Ereignisverarbeitung auf Vererbung. Ereignisse werden zuerst an Komponenten gesendet und dann entlang des Containers nach oben weitergegeben Ebene. Ereignisse, die nicht von einer Komponente verarbeitet werden, werden automatisch an den Container der Komponente weitergegeben. ——Dies scheint mit der ursprünglichen Ereignisantwortsequenz oder dem polymorphen Antwortmechanismus in MFC übereinzustimmen, und der später erwähnte agentenbasierte Ereignisverarbeitungsmechanismus scheint mit dem Rückrufmechanismus von MFC konsistent zu sein.
Spezifische Verarbeitungsmethode
Rufen Sie die Methode action() oder handleEvent() auf, um Ereignisse abzurufen, die während der Ausführung des Programms auftreten. Ereignisse, die in allen Komponenten auftreten, werden in dieser Methode verarbeitet.
2. Agentenbasiertes Ereignisverarbeitungsmodell (JDK1.1)
In diesem Modell werden Ereignisse direkt an die Komponente gesendet, die das Ereignis generiert.
Registrieren Sie für jede Komponente einen oder mehrere Listener, die diese Klassen enthalten Event-Handler, die das Event empfangen und verarbeiten.
Ein Listener ist eine Klasse, die die Listener-Schnittstelle implementiert. Ereignisse sind Objekte, die nur registrierten Zuhörern gemeldet werden. Jedes Ereignis verfügt über eine entsprechende Listener-Schnittstelle.
Wenn Sie mit der Maus auf das Button-Objekt klicken, wird ein ActionEvent-Ereignis gesendet. Dieses ActionEvent-Ereignis wird von der actionPerformed()-Methode aller ActionListener empfangen, die mit der addActionListener()-Methode registriert wurden.
Funktionen des agentenbasierten Ereignisverarbeitungsmodells
①Ereignisse werden nicht versehentlich verarbeitet. Im hierarchischen Modell kann sich ein Ereignis an den Container weitergeben und auf einer unerwarteten Ebene behandelt werden.
②Es ist möglich, Adapterklassen zu erstellen und zu verwenden, um Ereignisaktionen zu klassifizieren.
③Es ist hilfreich, die Arbeit in verschiedene Kategorien zu verteilen.
Konzentrieren Sie sich auf das Erlernen dieses Ereignisverarbeitungsmodells
3. Ereignisse
Die drei Elemente der Ereignisverarbeitung.
(1) Ereignisquelle Die Ereignisquelle ist der Generator eines Ereignisses, z. B. Schaltflächen, Fenster, Textfelder usw.
(2) Ereignistyp Alle Ereignisse in Java sind im Paket java.awt.event zusammengefasst. Alle Ereignisklassen erben die Klasse „method-getSouce()“. Die Methode gibt das Objekt zurück, in dem das Ereignis aufgetreten ist.
(3) Ereignis-Listener Nachdem verschiedene Arten von Ereignissen aufgetreten sind, empfängt der Ereignis-Listener das Ereignis und ruft die entsprechende Ereignisverarbeitungsmethode auf. Alle Ereignis-Listener sind tatsächlich Schnittstellen im Paket java.awt.event, das die Schnittstelle java.util.EventListener einführt. Listener für verschiedene Ereignistypen verfügen über unterschiedliche Methoden.
Ereignisverarbeitungsschritte
① Fügen Sie das Programm zum Paket java.awt.event hinzu:
Import java.awt.event;
② Registrieren Sie einen Ereignis-Listener für das erforderliche Ereignisquellenobjekt:
Ereignisquelle Object.addXXXListener(XXXListener);
③ Implementieren Sie die entsprechende Methode. Wenn eine Listener-Schnittstelle mehrere Methoden enthält, müssen Sie alle Methoden implementieren
Beispiel: b2.addActionListener(this)
4. Implementieren Sie alle Methoden jeder Listener-Schnittstelle. Der Arbeitsaufwand ist sehr groß Der Einfachheit halber stellt die Java-Sprache die Klasse Adapters zur Verfügung, um Klassen mit mehreren Methoden zu implementieren.
Der von Ihnen definierte Listener kann die Adapterklasse erben und muss nur die von Ihnen benötigten Methoden überschreiben.
Der dem Fensterereignis entsprechende Listener ist beispielsweise WindowListener, der mehrere Methoden implementieren muss, einschließlich windowOpened(), windowClosed(), windowClosing(), WindowIconfied(), WindowDeiconfied(), WindowActivated(), WindowDeactivated() , Dies erhöht den unnötigen Programmieraufwand.
Wenn Sie WindowAdapter erben, müssen Sie nur eine oder mehrere Methoden implementieren, nicht alle Methoden. Viele der folgenden Beispiele implementieren nur die Methode windowClosing() mit dem Zweck, das System zu verlassen, wenn das Fenster geschlossen wird.
4.1 Verarbeitung von Schaltflächenereignissen
Das Ereignis, das auftritt, wenn auf eine Schaltfläche geklickt wird, ist ein Aktionsereignis.
Die dem Aktionsereignis entsprechende Ereignisklasse ist die ActionEvent-Klasse.
Der Ereignis-Listener, der dem Aktionsereignis entspricht ist: ActionListener
Die Hauptmethode des Listeners:
actionPerformed(ActionEvent e) wird aufgerufen, wenn ein Aktionsereignis auftritt
Implementieren Sie das Operationsprojekt des Aktionsereignisses:
Der erste Schritt besteht darin, das zu registrieren Aktionsereignis-Listener addActionListener (ActionListener).
Der zweite Schritt besteht darin, die Methode der ActionListener-Schnittstelle zu implementieren: actionPerformed(ActionEvent e)
4.2 Mausereignisverarbeitung
Die Ereignisquelle, die Mausereignisse auslöst, ist normalerweise ein Container. Wenn die Maus in den Container eintritt oder ihn verlässt oder wenn die Maus im Container angeklickt oder gezogen wird, tritt ein Mausereignis auf.
Die dem Mausereignis entsprechende Ereignisklasse ist MouseEvent-Klasse
Methoden in der MouseEvent-Klasse:
getX() ruft die X-Koordinate der Maus ab
getY() ruft die Y-Koordinate der Maus ab
getPoint() ruft die Position der Maus ab
Es gibt zwei Ereignis-Listener, die Mausereignissen entsprechen: MouseListener (oder MouseAdapter) entspricht Mausereignissen und MouseMotionListener (oder MouseMotionAdapter) entspricht Mausbewegungsereignissen.
Die Hauptmethode von MouseListener (oder MouseAdapter)
MousePressed(MouseEvent e) Die Verarbeitungsmethode, wenn die Maus gedrückt wird
MouseReleased(MouseEvent e) Die Verarbeitungsmethode, wenn die Maus losgelassen wird
MouseEntered(MouseEvent e) Die Maus betritt die Verarbeitungsmethode, wenn die Maus die Maus verlässt
MouseExited(MouseEvent e) Die Verarbeitungsmethode, wenn die Maus die Maus verlässt
Die Verarbeitungsmethode, wenn die Maus klickt MouseClicked(MouseEvent e)
Hauptmethoden von MouseMotionListener (oder MouseMotionAdapter)
MouseMoved(MouseEvent e) Verarbeitungsmethode, wenn die Maus bewegt wird
MouseDraged(MouseEvent e) Verarbeitungsmethode, wenn die Maus gezogen wird
4.3 Verarbeitung von Tastaturereignissen
Tastaturereignisse treten auf wenn die Tastatur in einer Komponente mit Tastaturfokus gedrückt oder losgelassen wird.
Die dem Tastaturereignis entsprechende Ereignisklasse ist die KeyEvent-Klasse:
Die Taste Code gedrückt oder losgelassen
getKeyText() ruft die Zeichenfolge der gedrückten oder losgelassenen Taste ab
Der dem Tastaturereignis entsprechende Ereignis-Listener ist: KeyListener oder KeyAdapter
Hauptmethode:
KeyPressed(KeyEvent e) Verarbeitung Methode beim Drücken der Tastatur
Verarbeitungsmethode beim Loslassen der Tastatur KeyReleased (KeyEvent e)
4.4 Verarbeitung von Fensterereignissen
Kann nur durch Window und seine erweiterten Klassen (Frame, Dialog) usw. ausgelöst werden . Fensterereignisse, die anzeigen, dass sich das Fenster im Status „Aktiv/Ungültig“, „Symbol/Nicht-Symbol“ oder „Offen/Geschlossen“ usw. befindet.
Die dem Fensterereignis entsprechende Klasse ist WindowEvent und der Listener ist WindowListener (bzw WindowAdapter)
Hauptmethode:
windowOpened (WindowEvent e) Ereignisverarbeitung zum Öffnen des Fensters
windowClosed (WindowEvent e) Ereignisverarbeitung zum Schließen des Fensters
windowClosing (WindowEvent e) Ereignisverarbeitung zum Schließen des Fensters
WindowActivated (WindowEvent e) Ereignisverarbeitung zum Aktivieren des Status
WindowDeactivated (WindowEvent e) Ereignisverarbeitung mit ungültigem Status
4.5 Andere Ereignisverarbeitung
4.5.1 Kontrollkästchen und Optionsfeld-Ereignisverarbeitung
Die Die Ereignisklasse ist ItemEvent:
Option-Ereigniskorrespondenz. Der Ereignis-Listener ist: ItemListener
Methode:
ItemStateChanged (ItemEvent e) wird aufgerufen, wenn ein Optionsereignis auftritt
4.5.2 Scrollbar-Ereignisverarbeitung
Die dem Anpassungsereignis entsprechende Ereignisklasse ist die AdjustmentEvent-Klasse:
Der dem Anpassungsereignis entsprechende Ereignis-Listener ist: AdjustmentListener
Methode:
AdjustmentValueChanged (AdjustmentEvent e) wird aufgerufen, wenn ein Anpassungsereignis auftritt
4.5.3 Ereignisverarbeitung der Dropdown-Liste
Die Ereignisklasse ist Item Event:
Der dem Optionsereignis entsprechende Ereignis-Listener ist: ItemListener
Methode:
itemStateChanged (ItemEvent e) wird aufgerufen Wenn eine Aktion in der Dropdown-Liste auftritt
(Es ist ersichtlich, dass die Ereignisverarbeitung und der Ereignistyp der Dropdown-Liste, Die Ereignis-Listener und -Methoden mit den Ereignishandlern von Kontrollkästchen und Optionsfeldern identisch sind . Die Ereignistypen, Ereignis-Listener und Methoden sind die gleichen)
4.5.4 Menüereignisverarbeitung
Menüereignisse sind im Allgemeinen, wenn wir auf ein Menü klicken, Ereignisse, die während des Elements aufgetreten sind.
Es gibt zwei Arten von Menüelementen:
MenuItem-Aktionsereignis
CheckboxMenuItem, Optionsereignis
MenuItem-Ereignisverarbeitung
Der erste Schritt besteht darin, Aktionsereignismonitore für alle MenuItem-Menüelemente zu registrieren. Listener addActionListener( ActionListener ).
Der zweite Schritt besteht darin, die Methode der ActionListener-Schnittstelle zu implementieren: actionPerformed(ActionEvent e). Verwenden Sie bei dieser Methode e.getSource(), um den vom Benutzer ausgewählten Menüpunkt abzurufen und die entsprechende Verarbeitung durchzuführen.
Ereignisbehandlung von CheckboxMenuItem
Der erste Schritt besteht darin, die Option Ereignis-Listener addItemListener (ItemListener) für alle CheckMenuItem-Menüelemente zu registrieren.
Der zweite Schritt besteht darin, die Methode der ItemListener-Schnittstelle zu implementieren: itemStateChanged(ItemEvent e). Verwenden Sie bei dieser Methode e.getSource(), um den vom Benutzer ausgewählten Menüpunkt abzurufen, e.getItem(), um die Bezeichnung des vom Benutzer ausgewählten Menüpunkts abzurufen, und e.getStateChange(), um abzurufen, ob er ausgewählt ist , und führen Sie die entsprechende Verarbeitung durch.
2. Ausnahmebehandlung
Jede gute Programmiersprache und jeder gute Programmierer wird die Ausnahmebehandlung nicht ignorieren. Als beliebte objektorientierte Programmiersprache ist der Ausnahmebehandlungsmechanismus natürlich eine seiner wichtigen Funktionen.
Im Allgemeinen spricht man bei der Erklärung von Ausnahmen von Fehlern in der Programmierung. Tatsächlich ist dieser Fehler jedoch sehr häufig und es gibt viele Arten, wie zum Beispiel: Kompilierungsfehler, Betriebsfehler (insbesondere wird er unterteilt in: Systembetriebsfehler und logische Betriebsfehler). Diese Art von Systembetriebsfehler kommt selten vor Zählen Sie es als Fehler in der Programmierung.)
In JAVA ist die Ausnahme eine Klasse, die von der Throwable-Klasse erbt. Jede Ausnahmeklasse stellt einen Laufzeitfehler dar (Hinweis: Es handelt sich um einen Laufzeitfehler). Die Ausnahmeklasse enthält Informationen über den laufenden Fehler und Fehlerbehandlungsmethoden.
Javas Ausnahmebehandlungsmechanismus:
Immer wenn während der Ausführung eines Java-Programms ein erkennbarer Ausführungsfehler auftritt (d. h. wenn dem Fehler eine Ausnahmeklasse entspricht), generiert das System eine entsprechende Ausnahme der Ausnahmeklasse (Hinweis: Dies wird als Generieren eines Ausnahmeklassenobjekts bezeichnet.) bedeutet das Generieren einer Ausnahme.
Sobald ein abnormales Objekt generiert wird, muss das System über einen entsprechenden Mechanismus zur Handhabung verfügen, um sicherzustellen, dass keine Abstürze, Endlosschleifen oder andere Schäden am Betriebssystem auftreten, wodurch die Sicherheit des gesamten Programms gewährleistet wird
Ausnahmen und Ausnahmeklassen:
Fehler: von der Java Virtual Machine generiert und ausgelöst und nicht vom Java-Programm verarbeitet
Laufzeitausnahme (Systemfehler wie Division durch 0, Array-Index außerhalb des Bereichs): erkannt von System, Die Java-Programme des Benutzers müssen nicht verarbeitet werden, und das System übergibt sie an den Standard-Ausnahmebehandler (Hinweis: Es gibt eine Standard-Ausnahmebehandlung).
Ausnahme (Probleme im Programm, vorhersehbar): Das Java Compiler erfordert Java. Das Programm muss alle nicht zur Laufzeit generierten Ausnahmen erfassen oder deklarieren.
Benutzergenerierte Ausnahmen
Ausnahmeklasse
Konstruktor:
public Exception();
public Exception(String s); Zeichen akzeptieren Die als String-Parameter übergebenen Informationen sind normalerweise eine Beschreibung des Fehlers, der der Ausnahme entspricht.
Die Exception-Klasse erbt außerdem mehrere Methoden von ihrem Vater Throwable, darunter die am häufigsten verwendeten:
1) public String toString();
Die toString()-Methode gibt einen String zurück, der die aktuelle Exception-Klasse beschreibt Information.
2) public void printStackTrace();
Die printStackTrace()-Methode hat keinen Rückgabewert. Ihre Funktion besteht darin, einen Druckvorgang abzuschließen und die Stapelnutzung des aktuellen Ausnahmeobjekts auf der aktuellen Standardausgabe auszudrucken (normalerweise). Die Trajektorie, d. h. welche Methoden von Objekten oder Klassen vom Programm nacheinander aufgerufen und ausgeführt werden, wodurch dieses Ausnahmeobjekt während des laufenden Prozesses generiert wird.
Systemdefinierte laufende Ausnahmen
Einige dieser Unterklassen sind vom System vordefiniert und in der Java-Klassenbibliothek enthalten und werden als systemdefinierte laufende Ausnahmen bezeichnet.
Benutzerdefinierte Ausnahmen
Für eine bestimmte Anwendung -spezifische Ausführungsfehler erfordern, dass Programmierer benutzerdefinierte Ausnahmeklassen und Ausnahmeobjekte im Benutzerprogramm gemäß der speziellen Logik des Programms erstellen
Benutzerdefinierte Ausnahmen verwenden normalerweise Exception als übergeordnete Klasse der Ausnahmeklasse
Aber Es gibt eine Frage, die noch nicht verstanden ist: Wenn ein Fehler auftritt, woher weiß das System, dass er erkannt wurde? Wie generiert man das entsprechende Ausnahmeklassenobjekt? Woher weiß ein Ausnahmeobjekt, dass es die entsprechende Methode zur Lösung verwenden muss? Gibt es für jedes Ausnahmeklassenobjekt nur eine Ausnahmebehandlungsmethode, die die entsprechende Ausnahme behandelt? ————————————Es stellt sich heraus, dass benutzerdefinierte Ausnahmen durch die Anweisung throw ausgelöst werden.
Beim Erstellen einer benutzerdefinierten Ausnahme müssen Sie im Allgemeinen die folgenden Arbeiten ausführen:
1) Deklarieren Sie eine neue Ausnahmeklasse und sorgen Sie dafür, dass sie die Ausnahmeklasse oder eine andere vorhandene Systemausnahmeklasse oder Benutzerausnahme als übergeordnete Klasse verwendet .
2) Definieren Sie Attribute und Methoden für die neue Ausnahmeklasse oder überladen Sie die Attribute und Methoden der übergeordneten Klasse, sodass diese Attribute und Methoden die der Klasse entsprechenden Fehlerinformationen widerspiegeln können.
Auslösen einer Ausnahme
Wenn ein Java-Programm während der Ausführung einen identifizierbaren Fehler auslöst, wird ein Objekt der Ausnahmeklasse generiert, die dem Fehler entspricht. Dieser Vorgang wird als Auslösen einer Ausnahme bezeichnet.
Eigentlich ist es ein Auslösen von eine Instanz des entsprechenden Ausnahmeklassenobjekts.
Abhängig vom Ausnahmetyp gibt es zwei Möglichkeiten, Ausnahmen auszulösen: automatisch vom System ausgelöst und vom Benutzer ausgelöst:
1. Automatisch vom System ausgelöst
Die vom System definierten laufenden Fehlerausnahmen sind alle vom System ausgelöst Automatisch auslösen
2. Vom Benutzer ausgelöst
Benutzerdefinierte Ausnahmen können nicht automatisch vom System ausgelöst werden, sondern müssen vom Benutzer mithilfe von Java-Anweisungen ausgelöst werden. In Java-Anweisungen wird die throw-Anweisung verwendet um explizit eine „Ausnahme“
im Format einer Throw-Anweisung
auszulösenRückgabetyp Methodenname (Parameterliste) throws Liste der auszulösenden Ausnahmeklassennamen. 🎜> Hinweis:
1) Im Allgemeinen wird eine Ausnahme ausgelöst, wenn eine bestimmte Bedingung im Programm erfüllt ist; Oft wird die throw-Anweisung im if-Zweig der if-Anweisung platziert,
if(I>100)
throw (new MyException() ; Die obere Methode ist darauf vorbereitet, die Ausnahmen zu akzeptieren und zu behandeln, die sie während des Betriebs auslösen kann
Wenn es mehr als eine throw-Anweisung in der Methode gibt, sollten alle möglichen Ausnahmen im Methodenheader throws aufgelistet sein
3) Java-Sprache Es ist erforderlich, dass alle mit dem Schlüsselwort throws deklarierten Klassen und mit throw geworfenen Objekte müssen Seien Sie Throwable-Klassen oder ihre Unterklassen. Wenn Sie versuchen, ein Objekt auszulösen, das nicht ausführbar ist, meldet der Java-Compiler einen Fehler
Ausnahmebehandlung:
Überlegen Sie sich hauptsächlich, wie Ausnahmen abgefangen werden, wie das Programm nach dem Abfangen der Ausnahme übersprungen wird und wie Ausnahmen geschrieben werden Umgang mit Aussagen
1. try...catch...finally block
1) try
Das { } der try-Anweisung enthält einen Teil des Programmcodes, der eine oder mehrere Ausnahmen auslösen kann
Diese Codes geben tatsächlich den Catch dahinter an Der Bereich der Ausnahmen, die der Block abfangen kann.
Wenn beim Ausführen der Anweisung im Try-Block eine Ausnahme auftritt, führt das Java-Programm nicht mehr andere Anweisungen im Try-Block aus, sondern tritt direkt in den Catch-Block ein, um den ersten passenden Ausnahmetyp zu finden und auszuführen . bewältigen.
2) Catch-Block
Die Parameter der Catch-Anweisung ähneln der Definition einer Methode, einschließlich eines Ausnahmetyps und eines Ausnahmeobjekts.
Der Ausnahmetyp muss eine Unterklasse der Throwable-Klasse sein, die den von der Catch-Anweisung behandelten Ausnahmetyp angibt.
Das Ausnahmeobjekt wird vom Java-Laufzeitsystem in den geschweiften Klammern im durch angegebenen Programmcodeblock ausgelöst try Enthält Methodencode zur Behandlung von Ausnahmeobjekten.
Es können mehrere Catch-Anweisungen vorhanden sein, um jeweils unterschiedliche Arten von Ausnahmen zu behandeln.
Das Java-Laufzeitsystem erkennt den von jeder Catch-Anweisung behandelten Ausnahmetyp von oben nach unten, bis eine passende Catch-Anweisung gefunden wird.
Typübereinstimmung bedeutet hier, dass der Ausnahmetyp im Catch vollständig mit dem Typ des generierten Ausnahmeobjekts übereinstimmt oder die übergeordnete Klasse des Ausnahmeobjekts ist. Daher sollte die Sortierreihenfolge der Catch-Anweisung von speziell bis sein allgemein. (Überlegen Sie, warum?)
3) Final-Block
Die final-Anweisung kann als Bereinigungsmechanismus für Ausnahmebehandlungsereignisse bezeichnet werden. Sie wird im Allgemeinen zum Schließen von Dateien oder zum Freigeben anderer Systemressourcen verwendet.
Im Versuch -catch-finally-Anweisung Die Anweisung darf keinen finalen Teil enthalten.
Wenn es keinen finalen Teil gibt und der durch try angegebene Programmcode eine Ausnahme auslöst, werden andere Programmcodes nicht ausgeführt.
Wenn es einen finalen Teil gibt, unabhängig davon, ob eine Ausnahme im try-Block auftritt, ob Nach der Ausführung der Anweisung im Catch-Teil muss die Anweisung im Final-Teil ausgeführt werden.
Es ist ersichtlich, dass der finale Teil der Anweisung einen einheitlichen Ausgang für die Ausnahmebehandlung bereitstellt.
Mehrfache Ausnahmebehandlung
Ein Try-Block kann mehrere verschiedene Ausnahmen generieren. Wenn Sie unterschiedliche Methoden zur Behandlung dieser Ausnahmen verwenden möchten, müssen Sie einen Mechanismus zur Behandlung mehrerer Ausnahmen verwenden.
Mehrfache Ausnahmebehandlung wird durch die Definition mehrerer Catch-Blöcke nach einem Try-Block erreicht. Jeder Catch-Block wird zum Empfangen und Verarbeiten eines bestimmten Ausnahmeobjekts anhand der Parameter des Catch-Blocks verwendet werden von diesem Catch-Block empfangen und verarbeitet.
wird von welchem Catch-Block ermittelt, basierend auf der Übereinstimmung des Ausnahmeobjekts und der Ausnahmeparameter des Catch-Blocks: Wenn sie eine der folgenden drei Bedingungen erfüllen, gelten das Ausnahmeobjekt und die Parameter als übereinstimmend:
1) Ausnahmeobjekt und Parameter gehören zur gleichen Ausnahmeklasse.
2) Das Ausnahmeobjekt gehört zu einer Unterklasse der Parameter-Ausnahmeklasse.
3) Das Ausnahmeobjekt implementiert die durch die Parameter definierte Schnittstelle.
Wenn das vom Try-Block generierte Ausnahmeobjekt vom ersten Catch-Block empfangen wird, springt der Programmfluss direkt zu diesem Catch-Anweisungsblock. Nachdem der Anweisungsblock ausgeführt wurde, werden Anweisungen und andere Catch-Blöcke beendet wird ignoriert
Wenn das vom Try-Block generierte Ausnahmeobjekt nicht mit dem ersten Catch-Block übereinstimmt, wechselt das System automatisch zum zweiten Catch-Block zum Abgleich. Wenn der zweite immer noch nicht übereinstimmt, geht es zum Drittens, Viertens ... bis Sie einen Catch-Block finden, der das Ausnahmeobjekt empfangen und den Prozesssprung abschließen kann.
Wenn das vom Try-Block generierte Ausnahmeobjekt vom ersten Catch-Block empfangen wird, springt der Programmfluss direkt zu diesem Catch-Anweisungsblock. Nachdem der Anweisungsblock ausgeführt wurde, werden Anweisungen und andere Catch-Blöcke beendet wird ignoriert
Wenn das vom Try-Block generierte Ausnahmeobjekt nicht mit dem ersten Catch-Block übereinstimmt, wechselt das System automatisch zum zweiten Catch-Block zum Abgleich. Wenn der zweite immer noch nicht übereinstimmt, geht es zum Drittens, Viertens ... bis Sie einen Catch-Block finden, der das Ausnahmeobjekt empfangen und den Prozesssprung abschließen kann.
Wenn die Ausführung aller Anweisungen im Try-Block keine Ausnahme verursacht, werden alle Catch-Blöcke ignoriert und nicht ausgeführt.
Hinweis:
1) Die Anweisungen im Catch-Block sollten je nach Ausnahme unterschiedliche Vorgänge ausführen.
Daher sollte bei der Behandlung mehrerer Ausnahmen darauf geachtet werden, die Reihenfolge jedes Catch-Blocks sorgfältig zu gestalten. Im Allgemeinen sollten Catch-Blöcke, die spezifischere und häufigere Ausnahmen behandeln, vorne platziert werden, während Catch-Blöcke, die mehreren Ausnahmen entsprechen können, hinten platziert werden sollten.
/*尝试用户运行错误的异常处理: 问题是这样的,当输入的用户工资初值少于800则是错误的,当然工资的变化如果超过20%,则也是错误的 */ import java.awt.*; import java.applet.*; import java.awt.event.*; public class UserExceptionApplet extends Applet implements ActionListener{ Label prompt1=new Label("请输入雇员姓名和工资初值:"); Label prompt2=new Label("请输入欲修改的工资"); TextField name,isal,nsal; String msg; Employee Emp; Button okBtn=new Button("OK"); Button cancelBtn=new Button("Cancel"); public void init(){ name=new TextField(5); isal=new TextField(5); nsal=new TextField(5); add(prompt1); add(name); add(isal); add(prompt2); add(nsal); add(okBtn); okBtn.addActionListener(this); cancelBtn.addActionListener(this); add(cancelBtn); } public void paint(Graphics g){ g.drawString(msg,0,80); } public void CreateEmp(String empName,double sa){ try{ Emp=new Employee(empName,sa); msg=new String(Emp.toString()); } catch(IllegalSalaryException ise){ msg=new String(ise.toString()); } } public void ChangeEmpSal(double changeSal){ try{ Emp.setEmpSalary(changeSal); msg=new String(Emp.toString()); } catch(IllegalSalaryException illSal){ msg=new String(illSal.toString()); } catch(IllegalSalaryChangeException illSalChange){ msg=new String(Emp.toString()+illSalChange.toString()); } } public void actionPerformed(ActionEvent e){ String empName; double empSal,changeSal; Object obj=e.getSource(); if(obj==okBtn){ empName=new String(name.getText()); if(empName==null){ msg=new String("请先输入雇员姓名工资并创建之"); } if(nsal.getText()==null){ empSal=Double.valueOf(isal.getText()).doubleValue(); CreateEmp(empName,empSal); } else{ changeSal=Double.valueOf(nsal.getText()).doubleValue(); ChangeEmpSal(changeSal); } } if(obj==cancelBtn){ naem.setText(""); isal.setText(""); nsal.setText(""); } repaint(); } } class Employee{ String m_EmpName; double m_EmpSalary; Employee(String name,double initsalary)throws IllegalSalaryException{ m_EmpName=name;//看这里有问题没,参考代码为m_EmpName=new String(name); if(initsalary<800){ throw(new IllegalSalaryException(this,initsalary));//throw语句 } m_EmpSalary=initsalary; } public String getEmpName(){ return m_EmpName; } public double getEmpSalary(){ return m_EmpSalary; } public boolean setEmpSalary(double newSal) throws IllegalSalaryException,IllegalSalaryChangeException{ if(newSal<800) throw(new IllegalSalaryException(this,newSal)); else if(getEmpSalary()==0.0){ m_EmpSalary=newSal; return true; } else if(Math.abs(newSal-getEmpSalary())/getEmpSalary()>=0.2) throw(new IllegalSalaryChangeException(this,newSal-getEmpSalary())); else{ m_EmpSalary=newSal; return true; } } public String toString(){ String s; s="姓名:"+m_EmpName+"工资: "+m_EmpSalary; return s; } } class IllegalSalaryException extends Exception{ private Employee m_ConcernedEmp; private double m_IllegalSalary; IllegalSalaryException(Employee emp,double isal){ super("工资低于最低工资"); m_ConcernedEmp=emp; m_IllegalSalary=isal; } public String toString(){ String s; s="为雇员提供的工资不合法:雇员:"+m_ConcernedEmp.getEmpName()+"非法工资:"+m_IllegalSalary+"低于最低工资数额800元"; return s; } } class IllegalSalaryChangeException extends Exception{ private Employee m_ConcernedEmp; private double m_IllegalSalaryChange; IllegalSalaryChangeException(Employee emp,double csal){ super("工资变动太大"); m_ConcernedEmp=emp; m_IllegalSalaryChange=csal; } public String toString(){ String s; s="为雇员提供的工资变动不合法:雇员:"+m_ConcernedEmp.getEmpName()+"非法变动工资变化:"+m_IllegalSalaryChange+"高于原工资的20%"; return s; } }
Weitere Artikel zur Analyse von Ereignisverarbeitungs- und Ausnahmebehandlungsmechanismen in Java finden Sie auf der chinesischen PHP-Website!