Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

📚 The CoCalc Library - books, templates and other resources

132931 views
License: OTHER
1
\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
2
\usepackage{../templates/myStyle}
3
4
\begin{document}
5
\title{\titleText}
6
\subtitle{Wildcards, equals(), Exceptions}
7
\author{\tutor}
8
\date{\today}
9
\subject{Programmieren}
10
11
\frame{\titlepage}
12
13
\frame{
14
\frametitle{Inhaltsverzeichnis}
15
\setcounter{tocdepth}{1}
16
\tableofcontents
17
\setcounter{tocdepth}{2}
18
}
19
20
\section{Einleitung}
21
\subsection{Quiz}
22
\begin{frame}{Quiz}
23
\begin{minipage}[b]{0.45\linewidth}
24
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Main.java}
25
\end{minipage}
26
\hspace{0.5cm}
27
\begin{minipage}[b]{0.45\linewidth}
28
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Fruit.java, frame=lines, firstline=1, lastline=1]{java}{Fruit.java}
29
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Apple.java, frame=lines, firstline=1, lastline=1]{java}{Apple.java}
30
\begin{itemize}
31
\item Gibt es einen Compiler-Fehler?
32
\item Gibt es einen Laufzeit-Fehler?
33
\item Gibt es eine Ausgabe? Welche?
34
\end{itemize}
35
\end{minipage}
36
\end{frame}
37
38
\begin{frame}{Quiz: Antwort}
39
\begin{block}{Compiler-Fehler}
40
Type mismatch: cannot convert from List<Apple> to List<Fruit>
41
\end{block}
42
43
\begin{itemize}[<+->]
44
\item Ohne Zeile 16 gibt es folgende Ausgabe:\\
45
\myCode{class java.util.LinkedList}\\
46
\myCode{class java.util.LinkedList}
47
\item Sowohl \myCode{myFruits = myApples;} als auch \myCode{myApples = myFruits;}
48
geben einen Compiler-Fehler
49
\end{itemize}
50
\end{frame}
51
52
\begin{frame}{Quiz: Problem}
53
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Fruit-Example-Problem.java}
54
\end{frame}
55
56
\begin{frame}{Quiz: Lösung \#1}
57
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Quiz-solution.java}
58
\end{frame}
59
60
\begin{frame}{Quiz: Lösung \#2}
61
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Quiz-solution2.java}
62
\end{frame}
63
64
\begin{frame}{Beispiel}
65
\begin{minipage}[b]{0.45\linewidth}
66
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cage.java, frame=lines]{java}{Cage.java}
67
\end{minipage}
68
\hspace{0.5cm}
69
\begin{minipage}[b]{0.45\linewidth}
70
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Animal.java}
71
\end{minipage}
72
73
{\tiny Source: \href{http://stackoverflow.com/a/6828257/562769}{StackOverflow}}
74
\end{frame}
75
76
\section{Generics}
77
\subsection{Wildcards}
78
\begin{frame}{Wildcards}
79
\begin{itemize}[<+->]
80
\item Das \myCode{?} in \myCode{List<?> myList} wird Wildcard
81
genannt
82
\item \myCode{?} steht immer nur in der Deklaration, nie in der Initialisierung
83
\item[$\Rightarrow$] \myCode{?} nur links vom \myCode{=}
84
\item \myCode{List<?> myList} ist eine "`unbounded Wildcard"'
85
\begin{itemize}
86
\item \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=1, lastline=3]{java}{singleLines.java}
87
\item \myCode{?} ein bestimmter, aber nicht angegebener Parameter\\
88
\item[$\Rightarrow$] kann zur Compile-Zeit nicht überprüft werden\\
89
\item[$\Rightarrow$] Liste darf nicht modifiziert werden
90
\end{itemize}
91
\item \myCode{List<? extends Fruit> myList} und \myCode{List<? super Fruit> myList} sind "`bounded Wildcards"'
92
\end{itemize}
93
\end{frame}
94
95
\begin{frame}{Bounded Wildcards: extends}
96
\begin{itemize}[<+->]
97
\item \myCode{List<? extends Fruit> myList} kann als Elemente
98
\myCode{Fruit} und \myCode{Apple} haben, nicht jedoch
99
\myCode{Object}
100
\item Hinweis: "`extends"' ist hier nicht exakt das gleiche
101
wie bei der Vererbung. Es kann entweder wirklich "`extends"'
102
oder "`implements"' bedeuten
103
\item Sowohl in \myCode{List<Fruit>} als auch in
104
\myCode{List<? extends Fruit>} können
105
\myCode{Fruit} und \myCode{Apple} beinhalten
106
\end{itemize}
107
\end{frame}
108
109
\begin{frame}{Bounded Wildcards: super}
110
\begin{itemize}[<+->]
111
\item \myCode{List<? super Fruit> myList} kann als Elemente
112
\myCode{Fruit} und \myCode{Object} haben, nicht jedoch
113
\end{itemize}
114
\end{frame}
115
116
\begin{frame}{Namenskonvetionen}
117
Für die Parameter sind folgende Bezeichnungen üblich:
118
\begin{itemize}
119
\item E - Element (used extensively by the Java Collections Framework)
120
\item K - Key
121
\item N - Number
122
\item T - Type
123
\item V - Value
124
\item S, U, V etc. - 2nd, 3rd, 4th types
125
\end{itemize}
126
127
z.B.
128
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=23, lastline=39]{java}{singleLines.java}
129
\end{frame}
130
131
\subsection{Generics und Polymorphismus}
132
\begin{frame}{Generics und Polymorphismus}
133
\begin{itemize}
134
\item Polymorphismus: \myCode{Fruit myVariable = new Apple();}\\
135
{\tiny links allgemeiner als rechts}
136
\item Generics: \myCode{LinkedList<Fruit> myList = new LinkedList<Apple>();}\\
137
{\tiny Compiler-Fehler: Type mismatch: cannot convert from LinkedList<Apple> to LinkedList<Fruit>}
138
\end{itemize}
139
\end{frame}
140
141
\subsection{Fazit}
142
\begin{frame}{Fazit}
143
\begin{itemize}
144
\item Wildcards sind schwer
145
\item Wildcards werdet ihr vermutlich bei den Abschlussaufgaben
146
nicht benötigen
147
\end{itemize}
148
\end{frame}
149
150
\subsection{Quellen und Ressourcen}
151
\begin{frame}{Quellen und Ressourcen}
152
\begin{itemize}
153
\item \href{http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html}{JavaDoc Tutorial - Wildcards}
154
\item \href{http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html}{JavaDoc Tutorial - Wildcards} (extra)
155
\item \href{http://stackoverflow.com/q/3009745/562769}{What does the question mark in Java generics' type parameter mean?}
156
\item \href{http://stackoverflow.com/q/12340808/562769}{What's the difference between List<Object> and List<?>}
157
\item \href{http://stackoverflow.com/q/12348777/562769}{Java: Wildcards again}
158
\item \href{http://stackoverflow.com/q/14091771/562769}{Incompatible type with Arrays.asList()}
159
\item \href{http://stackoverflow.com/q/252055/562769}{Java Generics (Wildcards)}
160
\end{itemize}
161
\end{frame}
162
163
\section{equals}
164
\subsection{Allgemein}
165
\begin{frame}{Allgemein}
166
\begin{itemize}[<+->]
167
\item Man will ein beliebiges Objekt mit dem momentanen
168
Objekt auf Gleichheit vergleichen
169
\item Dazu nutzt man \myCode{myObject.equals(otherObject);}
170
\item \myCode{myObject} muss dann die \myCode{equals(Object obj)} implementieren
171
\end{itemize}
172
173
Die Implementierung läuft fast immer gleich ab:
174
\begin{itemize}[<+->]
175
\item ist \myCode{obj == null} $\rightarrow$ \myCode{return false;}
176
\item ist \myCode{!(obj instanceof MyClass)} $\rightarrow$ \myCode{return false;}
177
\item other = (MyClass) obj;
178
\item vergleich der (relevanten) Attribute
179
\end{itemize}
180
\end{frame}
181
182
\subsection{Eclipse}
183
\begin{frame}{Eclipse}
184
\begin{itemize}
185
\item Eclipse kann die equals()-Methode generieren
186
\item \menu{Source > Generate hashCode() and equals()...}
187
\item Felder auswählen, die für den vergleich wichtig sind
188
\item nochmals drüber schauen
189
\end{itemize}
190
\end{frame}
191
192
\section{Exceptions}
193
\subsection{Allgemeines}
194
\begin{frame}{Allgemeines}
195
Exceptions \dots
196
\begin{itemize}[<+->]
197
\item \dots sind Objekte vom Typ Throwable
198
\item \dots unterbrechen den normalen Ablauf eines Programms
199
\item Mit dem Schlüsselwort \myCode{throw} werden Exceptions
200
geworfen und mit \myCode{catch} kann man sie abfangen.
201
\end{itemize}
202
203
\pause[\thebeamerpauses]
204
205
\begin{exampleblock}{Beispiele für Exceptions}
206
\begin{itemize}
207
\item NullPointerException
208
\item ArrayIndexOutOfBoundsException
209
\item IllegalArgumentException
210
\item IllegalStateException
211
\item IOException
212
\item \dots
213
\end{itemize}
214
\end{exampleblock}
215
\end{frame}
216
217
\begin{frame}{Beispiel: Fibonacci.java}
218
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Fibonacci.java}
219
\end{frame}
220
221
\begin{frame}{Beispiel: Main.java}
222
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Main-Fibonacci.java}
223
\end{frame}
224
225
\subsection{Pokemon Exception Handling}
226
\begin{frame}{Anti-Pattern: Pokémon Exception Handling}
227
\includegraphics[width=0.5\linewidth]{pokemon.jpg}
228
229
For when you just Gotta Catch 'Em All.
230
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=5, lastline=9]{java}{singleLines.java}
231
\end{frame}
232
233
\begin{frame}{Anti-Pattern: Pokémon Exception Handling}
234
Niemals Pokémon Exception Handling anwenden!
235
\begin{itemize}[<+->]
236
\item Die Fehlerbehandlung mit \myCode{catch} wird verwendet,
237
um den Programmablauf nach einem Fehler zu definieren
238
\item Bei unterschiedlichen Fehlern will man meist unterschiedlich
239
weiter machen, z.B.
240
\begin{itemize}
241
\item IOException: nochmals versuchen
242
\item NullPointerException: Fehlerbericht an den Entwickler schicken
243
\item IllegalArgumentException: Fehlerausgabe an den Nutzer
244
\end{itemize}
245
\item Durch die verschiedenen \myCode{catch}-Blöcke zeigst du,
246
dass du an die verschiedenen Fehlerarten gedacht hast
247
\end{itemize}
248
\end{frame}
249
250
\begin{frame}{Größe des try-Blocks}
251
\begin{block}{Wichtig}
252
Der try-Block sollte so klein wie möglich sein.
253
\end{block}
254
255
Gründe:
256
\begin{itemize}
257
\item Beim lesen eures Codes wird klarer, wo das Problem
258
auftreten kann
259
\item Effizienz
260
\end{itemize}
261
\end{frame}
262
263
\begin{frame}{Eigene Exceptions}
264
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=UniverseExplodeException.java, frame=lines]{java}{UniverseExplodeException.java}
265
\end{frame}
266
267
\begin{frame}{@throws und throws}
268
\begin{itemize}
269
\item Exceptions, die nicht von RuntimeException erben, müssen angekündigt werden
270
\item Ankündigen funktioniert über JavaDoc-Annotation \myCode{@throws} und Methodensignatur mit \myCode{throws}
271
\end{itemize}
272
273
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=11, lastline=21]{java}{singleLines.java}
274
\end{frame}
275
276
\subsection{Literatur}
277
\begin{frame}{Literatur}
278
\begin{itemize}
279
\item \href{http://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html}{Catching and Handling Exceptions}
280
\item \href{http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html\#jls-14.20}{JLS 7, Kapitel 14.20}
281
\end{itemize}
282
\end{frame}
283
284
\section{Praxis}
285
\subsection{Türme von Hanoi}
286
\begin{frame}{Türme von Hanoi: Beschreibung}
287
Das Spiel besteht aus drei Stäben A, B und C, auf die mehrere gelochte Scheiben gelegt werden,
288
alle verschieden groß.\\
289
Zu Beginn liegen alle Scheiben auf Stab A, der Größe nach geordnet, mit der
290
größten Scheibe unten und der kleinsten oben.\\
291
Ziel des Spiels ist es, den kompletten Scheiben-Stapel
292
von A nach C zu versetzen.\\
293
Bei jedem Zug darf die oberste Scheibe eines beliebigen Stabes auf einen
294
der beiden anderen Stäbe gelegt werden, vorausgesetzt, dort liegt nicht schon eine kleinere Scheibe.
295
Folglich sind zu jedem Zeitpunkt des Spieles die Scheiben auf jedem Feld der Größe nach geordnet.
296
\end{frame}
297
298
\begin{frame}{Aufgaben}
299
\begin{block}{Klasse "`Disc"'}
300
Schreiben Sie zunächst eine Klasse Disc, die eine gelochte
301
Scheibe repräsentiert und als Attribut einen Durchmesser hat.
302
\end{block}
303
304
\begin{block}{Klasse "`Pole"'}
305
Schreiben Sie außerdem eine Klasse Pole, die einen Stab repräsentiert. Ein solcher Stab verwaltet eine
306
Menge von Discs (in einem fest dimensionierten Array) und hat als Attribut einen Namen. Die Klasse
307
Pole stellt dabei sicher, dass die Scheiben immer in geordneter Reihenfolge (wie oben beschrieben)
308
auf dem Stab liegen. Hierfür stellt die Klasse Pole die Methoden
309
\myCode{public boolean push(Disc d)} und
310
\myCode{public Disc pop()} zur Verfügung.
311
\end{block}
312
\end{frame}
313
314
\begin{frame}{Aufgaben}
315
\begin{block}{Methode push}
316
Die Methode push(Disc d) legt die Scheibe d auf den Stab,
317
falls dieser noch nicht voll ist und
318
der Durchmesser der Scheibe d kleiner ist als der Durchmesser
319
der obersten Scheibe des Stabes. Wird
320
die Scheibe erfolgreich auf den Stab gelegt, so ist der
321
Rückgabewert der Methode true, andernfalls
322
false.
323
\end{block}
324
325
\begin{block}{Methode pop}
326
Die Methode pop() entfernt die oberste Scheibe des Stabes und
327
liefert diese als Rückgabewert. Falls
328
der Stab leer ist, soll der Rückgabewert null sein.
329
\end{block}
330
331
Schreiben Sie, falls nötig, weitere Schnittstellen
332
(z.B. eine Methode size()) und toString()-Methoden.
333
\end{frame}
334
335
\begin{frame}{Aufgaben}
336
Eine weitere Klasse Hanoi soll die main-Methode und eine Methode mit der Signatur
337
\myCode{public static void move(Pole from, Pole help, Pole to)}
338
erhalten. Die Methode \myCode{move(Pole from, Pole help, Pole to)} legt dabei alle Scheiben das
339
Stabes from mit Hilfe des Stabes help auf den Stab to. Implementieren Sie diese Methode rekursiv.
340
Erzeugen Sie dann in der main-Methode einen Stab A mit mehreren Scheiben und zusätzlich zwei leere
341
Stäbe B und C. Verwenden Sie dann die Methode move(), um die Scheiben von Stab A mit Hilfe des
342
Stabes B auf Stab C zu legen.
343
\end{frame}
344
345
\section{Abspann}
346
\subsection{Klausuranmeldung}
347
\begin{frame}{Klausuranmeldung}
348
Ist die Klausuranmeldung schon möglich? Bitte anmelden!
349
\end{frame}
350
351
\subsection{Kommende Tutorien}
352
\begin{frame}{Kommende Tutorien}
353
\begin{itemize}
354
\item[4.] 07.01.2013
355
\item[3.] 14.01.2013
356
\item[2.] 21.01.2013
357
\item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
358
\item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
359
\item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
360
\end{itemize}
361
\end{frame}
362
363
\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/Teach-yourself-C++-in-21-days.png}
364
365
\end{document}
366
367