Statische Methoden (3)
Globale Pläne, lokale Stolpersteine!
In der Grundschule haben Sie vielleicht einmal das Spiel "Die böse 7" gespielt. In einem Kreis von Schülern wird immer weiter gezählt. Immer, wenn eine Zahl drankommt, die durch 7 teilbar ist, darf man nicht die Zahl selbst nennen, sondern man muss "plumps" sagen. Wer sich vertut, scheidet aus.
public class Böse7 {
static boolean böse(int kandidat) {
return (kandidat%7==0);
}
public static void main(String[] args) throws Exception {
System.out.println("Böse 7\n");
for (int i=1 ; i<100 ; i++) {
if (böse(i)) {
System.out.print("plumps ");
} else {
System.out.print(i+" ");
}
Thread.sleep(500);
}
}
}
Sie möchten dieses Spiel so programmieren, dass die "böse" Zahl fei gewählt werden kann. Sie fügen also einen Scanner ein, lassen sich vom Benutzer die böse Zahl sagen und speichern diese in einer Integervariablen.
import java.util.*;
public class BöseZahl {
static boolean böse(int kandidat) {
return (kandidat%böseZahl==0);
}
public static void main(String[] args) throws Exception {
System.out.println("Böse Zahl\n");
Scanner Eingabe = new Scanner(System.in);
System.out.print("Welche Zahl ist heute die böse? ");
int böseZahl = Eingabe.nextInt();
for (int i=1 ; i<100 ; i++) {
if (böse(i)) {
System.out.print("plumps ");
} else {
System.out.print(i+" ");
}
Thread.sleep(500);
}
}
}
Aber heute klappt wieder mal gar nichts. Leider funktioniert das Programm nicht. Der Compiler behauptet: "Cannot find symbol". Das liegt daran, dass Variablen immer nur innerhalb des Anweisungsblocks gelten, in dem sie deklariert wurden. Die Variable böseZahl wurde im Block der main-Methode deklariert und gilt auch nur dort.
Also deklarieren wir die Variable direkt
unmittelbar unterhalb der der Klassendefinition. Ebenso wie
Klassenmethoden müssen auch Variablen, die unabhängig von einem
konkreten Objekt für die Klasse gelten, als
static deklariert werden.
public class BöseZahl
static int böseZahl;
...
Jetzt tritt plötzlich eine ArithmeticException auf. Obwohl Sie "5"
eingegeben haben, dividiert Java die Kandidaten durch Null. Der Grund:
Sie haben vergessen, die Deklaration int
böseZahl in der main-Methode zu
entfernen. Deshalb hat Java zusätzlich zu der
globalen Variable
böse Zahl, die für die ganze Klasse gilt, eine zusätzliche
lokale Variable
gleichen Namens erzeugt. Die lokale Variable
überschrieben,
d.h. unsichtbar gemacht. Nachdem Sie am Anfang der Zeile
int böseZahl = Eingabe.nextInt
das int
entfernt haben, klappt die Sache endlich.
Aufgaben: