Hier mal ein kleines Tutorial (Ja, hatte Langeweile :-P), wie man bei einem Debugging vorgeht. Bezug hierdrauf dient Knuddels, die extra eine "Aufgabe" unter Jobs online gestellt haben.
Wie geht man nun vor, wenn man etwas Debuggen möchte? Debugging ist ja nichts anderes als einer Fehleranalyse. Dementsprechend werden absichtlich Fehler Produziert um dann das Verhalten weiter zu behandeln und ggf. Korrekturen am Snippet vor zu nehmen.
Bei den Markierungen (Markierung 1 - 4) können also diverse Exceptions geworfen werden. Jetzt wäre nur noch die Frage, welche,...
Dies ist relativ einfach zu beantworten:
Man setze bei jeder Makierung (Oben und unten) ein error-printer (System.err.println()

um diese Ausgaben von den normalen zu unterscheiden, und setzt als Aushabe die Markierung selber.
Warum?
Ganz einfach. Wenn die Methode nun durch läuft, kann ganz genau nachvollzogen werden, ob die Markierung an dieser stelle Fehler zurückwirft, oder ob es weiter geht.
Wie sieht dann nun unser Script aus?
|
Java-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
public class Jobs {
public static void main(String[] args) {
f(0,999999999);
}
public static void f(int x, int y) {
// Markierung 1
System.err.println("// Markierung 1 - Start");
String[] strings = new String[x];
System.err.println("// Markierung 1 - Ende");
for(int i = 0; i < y; ++i) {
// Markierung 2
System.err.println("// Markierung 2 - Start");
strings[i] = Integer.toString(i);
System.err.println("// Markierung 2 - Ende");
}
for(int i = 0; i < y; ++i) {
// Markierung 3
System.err.println("// Markierung 3 - Start");
strings[i] = strings[i].concat(" Wert");
System.err.println("// Markierung 3 - ende");
}
for(int i = 0; i < x; ++i) {
// Markierung 4
System.err.println("// Markierung 4 - Start");
System.out.println(strings[i].toString());
System.err.println("// Markierung 4 - Ende");
}
}
}
|
Und wie wird nun damit Debuggt?
Hierfür sehen wir uns die Methode
f genauer an.
Die Methode läuft mehrere for-Schleifen ab, endpunkt hierfür sind die Integer-Werte aus den Parametern.
Wenn der Wert erreich wird, ist die Schleife beendet. Was kann also rein Logisch gesehen passieren? Genau. Die Schleife kann unendlich durchlaufen (Was hier aber nicht passieren kann, die Schleife wird durch Werte begrenzt). Was kann aber auch passieren? Genau - Nichts. Eigendlich Schwachsinn, denn Knuddels kat bei den Fragen überall "keine" als Antwort stehen. Dies müsste rein Theoretisch auch als "korrekt" angesehen werden.
Kommen wir nun zum Debuggen.
Was müssen wir nun machen, damit wir Fehler finden?
Wir nehmen uns die Methode
f und setzen immer wieder unterschiedliche Parameter, um zu sehen, ob Exceptions geworfen werden - Und wenn ja, welche.
Was kann man nun testen?
Die größte Zahl die es gibt:
|
Java-Quelltext
|
1
2
3
4
5
|
f(0, 999999999);
// oder
f(999999999, 0);
// oder
f(999999999, 999999999);
|
Verhalten bei Nullen:
|
Java-Quelltext
|
1
|
f(0, 0);
|
Verhalten bei negativen Zahlen ins Positive:
|
Java-Quelltext
|
1
2
3
|
f(-1, 0);
// oder
f(0, 1);
|
Verhalten bei negativen Zahlen:
|
Java-Quelltext
|
1
|
f(-1, -1);
|
Verhalten bei positiven Zahlen:
|
Java-Quelltext
|
1
|
f(1, 1);
|
Verhalten bei positiven Zahlen ins Negative:
|
Java-Quelltext
|
1
2
3
|
f(1, -1);
// oder
f(1, 0);
|
Und damit sollte der Grundbaustein gelegt sein.