📚 The CoCalc Library - books, templates and other resources
cocalc-examples / martinthoma-latex-examples / presentations / Programmieren-Tutorium / Tutorium-10 / tutorium-10.tex
132940 viewsLicense: OTHER
\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}1\usepackage{../templates/myStyle}23\begin{document}4\title{\titleText}5\subtitle{Wildcards, equals(), Exceptions}6\author{\tutor}7\date{\today}8\subject{Programmieren}910\frame{\titlepage}1112\frame{13\frametitle{Inhaltsverzeichnis}14\setcounter{tocdepth}{1}15\tableofcontents16\setcounter{tocdepth}{2}17}1819\section{Einleitung}20\subsection{Quiz}21\begin{frame}{Quiz}22\begin{minipage}[b]{0.45\linewidth}23\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Main.java}24\end{minipage}25\hspace{0.5cm}26\begin{minipage}[b]{0.45\linewidth}27\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Fruit.java, frame=lines, firstline=1, lastline=1]{java}{Fruit.java}28\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Apple.java, frame=lines, firstline=1, lastline=1]{java}{Apple.java}29\begin{itemize}30\item Gibt es einen Compiler-Fehler?31\item Gibt es einen Laufzeit-Fehler?32\item Gibt es eine Ausgabe? Welche?33\end{itemize}34\end{minipage}35\end{frame}3637\begin{frame}{Quiz: Antwort}38\begin{block}{Compiler-Fehler}39Type mismatch: cannot convert from List<Apple> to List<Fruit>40\end{block}4142\begin{itemize}[<+->]43\item Ohne Zeile 16 gibt es folgende Ausgabe:\\44\myCode{class java.util.LinkedList}\\45\myCode{class java.util.LinkedList}46\item Sowohl \myCode{myFruits = myApples;} als auch \myCode{myApples = myFruits;}47geben einen Compiler-Fehler48\end{itemize}49\end{frame}5051\begin{frame}{Quiz: Problem}52\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Fruit-Example-Problem.java}53\end{frame}5455\begin{frame}{Quiz: Lösung \#1}56\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Quiz-solution.java}57\end{frame}5859\begin{frame}{Quiz: Lösung \#2}60\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Quiz-solution2.java}61\end{frame}6263\begin{frame}{Beispiel}64\begin{minipage}[b]{0.45\linewidth}65\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cage.java, frame=lines]{java}{Cage.java}66\end{minipage}67\hspace{0.5cm}68\begin{minipage}[b]{0.45\linewidth}69\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Animal.java}70\end{minipage}7172{\tiny Source: \href{http://stackoverflow.com/a/6828257/562769}{StackOverflow}}73\end{frame}7475\section{Generics}76\subsection{Wildcards}77\begin{frame}{Wildcards}78\begin{itemize}[<+->]79\item Das \myCode{?} in \myCode{List<?> myList} wird Wildcard80genannt81\item \myCode{?} steht immer nur in der Deklaration, nie in der Initialisierung82\item[$\Rightarrow$] \myCode{?} nur links vom \myCode{=}83\item \myCode{List<?> myList} ist eine "`unbounded Wildcard"'84\begin{itemize}85\item \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=1, lastline=3]{java}{singleLines.java}86\item \myCode{?} ein bestimmter, aber nicht angegebener Parameter\\87\item[$\Rightarrow$] kann zur Compile-Zeit nicht überprüft werden\\88\item[$\Rightarrow$] Liste darf nicht modifiziert werden89\end{itemize}90\item \myCode{List<? extends Fruit> myList} und \myCode{List<? super Fruit> myList} sind "`bounded Wildcards"'91\end{itemize}92\end{frame}9394\begin{frame}{Bounded Wildcards: extends}95\begin{itemize}[<+->]96\item \myCode{List<? extends Fruit> myList} kann als Elemente97\myCode{Fruit} und \myCode{Apple} haben, nicht jedoch98\myCode{Object}99\item Hinweis: "`extends"' ist hier nicht exakt das gleiche100wie bei der Vererbung. Es kann entweder wirklich "`extends"'101oder "`implements"' bedeuten102\item Sowohl in \myCode{List<Fruit>} als auch in103\myCode{List<? extends Fruit>} können104\myCode{Fruit} und \myCode{Apple} beinhalten105\end{itemize}106\end{frame}107108\begin{frame}{Bounded Wildcards: super}109\begin{itemize}[<+->]110\item \myCode{List<? super Fruit> myList} kann als Elemente111\myCode{Fruit} und \myCode{Object} haben, nicht jedoch112\end{itemize}113\end{frame}114115\begin{frame}{Namenskonvetionen}116Für die Parameter sind folgende Bezeichnungen üblich:117\begin{itemize}118\item E - Element (used extensively by the Java Collections Framework)119\item K - Key120\item N - Number121\item T - Type122\item V - Value123\item S, U, V etc. - 2nd, 3rd, 4th types124\end{itemize}125126z.B.127\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=23, lastline=39]{java}{singleLines.java}128\end{frame}129130\subsection{Generics und Polymorphismus}131\begin{frame}{Generics und Polymorphismus}132\begin{itemize}133\item Polymorphismus: \myCode{Fruit myVariable = new Apple();}\\134{\tiny links allgemeiner als rechts}135\item Generics: \myCode{LinkedList<Fruit> myList = new LinkedList<Apple>();}\\136{\tiny Compiler-Fehler: Type mismatch: cannot convert from LinkedList<Apple> to LinkedList<Fruit>}137\end{itemize}138\end{frame}139140\subsection{Fazit}141\begin{frame}{Fazit}142\begin{itemize}143\item Wildcards sind schwer144\item Wildcards werdet ihr vermutlich bei den Abschlussaufgaben145nicht benötigen146\end{itemize}147\end{frame}148149\subsection{Quellen und Ressourcen}150\begin{frame}{Quellen und Ressourcen}151\begin{itemize}152\item \href{http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html}{JavaDoc Tutorial - Wildcards}153\item \href{http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html}{JavaDoc Tutorial - Wildcards} (extra)154\item \href{http://stackoverflow.com/q/3009745/562769}{What does the question mark in Java generics' type parameter mean?}155\item \href{http://stackoverflow.com/q/12340808/562769}{What's the difference between List<Object> and List<?>}156\item \href{http://stackoverflow.com/q/12348777/562769}{Java: Wildcards again}157\item \href{http://stackoverflow.com/q/14091771/562769}{Incompatible type with Arrays.asList()}158\item \href{http://stackoverflow.com/q/252055/562769}{Java Generics (Wildcards)}159\end{itemize}160\end{frame}161162\section{equals}163\subsection{Allgemein}164\begin{frame}{Allgemein}165\begin{itemize}[<+->]166\item Man will ein beliebiges Objekt mit dem momentanen167Objekt auf Gleichheit vergleichen168\item Dazu nutzt man \myCode{myObject.equals(otherObject);}169\item \myCode{myObject} muss dann die \myCode{equals(Object obj)} implementieren170\end{itemize}171172Die Implementierung läuft fast immer gleich ab:173\begin{itemize}[<+->]174\item ist \myCode{obj == null} $\rightarrow$ \myCode{return false;}175\item ist \myCode{!(obj instanceof MyClass)} $\rightarrow$ \myCode{return false;}176\item other = (MyClass) obj;177\item vergleich der (relevanten) Attribute178\end{itemize}179\end{frame}180181\subsection{Eclipse}182\begin{frame}{Eclipse}183\begin{itemize}184\item Eclipse kann die equals()-Methode generieren185\item \menu{Source > Generate hashCode() and equals()...}186\item Felder auswählen, die für den vergleich wichtig sind187\item nochmals drüber schauen188\end{itemize}189\end{frame}190191\section{Exceptions}192\subsection{Allgemeines}193\begin{frame}{Allgemeines}194Exceptions \dots195\begin{itemize}[<+->]196\item \dots sind Objekte vom Typ Throwable197\item \dots unterbrechen den normalen Ablauf eines Programms198\item Mit dem Schlüsselwort \myCode{throw} werden Exceptions199geworfen und mit \myCode{catch} kann man sie abfangen.200\end{itemize}201202\pause[\thebeamerpauses]203204\begin{exampleblock}{Beispiele für Exceptions}205\begin{itemize}206\item NullPointerException207\item ArrayIndexOutOfBoundsException208\item IllegalArgumentException209\item IllegalStateException210\item IOException211\item \dots212\end{itemize}213\end{exampleblock}214\end{frame}215216\begin{frame}{Beispiel: Fibonacci.java}217\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Fibonacci.java}218\end{frame}219220\begin{frame}{Beispiel: Main.java}221\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Main-Fibonacci.java}222\end{frame}223224\subsection{Pokemon Exception Handling}225\begin{frame}{Anti-Pattern: Pokémon Exception Handling}226\includegraphics[width=0.5\linewidth]{pokemon.jpg}227228For when you just Gotta Catch 'Em All.229\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=5, lastline=9]{java}{singleLines.java}230\end{frame}231232\begin{frame}{Anti-Pattern: Pokémon Exception Handling}233Niemals Pokémon Exception Handling anwenden!234\begin{itemize}[<+->]235\item Die Fehlerbehandlung mit \myCode{catch} wird verwendet,236um den Programmablauf nach einem Fehler zu definieren237\item Bei unterschiedlichen Fehlern will man meist unterschiedlich238weiter machen, z.B.239\begin{itemize}240\item IOException: nochmals versuchen241\item NullPointerException: Fehlerbericht an den Entwickler schicken242\item IllegalArgumentException: Fehlerausgabe an den Nutzer243\end{itemize}244\item Durch die verschiedenen \myCode{catch}-Blöcke zeigst du,245dass du an die verschiedenen Fehlerarten gedacht hast246\end{itemize}247\end{frame}248249\begin{frame}{Größe des try-Blocks}250\begin{block}{Wichtig}251Der try-Block sollte so klein wie möglich sein.252\end{block}253254Gründe:255\begin{itemize}256\item Beim lesen eures Codes wird klarer, wo das Problem257auftreten kann258\item Effizienz259\end{itemize}260\end{frame}261262\begin{frame}{Eigene Exceptions}263\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=UniverseExplodeException.java, frame=lines]{java}{UniverseExplodeException.java}264\end{frame}265266\begin{frame}{@throws und throws}267\begin{itemize}268\item Exceptions, die nicht von RuntimeException erben, müssen angekündigt werden269\item Ankündigen funktioniert über JavaDoc-Annotation \myCode{@throws} und Methodensignatur mit \myCode{throws}270\end{itemize}271272\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=11, lastline=21]{java}{singleLines.java}273\end{frame}274275\subsection{Literatur}276\begin{frame}{Literatur}277\begin{itemize}278\item \href{http://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html}{Catching and Handling Exceptions}279\item \href{http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html\#jls-14.20}{JLS 7, Kapitel 14.20}280\end{itemize}281\end{frame}282283\section{Praxis}284\subsection{Türme von Hanoi}285\begin{frame}{Türme von Hanoi: Beschreibung}286Das Spiel besteht aus drei Stäben A, B und C, auf die mehrere gelochte Scheiben gelegt werden,287alle verschieden groß.\\288Zu Beginn liegen alle Scheiben auf Stab A, der Größe nach geordnet, mit der289größten Scheibe unten und der kleinsten oben.\\290Ziel des Spiels ist es, den kompletten Scheiben-Stapel291von A nach C zu versetzen.\\292Bei jedem Zug darf die oberste Scheibe eines beliebigen Stabes auf einen293der beiden anderen Stäbe gelegt werden, vorausgesetzt, dort liegt nicht schon eine kleinere Scheibe.294Folglich sind zu jedem Zeitpunkt des Spieles die Scheiben auf jedem Feld der Größe nach geordnet.295\end{frame}296297\begin{frame}{Aufgaben}298\begin{block}{Klasse "`Disc"'}299Schreiben Sie zunächst eine Klasse Disc, die eine gelochte300Scheibe repräsentiert und als Attribut einen Durchmesser hat.301\end{block}302303\begin{block}{Klasse "`Pole"'}304Schreiben Sie außerdem eine Klasse Pole, die einen Stab repräsentiert. Ein solcher Stab verwaltet eine305Menge von Discs (in einem fest dimensionierten Array) und hat als Attribut einen Namen. Die Klasse306Pole stellt dabei sicher, dass die Scheiben immer in geordneter Reihenfolge (wie oben beschrieben)307auf dem Stab liegen. Hierfür stellt die Klasse Pole die Methoden308\myCode{public boolean push(Disc d)} und309\myCode{public Disc pop()} zur Verfügung.310\end{block}311\end{frame}312313\begin{frame}{Aufgaben}314\begin{block}{Methode push}315Die Methode push(Disc d) legt die Scheibe d auf den Stab,316falls dieser noch nicht voll ist und317der Durchmesser der Scheibe d kleiner ist als der Durchmesser318der obersten Scheibe des Stabes. Wird319die Scheibe erfolgreich auf den Stab gelegt, so ist der320Rückgabewert der Methode true, andernfalls321false.322\end{block}323324\begin{block}{Methode pop}325Die Methode pop() entfernt die oberste Scheibe des Stabes und326liefert diese als Rückgabewert. Falls327der Stab leer ist, soll der Rückgabewert null sein.328\end{block}329330Schreiben Sie, falls nötig, weitere Schnittstellen331(z.B. eine Methode size()) und toString()-Methoden.332\end{frame}333334\begin{frame}{Aufgaben}335Eine weitere Klasse Hanoi soll die main-Methode und eine Methode mit der Signatur336\myCode{public static void move(Pole from, Pole help, Pole to)}337erhalten. Die Methode \myCode{move(Pole from, Pole help, Pole to)} legt dabei alle Scheiben das338Stabes from mit Hilfe des Stabes help auf den Stab to. Implementieren Sie diese Methode rekursiv.339Erzeugen Sie dann in der main-Methode einen Stab A mit mehreren Scheiben und zusätzlich zwei leere340Stäbe B und C. Verwenden Sie dann die Methode move(), um die Scheiben von Stab A mit Hilfe des341Stabes B auf Stab C zu legen.342\end{frame}343344\section{Abspann}345\subsection{Klausuranmeldung}346\begin{frame}{Klausuranmeldung}347Ist die Klausuranmeldung schon möglich? Bitte anmelden!348\end{frame}349350\subsection{Kommende Tutorien}351\begin{frame}{Kommende Tutorien}352\begin{itemize}353\item[4.] 07.01.2013354\item[3.] 14.01.2013355\item[2.] 21.01.2013356\item[1.] 28.01.2013: Abschlussprüfunsvorbereitung357\item[0.] 04.02.2013: Abschlussprüfunsvorbereitung358\item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})359\end{itemize}360\end{frame}361362\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/Teach-yourself-C++-in-21-days.png}363364\end{document}365366367