Grundlagen der Informatik Ausnahmebehandlung & Threads

Ähnliche Dokumente
Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Übung: Verwendung von Java-Threads

Einführung in die Java- Programmierung

Einführung in die Programmierung

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

Objektorientierte Programmierung. Kapitel 12: Interfaces

Einführung in die Programmierung Blockkurs Java

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Programmierkurs Java

Java Kurs für Anfänger Einheit 5 Methoden

Grundlagen von Python

Javakurs zu Informatik I. Henning Heitkötter

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Einstieg in die Informatik mit Java

Objektorientierte Programmierung

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Der lokale und verteilte Fall

Objektorientierte Programmierung

Programmieren in Java

Architektur Verteilter Systeme Teil 2: Prozesse und Threads

Objektorientierte Programmierung für Anfänger am Beispiel PHP

SEP 114. Design by Contract

Große Übung Praktische Informatik 1

Exceptions. Prof. Dr. Margarita Esponda SS M. Esponda-Argüero

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Software Engineering Klassendiagramme Einführung

! " # $ " % & Nicki Wruck worldwidewruck

2A Basistechniken: Weitere Aufgaben

Innere Klassen in Java

Einführung in die Java- Programmierung

Java: Vererbung. Teil 3: super()

Einführung in die Programmierung

Fassade. Objektbasiertes Strukturmuster. C. Restorff & M. Rohlfing

Internet Explorer Version 6

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Software Engineering Klassendiagramme Assoziationen

Datensicherung. Beschreibung der Datensicherung

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Prinzipien Objektorientierter Programmierung

Nathan Burgener. Design by Contract. Modul SWE

Vorkurs C++ Programmierung

3 Objektorientierte Konzepte in Java

Anleitung über den Umgang mit Schildern

TTS - TinyTimeSystem. Unterrichtsprojekt BIBI

Client-Server-Beziehungen

Exception Handling, Tracing und Logging

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

Testen mit JUnit. Motivation

Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API).

ABB i-bus KNX. Software-Information. Melde- und Bedientableau. Typ: MT 701.2

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Typumwandlungen bei Referenztypen

ecaros2 Installer procar informatik AG 1 Stand: FS 09/2012 Eschenweg Weiterstadt

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Schritt 1 - Ein Spielfeld

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Einführung in Eclipse und Java

Formular»Fragenkatalog BIM-Server«

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Software Engineering Interaktionsdiagramme

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Einführung in. Logische Schaltungen

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Albert HAYR Linux, IT and Open Source Expert and Solution Architect. Open Source professionell einsetzen

Überblick. Lineares Suchen

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

i n g e n i e u r b ü r o f ü r s o f t w a r e t e c h n o l o g i e w w w. v o e l t e r. d e Servlet Debugging

4D Server v12 64-bit Version BETA VERSION

EasyWk DAS Schwimmwettkampfprogramm

ObjectBridge Java Edition

Professionelle Seminare im Bereich MS-Office

Schedulingund Thread-Ausführer

Übungsblatt 3: Algorithmen in Java & Grammatiken

How to do? Projekte - Zeiterfassung

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel für Mac. amac-buch Verlag

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

5. Abstrakte Klassen

Java-Programmierung. Remote Method Invocation - RMI

Dr. Monika Meiler. Inhalt

In 12 Schritten zum mobilen PC mit Paragon Drive Copy 11 und Microsoft Windows Virtual PC

Um ein solches Dokument zu erzeugen, muss eine Serienbriefvorlage in Word erstellt werden, das auf die von BüroWARE erstellte Datei zugreift.

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Über die Internetseite Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt.

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: )

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Übungen Programmieren 1 Felix Rohrer. Übungen

Konfiguration VLAN's. Konfiguration VLAN's IACBOX.COM. Version Deutsch

Zwischenablage (Bilder, Texte,...)

Transkript:

Grundlagen der Informatik Ausnahmebehandlung & Threads Prof. Dr. Bernhard Schiefer (basierend auf Unterlagen von Prof. Dr. Duque-Antón) bernhard.schiefer@fh-kl.de http://www.fh-kl.de/~schiefer

Inhalt Ausnahmebehandlung Threads

Fehlersituationen Wann treten Fehlersituationen auf? Ungültige Eingabewerte Programmierfehler Fehler der Laufzeitumgebung Mögliche Reaktionen auf Fehlersituationen Rückgabe eines speziellen Rückgabewertes Absturz der Anwendung Werfen einer Ausnahme

Rückgabe eines speziellen Rückgabewertes Beispiel: Funktion zur Berechnung der Fakultät (n!) int fak (int n) {... } Wie soll die Funktion auf negative Werte reagieren? Mögliche Designentscheidung: Rückgabe von -1 Im normalen Ablauf kann -1 niemals auftreten Nachteile / Probleme Fehleranfällig: Falls der/die Entwickler/in des aufrufenden Programms nicht aufpasst wird mit dem zurückgelieferten Wert weitergearbeitet, ohne zu merken, dass dieser falsch ist. Wie soll verfahren werden, wenn jeder Wert eine gültige Rückgabe darstellt? Beispiel: int div (int z, int n) {... }

Absturz der Anwendung Jeder Aufruf mit ungültigen Werten führt zum Programmabbruch Vorteil: Nachteil: Es wird nie aus Versehen mit fehlerhaften Werten gearbeitet Ein kommentarloser Absturz ist für Anwender inakzeptabel Um Abbruch zu umgehen, müssen daher alle denkbaren Fehlerfälle vor jedem Funktionsaufruf abgefragt werden Sehr aufwändig und fehleranfällig Das führt zu komplexen, schwer wartbaren Programmen

Ausnahmekonzepte Einige Programmiersprachen verfügen über ein spezielles Ausnahmekonzept: Jede Methode kann zusätzlich zum normalen Rückgabewert eine Ausnahme werfen Ausnahmen können entdeckt und signalisiert werden vom Betriebssystem vom Laufzeitsystem (z.b. Java VM) vom Entwickler selbst Ausnahmekonzepte findet man bei vielen Programmiersprachen: Java, C++, C#, Visual Basic.Net, PHP (ab Version 5), ABAP OO,... Die Konzepte unterscheiden sich in der Regel in den Details

Ausnahmebehandlung Strukturierte Ausnahmebehandlung Tritt eine Ausnahme auf, kann diese behandelt werden oder an die aufrufende Schicht weiter gegeben werden Die Entscheidung kann auch - von der Art der Ausnahme abhängig - in jeder Schicht unterschiedlich ausfallen Denkbar ist auch, dass zunächst eine eigene Behandlung erfolgt, die Ausnahme dann aber doch weiter gereicht wird. Wird eine Ausnahme bis zur letzten Schicht nicht behandelt, führt dies in der Regel zum Programmabbbruch. fn1 () fn2() fn3() fn4() fn5() - Wirft Exception

Ausnahmebehandlung in Java Ausnahmen können mit Hilfe des try/catch-konstruktes abgefangen werden. Ausnahmen werden als Instanzen von Unterklassen der Klasse Exception bzw. Throwable geliefert. Prinzip: try { // Anweisungen } catch (Exception e) { // Anweisungen zur Fehlerbehandlung } finally { // für Dinge, die auch im Ausnahmefall ausgeführt werden } Es können mehrere catch-anweisungen angegeben werden.

Die Klasse Throwable Java unterscheidet verschiedene Formen von Ausnahmen die relevanten Klassen sind: Throwable, Exception, Error Throwable Exception Error Die für Anwendungsentwickler nutzbaren Ausnahmen sind in der Regel Unterklassen von Exception

Beispiel für Exception-Hierarchie

Deklaration von Ausnahmen Ausnahmen, die in einer Methode bewusst geworfen werden, müssen in der Signatur der Methode deklariert werden. Beispiel: int demo (String arg) throws XYExcetion, YZException {... } Nicht alle denkbaren Ausnahmen müssen deklariert werden. Keine Deklaration ist erforderlich bei fatalen Fehlern, deren Auftreten normalerweise kein sinnvolles Weiterarbeiten ermöglicht: Unterklassen von Error Unterklassen von RuntimeException

Ausnahmen selbst werfen Ausnahmen können auch von eigenen Programmen erzeugt und geworfen werden Dabei ist nur die Nutzung vorhandener Klassen möglich, sondern auch das Schreiben eigener, von Exception abgeleiteter, Klassen Beispiel: Instanzen vorhandener Exception-Klassen Instanzen eigener Exception-Klassen public static int div (int z, int n) { if (n==0) { throw new IllegalArgumentException("Division durch 0!"); }... }

Eigene Ausnahmeklasse Große Freiheit besteht bei der Nutzung/Schaffung eigener Ausnahmeklassen. Beispiel: public class ExceptionDemo extends Exception { public ExceptionDemo(int z, int n) { super("div Operation gescheitert mit " + z + "/" + n); } } Deklaration bei Nutzung erforderlich: public static int div(int z, int n) throws ExceptionDemo { if (n == 0) { throw new ExceptionDemo(z,n); }... }

Reaktion auf Ausnahmen - Java Auf einer Ausnahme werden verschiedene hilfreiche Methode angeboten, die ermöglichen: Analyse, Protokollierung und Behandlung der Ausnahme Hilfreiche Methoden von Throwable: public String getmessage() public String getlocalizedmessage() public StackTraceElement[] getstacktrace() public void printstacktrace()

Threads Bei vielen Anwendungen ist es wünschenswert, dass verschiedene Abläufe für einen Benutzer parallel ablaufen: So möchte z.b. ein Nutzer eine Datei aus dem Internet laden, während er gleichzeitig einen Text in einem Bildschirmfenster schreibt. Nutzer wäre nicht zufrieden, wenn er während des Ladevorgangs jegliche Aktivität einstellen und untätig warten müsste.

Threads Ein (entfernter) Server, soll gleichzeitig viele Nutzer bedienen: So soll ein Amazon-Server (scheinbar) gleichzeitig und nicht nacheinander viele Anfragen bedienen können, d.h. alle anfragenden Nutzer sollen den Eindruck gewinnen, sie würden sofort (ohne Wartzeit) vom Server bedient werden. Hätte man genug physikalische Prozessoren, so könnte man alle Programme, die nicht voneinander abhängig sind, tatsächlich unabhängig auf verschiedenen Prozessoren ablaufen lassen. Da Laden einer beliebigen Datei und das Schreiben eines Textes nichts miteinander zu tun hat, wäre eine parallele Abarbeitung des obigen Beispiels auf einem Mehrprozessorsystem tatsächlich hilfreich.

Prozesskonzept Aus Kostengründen wurden in der Praxis früher oft nur Rechner mit einem einzigen Prozessor verwendet, so dass zu einem Zeitpunkt tatsächlich nur ein Programm den Prozessor besitzen konnte, d.h. verschiedene Programme können nur nacheinander auf dem Prozessor ablaufen. Bis in die sechziger Jahre waren die Betriebssysteme von Rechnern sogenannte Batch- Betriebssysteme, d.h. sie arbeiteten nach dem Prinzip des Stapelbetriebs Programm C Programm B Programm A Prozessor

Prozesskonzept Erste Betriebssysteme, die ein Prozesskonzept unterstützten, arbeiteten nach dem Prinzip der Zeitscheiben (Time Sharing Operation Systems). Jeder Prozess bekommt abwechselnd vom Scheduler eine bestimmte Zeit lang den Prozessor zur Verfügung gestellt. Statt einer realen parallelen Ausführung nun quasi-parallele Ausführung als Folge einer geeigneten sequentiellen Ausführung Zeitscheibe C B A C B A C B A Prozessor

Prozess-Kontext Jeder Prozess des Betriebssystems hat seinen eigenen Prozessekontext. Dieser besteht aus: Programmcode, Daten, Stack und Heap Prozessumgebung, mit Registerinhalten wie Stackpointer (Zeiger auf Stackanfang), Befehlszeiger (Zeiger auf nächste abzuarbeitende Anweisung) temporäre Daten und geöffnete Dateien, offene Datenbankverbindungen und ähnlichem

Prozess-Kontext Programmcode Daten Stack Heap... Segmente eines ablauffähigen Programms Wenn der Scheduler einen anderen Prozess zur Ausführung bringen will, dann findet ein sogenannter Kontextwechsel statt. Wegen des hohen Aufwands für den Kontextwechsel wird ein (Betriebssytem-) Prozess auch als schwergewichtiger Prozess bezeichnet.

Leichtgewichtige Prozesse: Threads Ein klassischer Betriebssytem-Prozess stellt eine Einheit sowohl für die Speicherverwaltung (Memory Management) als auch für das Scheduling dar. Ein Thread stellt nur eine Einheit für das Scheduling dar, so dass nun innerhalb eines Betriebssystems-Prozesses mehrere Threads ablaufen können.

Leichtgewichtige Prozesse: Threads Während dem Betriebssystem-Prozeß der Speicher zugeordnet ist und ein Kontextwechsel mit Aufwand beim Memory Management verbunden ist, ist ein Thread-Wechsel auf der CPU nicht mit der Verwaltung des Speichers gekoppelt und daher viel schneller realisierbar.

Zustandsübergabe von BS-Prozessen Prozesse haben Zustände, die von der aktuellen Zuordnung der Betriebsmittel abhängen. Im Bild wird ein vereinfachtes Diagramm dargestellt: Kreise stellen die Zustände eines Betriebssystem-Prozesses dar, Pfeile kennzeichnen die Übergänge zwischen den Zuständen

(User) Zustandsübergänge von Threads Threads haben ähnlich wie BS-Prozesse verschiedene Zustände. Die entsprechenden Übergänge erfolgen als Konsequenz von Methodenaufrufen wie z.b. sleep () aber auch durch Aktionen des Betriebssystems wie z.b. die Zuteilung des Prozessors durch den Scheduler.

Programmierung von Threads Im Gegensatz zu den meisten anderen Programmiersprachen sind Threads bereits im Sprachumfang enthalten und lassen sich daher sehr einfach programmieren, erzeugen und starten. In Java gibt es zwei Möglichkeiten, einen Thread zu programmieren: Durch eine direkte Ableitung von der Klasse Thread oder durch die Übergabe eines Objekts, dessen Klasse die Schnittstelle Runnable implementiert, an ein Objekt der Klasse Thread.

Programmierung von Threads Im ersten Fall wird eine eigene (Thread-) Klasse geschrieben und von der Klasse java.lang.thread abgeleitet. Dabei muss die Methode run ( ) der Klasse java.lang.thread überschrieben werden, Der in der Methode run ( ) enthaltenen Code wird während des running -Zustandes aus- geführt. Im zweiten Fall wird die Schnittstelle Runnable in der Klasse implementiert, die zum Thread werden soll. Die Schnittstelle Runnable deklariert nur eine einzige Methode run ( ). So schafft man sich die Möglichkeit, dass diese Klasse von einer anderen Klasse (außer java.lang.thread) abgeleitet werden kann.

Ableiten der Klasse Thread: TestThread import java.util.calendar; import java.util.gregoriancalendar; class Time extends Thread { public void run () { while (true) { GregorianCalendar d = new GregorianCalendar (); // aktuelle Zeit System.out.print (d.get(calendar.hour_of_day) + ":"); System.out.print (d.get(calendar.minute) + ":"); System.out.println (d.get(calendar.second)); try { sleep(1000);// try } catch (InterruptedException e) { } // catch } // while } // run } // class Time public class TestThread { public static void main (String args []) { Time t = new Time (); t.start ();... // Hier könnten weitere Threads erzeugt und gestartet werden!! } // main } // class TestThread

Implementieren der Schnittstelle Runnable Thread-Erzeugung: Mit dem new-operator eine Instanz der Klasse java.lang.thread generieren Als Übergabeparameter beim Konstruktor eine Referenz auf ein Objekt mitgibt, dessen Klasse die Schnittstelle Runnable implementiert <interface> Runnable Time1

Implementieren der Schnittstelle Runnable Innerhalb der Klasse Thread wird die übergebene Referenz in einem privaten Datenfeld vom Typ Runnable abgelegt, wie folgender Ausschnitt aus Thread-Implementierung zeigt: public class Thread { private Runnable target;... public Thread (Runnable target) {... this.target = target;... } // Konstruktor } // class Thread

Implementieren der Schnittstelle Runnable: Test1Thread import java.util.calendar; import java.util.gregoriancalendar; class Time1 implements Runnable { public void run () { while (true) { GregorianCalendar d = new GregorianCalendar (); System.out.print (d.get(calendar.hour_of_day) + ":"); System.out.print (d.get(calendar.minute) + ":"); System.out.println (d.get(calendar.second)); try { Thread.sleep(1000); } // try catch (InterruptedException e) { } // catch } // while } // run } // Time1 public class Test1Thread { public static void main (String args []) { Thread t = new Thread (new Time1()); t.start(); } // main } // class Test1Thread // Methode sleep ist eine Klassenmethode // der Klasse Thread

System-Threads Besonders erwähnenswert erscheint noch die Tatsache, dass die Mehrzahl der Threads nicht explizit vom Anwender erzeugt und gestartet werden, sondern implizit vom System Beispielprogramm: import public class TestThreadOutput public static void main (String[] args) { System.out.println ("Alle Threads beim Start von main"); ThreadTree.dump ( ); System.exit (0); } // main } // TestThreadOutput

System-Threads Mit Beispielprogramm kann folgende Ausgabe produziert werden: Alle Threads beim Start von main Thread[Reference Handler,10,system] Thread[Finalizer,8,system] Thread[Signal Dispatcher,9,system] Thread[Attach Listener,5,system] Thread[main,5,main] Es gibt also insgesamt 5 Threads, wobei nur der letzte Thread vom Anwender explizit generiert wurde. Alle anderen Threads wurden implizit vom System gestartet

Klasse ThreadTree Java-Programm, welches alle Threads ausgibt: public class ThreadTree { public static void dump ( ) { ThreadGroup application = Thread.currentThread().getThreadGroup (); ThreadGroup system = application.getparent (); int numberofthreads = system.activecount ( ); Thread[] threadlist = new Thread [numberofthreads]; int threadnumber = system.enumerate (threadlist); for (int i = 0; i < threadnumber; i++) { System.out.println (threadlist [i] ); } // for } // dump } // ThreadTree