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:

  1. Ändern Sie das Programm wie beschrieben ab, so dass es mit globalen Variablen funktioniert.
  2. Ändern Sie das Programm so, dass es nicht mit einer globalen Variable, sondern mit einem zusätzlichen Parameter arbeitet.
  3. Ändern Sie das Programm so, dass "plumps" bei allen Zahlen angezeigt wird, die eine 7 enthalten.
  4. Ändern Sie das Programm so, dass beide Bedingungen gelten.