Buchseiten
| Thema | Buchseite |
|---|---|
| Klasse | 151 |
| Klasse – Erweiterte Anwendungen | 157 |
| Arrays von Klassen | 161 |
| Klasse Math | 193 |
| Klasse String | 197 |
| Objektorientierung | 207 |
| Instanzmethoden | 223 |
| Static | 229 |
| Final | 233 |
| Vererbung | 267 |
| Überschreiben | 281 |
| Zugriffsrechte | 309 |
| Exceptions | 333 |
| Exceptions abfangen | 335 |
| Custom Exception | 341 |
| Enum | 363 |
| Generics | 367 |
| Wrapper | 413 |
| Collections (Hashset etc.) | 449 |
| Iterator | 453 |
| String Tokenizer | 469 |
| Threads | 589 |
| Thread Funktionen | 593 |
| Thread Lebenszyklus | 601 |
BASICS
Variables & Data Types
int age = 25;
double price = 19.99;
char letter = 'A';
boolean isActive = true;
String name = "Anna";
Basic Input (Scanner)
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
System.out.print("Enter your name: ");
String name = sc.nextLine();
System.out.println("Hello " + name);
Basic Output
System.out.println("Hello World"); //With New Line
System.out.print("No newline"); //Without New Line
Arithmetic Operations
int a = 10;
int b = 3;
int sum = a + b; // Addition: 10 + 3 = 13
int diff = a - b; // Subtraktion: 10 - 3 = 7
int prod = a b; // Multiplikation: 10 3 = 30
int div = a / b; // Ganzzahl-Division: 10 / 3 = 3
int mod = a % b; // Modulo: 10 % 3 = 1
a++; // Post-Inkrement: a = a + 1 -> a = 11
b--; // Post-Dekrement: b = b - 1 -> b = 2
++a; // Prä-Inkrement: a = a + 1 -> a = 12
--b; // Prä-Dekrement: b = b - 1 -> b = 1
int sumAssign = 5;
sumAssign += 3; // Addition mit Zuweisung: sumAssign = 5 + 3 -> 8
int diffAssign = 5;
diffAssign -= 2; // Subtraktion mit Zuweisung: diffAssign = 5 - 2 -> 3
int prodAssign = 5;
prodAssign = 4; // Multiplikation mit Zuweisung: prodAssign = 5 4 -> 20
int divAssign = 20;
divAssign /= 5; // Division mit Zuweisung: divAssign = 20 / 5 -> 4
int modAssign = 10;
modAssign %= 3; // Modulo mit Zuweisung: modAssign = 10 % 3 -> 1
If / Else
int age = 18;
if (age >= 18) {
System.out.println("Adult");
} else {
System.out.println("Minor");
}
Switch Case
int day = 3;
switch (day) {
case 1 -> System.out.println("Monday");
case 2 -> System.out.println("Tuesday");
case 3 -> System.out.println("Wednesday");
default -> System.out.println("Unknown");
}
Loops (For /While)
for (int i = 0; i < 5; i++) {
System.out.println("i = " + i);
}
String text = "Hello World 123";
String[] words = text.split(" ");
System.out.println("Split:");
for(String word : words) {
System.out.println(word);
// Hello
// World
// 123
}
int i = 0;
while (i < 5) {
System.out.println(i);
i++;
}
Arrays
int[] numbers = {1, 2, 3, 4};
for (int n : numbers) {
System.out.println(n);
}
Methods
public static int add(int a, int b) {
return a + b;
}
public static void main(String[] args) {
System.out.println(add(3, 5));
}
Classes & Objects & Main
class Person {
String name;
Person(String name) {
this.name = name;
}
void greet() {
System.out.println("Hello, I'm " + name);
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person("Anna");
p.greet();
}
}
Klassen
Einfache Klasse – Person
public class Person {
private String name;
private int age;
// Konstruktor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter & Setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// Methode
public void introduce() {
System.out.println("Hallo, ich bin " + name + " und " + age + " Jahre alt.");
}
}
Abstrakte Klasse – Animal
public abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
// Abstrakte Methode: muss in Unterklassen implementiert werden
public abstract void makeSound();
}
Vererbung – Dog
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(getName() + " sagt: Wuff!");
}
}
Interface – Movable
public interface Movable {
void move();
}
Klasse, die ein Interface implementiert – Car
public class Car implements Movable {
private String model;
public Car(String model) {
this.model = model;
}
@Override
public void move() {
System.out.println(model + " fährt los!");
}
}
Main-Klasse zum Testen
public class Main {
//Globale Variabeln HIER
public static void main(String[] args) {
Person p = new Person("Anna", 28); //Alles was Objekt ist benötigt new OBJEKT
p.introduce();
Animal dog = new Dog("Bello");
dog.makeSound();
Movable car = new Car("Audi A4");
car.move();
}
}
GUI – JavaX.swing
Komplettes Beispiel mit allen Layouts + Eventhandling
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
/**
* Umfangreiches Beispiel einer Java Swing GUI, das zeigt:
* - verschiedene Layouts (BorderLayout, FlowLayout, GridLayout, BoxLayout, GridBagLayout)
* - Labels mit Schriftarten und fett
* - Verwendung von JPanel
* - Instanzvariablen für Komponenten
* - verschiedene Button-Typen (JButton, JToggleButton, JCheckBox, JRadioButton)
* - Menü mit JMenuItem
* - DefaultCloseOperation, setSize, setResizable
* - Event-Handling (ActionListener, ItemListener, ChangeListener, WindowListener)
*/
public class JavaSwingGUIExample extends JFrame {
// --- Instanzvariablen (Sichtbar über die ganze Klasse) ---
private JPanel topPanel; // BorderLayout.NORTH
private JPanel centerPanel; // BorderLayout.CENTER
private JPanel bottomPanel; // BorderLayout.SOUTH
private JLabel statusLabel; // zeigt Statusmeldungen
// Buttons
private JButton normalButton;
private JButton iconButton;
private JToggleButton toggleButton;
private JCheckBox checkBox;
private JRadioButton radio1, radio2, radio3;
// Menü
private JMenuItem exitMenuItem;
public JavaSwingGUIExample() {
super("Java Swing GUI Beispiel");
// Grundkonfiguration des Frames
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // DefaultCloseOperation
setSize(900, 600); // setSize
setResizable(true); // setResizable
setLocationRelativeTo(null); // zentrieren
// Menü erstellen
createMenuBar();
// Komponenten und Layouts aufbauen
buildTopPanel();
buildCenterPanel();
buildBottomPanel();
// Haupt-Layout des Frames
Container cp = getContentPane();
cp.setLayout(new BorderLayout(8, 8));
cp.add(topPanel, BorderLayout.NORTH);
cp.add(centerPanel, BorderLayout.CENTER);
cp.add(bottomPanel, BorderLayout.SOUTH);
// WindowListener (Event handling auf Fenster-Ebene)
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("Fenster wird geschlossen");
}
@Override
public void windowOpened(WindowEvent e) {
statusLabel.setText("Anwendung gestartet");
}
});
}
private void createMenuBar() {
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("Datei");
exitMenuItem = new JMenuItem("Beenden");
exitMenuItem.addActionListener(e -> System.exit(0));
fileMenu.add(exitMenuItem);
menuBar.add(fileMenu);
setJMenuBar(menuBar);
}
private void buildTopPanel() {
topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); // FlowLayout
// Label mit verschiedener Schriftart und fett
JLabel titleLabel = new JLabel("Java Swing GUI - Demo");
titleLabel.setFont(new Font("Serif", Font.BOLD, 24)); // fett
JLabel subtitle = new JLabel("(verschiedene Layouts, Buttons & Events)");
subtitle.setFont(new Font("SansSerif", Font.ITALIC, 12));
topPanel.add(titleLabel);
topPanel.add(Box.createHorizontalStrut(10));
topPanel.add(subtitle);
}
private void buildCenterPanel() {
centerPanel = new JPanel();
centerPanel.setLayout(new GridLayout(1, 2, 8, 8)); // GridLayout
// Linke Seite: verschiedene Buttons in einem Grid
JPanel buttonPanel = new JPanel();
buttonPanel.setBorder(BorderFactory.createTitledBorder("Buttons"));
buttonPanel.setLayout(new GridLayout(6, 1, 4, 4));
// normaler JButton mit ActionListener
normalButton = new JButton("Normaler Button");
normalButton.addActionListener(e -> onNormalButton());
// JButton mit Icon (wenn Icon nicht gefunden, geht es trotzdem)
Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
iconButton = new JButton("Icon Button", infoIcon);
iconButton.setToolTipText("Button mit Icon");
iconButton.addActionListener(e -> statusLabel.setText("Icon-Button gedrückt"));
// JToggleButton
toggleButton = new JToggleButton("Toggle");
toggleButton.addItemListener(e -> {
if (e.getStateChange() == ItemEvent.SELECTED)
statusLabel.setText("Toggle: AN");
else
statusLabel.setText("Toggle: AUS");
});
// JCheckBox
checkBox = new JCheckBox("Resizability aktivieren");
checkBox.setSelected(true);
checkBox.addItemListener(e -> setResizable(checkBox.isSelected()));
// JRadioButtons in einer ButtonGroup
JPanel radios = new JPanel(new FlowLayout(FlowLayout.LEFT));
radios.setBorder(BorderFactory.createTitledBorder("Radio-Gruppe"));
radio1 = new JRadioButton("Option 1");
radio2 = new JRadioButton("Option 2");
radio3 = new JRadioButton("Option 3");
ButtonGroup bg = new ButtonGroup();
bg.add(radio1); bg.add(radio2); bg.add(radio3);
radio1.addItemListener(e -> { if (e.getStateChange()==ItemEvent.SELECTED)
statusLabel.setText("Option 1 gewählt"); });
radio2.addItemListener(e -> { if (e.getStateChange()==ItemEvent.SELECTED)
statusLabel.setText("Option 2 gewählt"); });
radio3.addItemListener(e -> { if (e.getStateChange()==ItemEvent.SELECTED)
statusLabel.setText("Option 3 gewählt"); });
radios.add(radio1); radios.add(radio2); radios.add(radio3);
// JButton mit AbstractAction (zeigt nochmal eine andere Art, Events zu verarbeiten)
Action specialAction = new AbstractAction("Special Action") {
@Override
public void actionPerformed(ActionEvent e) {
statusLabel.setText("Special Action ausgeführt");
}
};
JButton actionButton = new JButton(specialAction);
// ChangeListener Beispiel (für Slider -> hier als Demo ein JSlider)
JSlider slider = new JSlider(0, 100, 50);
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
statusLabel.setText("Slider: " + slider.getValue());
}
});
// Komponenten in buttonPanel
buttonPanel.add(normalButton);
buttonPanel.add(iconButton);
buttonPanel.add(toggleButton);
buttonPanel.add(checkBox);
buttonPanel.add(actionButton);
buttonPanel.add(slider);
// Rechte Seite: Demonstration verschiedener Layouts in JPanels
JPanel layoutDemo = new JPanel();
layoutDemo.setBorder(BorderFactory.createTitledBorder("Layout-Demos"));
layoutDemo.setLayout(new BoxLayout(layoutDemo, BoxLayout.Y_AXIS)); // BoxLayout
// FlowLayout Beispiel
JPanel flow = new JPanel(new FlowLayout(FlowLayout.LEFT));
flow.setBorder(BorderFactory.createTitledBorder("FlowLayout"));
flow.add(new JLabel("A")); flow.add(new JLabel("B")); flow.add(new JLabel("C"));
// GridLayout Beispiel
JPanel grid = new JPanel(new GridLayout(2, 2, 4, 4));
grid.setBorder(BorderFactory.createTitledBorder("GridLayout 2x2"));
grid.add(new JLabel("1")); grid.add(new JLabel("2")); grid.add(new JLabel("3"));
grid.add(new JLabel("4"));
// GridBagLayout Beispiel (flexibel)
JPanel gb = new JPanel(new GridBagLayout());
gb.setBorder(BorderFactory.createTitledBorder("GridBagLayout"));
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(2,2,2,2);
c.gridx = 0; c.gridy = 0; gb.add(new JLabel("GBA-Label 1:"), c);
c.gridx = 1; c.gridy = 0; c.weightx = 1.0; c.fill = GridBagConstraints.HORIZONTAL;
gb.add(new JTextField("TextField"), c);
layoutDemo.add(flow);
layoutDemo.add(grid);
layoutDemo.add(gb);
centerPanel.add(buttonPanel);
centerPanel.add(layoutDemo);
}
private void buildBottomPanel() {
bottomPanel = new JPanel(new BorderLayout());
statusLabel = new JLabel("Bereit");
statusLabel.setFont(new Font("Dialog", Font.BOLD, 14)); // fett
bottomPanel.add(statusLabel, BorderLayout.WEST);
// Beispiel für einen kleinen Input-Bereich
JPanel inputPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JTextField input = new JTextField(20);
JButton send = new JButton("Senden");
send.addActionListener(e -> statusLabel.setText("Gesendet: " + input.getText()));// Dies
nicht benutzen
inputPanel.add(input);
inputPanel.add(send);
bottomPanel.add(inputPanel, BorderLayout.EAST);
}
private void onNormalButton() {
// Beispiel: Modal-Dialog anzeigen
JOptionPane.showMessageDialog(this, "Der normale Button wurde gedrückt", "Info",
JOptionPane.INFORMATION_MESSAGE);
statusLabel.setText("Normaler Button gedrückt");
}
public static void main(String[] args) {
// GUI muss im EDT (Event Dispatch Thread) gestartet werden
SwingUtilities.invokeLater(() -> {
JavaSwingGUIExample frame = new JavaSwingGUIExample();
frame.setVisible(true);
});
}
}
JPanel – JLabel-JTextField
import javax.swing.*;
import java.awt.*;
public class PanelInputExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Input mit JPanel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(350, 180);
frame.setLayout(new GridLayout(3, 1, 10, 10)); // 3 Zeilen, 1 Spalte, Abstand 10px
// Panel für Benutzername
JPanel userPanel = new JPanel(new BorderLayout(5, 5)); // Label links, Feld rechts
JLabel userLabel = new JLabel("Benutzername:");
userLabel.setFont(new Font("Arial", Font.BOLD, 16));
JTextField userField = new JTextField(20); // Feldlänge 20 Zeichen
userPanel.add(userLabel, BorderLayout.WEST);
userPanel.add(userField, BorderLayout.CENTER);
// Panel für Passwort
JPanel passPanel = new JPanel(new BorderLayout(5, 5));
JLabel passLabel = new JLabel("Passwort:");
passLabel.setFont(new Font("Courier New", Font.ITALIC, 14));
JTextField passField = new JTextField(20); // Feldlänge 20 Zeichen
passPanel.add(passLabel, BorderLayout.WEST);
passPanel.add(passField, BorderLayout.CENTER);
// Panel für Button
JPanel buttonPanel = new JPanel();
JButton submitButton = new JButton("Absenden");
submitButton.addActionListener(e -> {
JOptionPane.showMessageDialog(frame,
"Benutzername: " + userField.getText() + "\nPasswort: " + passField.getText());
});
buttonPanel.add(submitButton);
// Panels zum Frame hinzufügen
frame.add(userPanel);
frame.add(passPanel);
frame.add(buttonPanel);
frame.setVisible(true);
}
}
JOptionPane
import javax.swing.*;
public class JOptionPaneDemo {
public static void main(String[] args) {
// Einfache Nachricht
JOptionPane.showMessageDialog(
null,
"Dies ist eine einfache Nachricht.",
"MessageDialog",
JOptionPane.INFORMATION_MESSAGE
);
// Warnung
JOptionPane.showMessageDialog(
null,
"Dies ist eine Warnung!",
"Warnung",
JOptionPane.WARNING_MESSAGE
);
// Fehler
JOptionPane.showMessageDialog(
null,
"Es ist ein Fehler aufgetreten.",
"Fehler",
JOptionPane.ERROR_MESSAGE
);
// Frage-Dialog
JOptionPane.showMessageDialog(
null,
"Eine Frage (nur zur Anzeige).",
"Frage",
JOptionPane.QUESTION_MESSAGE
);
// Bestätigungsdialog (Ja/Nein)
int confirm = JOptionPane.showConfirmDialog(
null,
"Möchten Sie fortfahren?",
"Bestätigung",
JOptionPane.YES_NO_OPTION
);
System.out.println("Auswahl confirm: " + confirm);
// Bestätigungsdialog (Ja/Nein/Abbrechen)
int confirm2 = JOptionPane.showConfirmDialog(
null,
"Ja / Nein / Abbrechen?",
"Bestätigung",
JOptionPane.YES_NO_CANCEL_OPTION
);
System.out.println("Auswahl confirm2: " + confirm2);
// InputDialog – Freitext
String text = JOptionPane.showInputDialog(
null,
"Bitte geben Sie etwas ein:",
"Text-Eingabe",
JOptionPane.QUESTION_MESSAGE
);
System.out.println("Eingabe: " + text);
// InputDialog – Dropdown Auswahl
Object[] farben = {"Rot", "Grün", "Blau"};
Object auswahl = JOptionPane.showInputDialog(
null,
"Wähle eine Farbe:",
"Dropdown-Eingabe",
JOptionPane.PLAIN_MESSAGE,
null,
farben,
"Rot"
);
System.out.println("Farbwahl: " + auswahl);
// OptionDialog – völlig frei
Object[] buttons = {"Speichern", "Laden", "Abbrechen"};
int option = JOptionPane.showOptionDialog(
null,
"Was möchten Sie tun?",
"Optionen",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
buttons,
buttons[0]
);
System.out.println("Ausgewählte Option: " + option);
// Eigenes Icon (optional – funktioniert nur, wenn Bild existiert)
// ImageIcon icon = new ImageIcon("pfad/zu/bild.png");
// JOptionPane.showMessageDialog(null, "Nachricht mit eigenem Icon", "Custom Icon", JOptionPane.PLAIN_MESSAGE, icon);
// Nur Information ohne Titel
JOptionPane.showMessageDialog(null, "Kurze Info ohne Titel");
// Nur OptionDialog ohne Icon / pure Buttons
String[] options2 = {"Option A", "Option B", "Option C"};
int click = JOptionPane.showOptionDialog(
null,
"Wähle eine Option:",
"Benutzerdefinierte Buttons",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE,
null, // Icon null
options2,
options2[1]
);
System.out.println("Benutzerdefinierte Auswahl: " + click);
// Dialog mit Textfeld + Buttons
JTextField feld = new JTextField();
Object[] content = {
"Geben Sie Ihren Namen ein:",
feld
};
int ok = JOptionPane.showConfirmDialog(
null,
content,
"Formular",
JOptionPane.OK_CANCEL_OPTION
);
if (ok == JOptionPane.OK_OPTION) {
System.out.println("Eingegeben: " + feld.getText());
}
}
}
JOptionPane-Beispiel mit Ausgabe
import javax.swing.JOptionPane;
public class JOptionPaneDemo {
public static void main(String[] args) {
// --- MESSAGE DIALOG ---
// Displays a simple message box
JOptionPane.showMessageDialog(
null,
"<html> <div style='color: red; background: blue'>OptionPane Demo</div>
</html>",
"Message Dialog",
JOptionPane.INFORMATION_MESSAGE
);
// --- INPUT DIALOG ---
// Asks the user to input their name
String name = JOptionPane.showInputDialog(
null,
"Name?",
"Input Dialog",
JOptionPane.QUESTION_MESSAGE
);
// If user cancels or closes the dialog, name will be null
if (name == null || name.isEmpty()) {
name = "Fremder";
}
// --- CONFIRM DIALOG ---
// Asks the user a Yes/No/Cancel type question.
int confirm = JOptionPane.showConfirmDialog(
null,
"Weiter, " + name + "?",
"Confirm Dialog",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE
);
// Handle the user’s response
if (confirm == JOptionPane.YES_OPTION) {
JOptionPane.showMessageDialog(
null,
"Weiter geht's!",
"Response",
JOptionPane.INFORMATION_MESSAGE
);
} else if (confirm == JOptionPane.NO_OPTION) {
JOptionPane.showMessageDialog(
null,
"Bye.",
"Response",
JOptionPane.WARNING_MESSAGE
);
} else {
JOptionPane.showMessageDialog(
null,
"Abbruch!",
"Response",
JOptionPane.PLAIN_MESSAGE
);
}
// --- OPTION DIALOG ---
// Custom option dialog
Object[] options = {"Speichern", "Nicht speichern", "Abbrechen"};
int choice = JOptionPane.showOptionDialog(
null,
"Fortschritt speichern?",
"Option Dialog",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null, // no custom icon
options, // custom button labels
options[0] // default selected option
);
// Interpret the result of the user's choice
switch (choice) {
case 0:
JOptionPane.showMessageDialog(null, "Fortschritt gespeichert!", "Result",
JOptionPane.INFORMATION_MESSAGE);
break;
case 1:
JOptionPane.showMessageDialog(null, "Fortschritt nicht gespeichert.", "Result",
JOptionPane.WARNING_MESSAGE);
break;
case 2:
default:
JOptionPane.showMessageDialog(null, "Aktion abgebrochen.", "Result",
JOptionPane.PLAIN_MESSAGE);
break;
}
// --- END ---
// Final message before exiting
JOptionPane.showMessageDialog(
null,
"Demo beendet, " + name + ".",
"Goodbye",
JOptionPane.INFORMATION_MESSAGE
);
}
}
FILE IO + Exeptionhandling
FILE IO mit exeptionhandling + eigene exeption
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* Beispielprogramm:
* - Datei lesen & schreiben (File I/O)
* - Exception Handling mit try-catch
* - Eigene Exception (DateiLeerException)
*/
public class FileIOBeispiel {
public static void main(String[] args) {
String inputFile = "eingabe.txt";
String outputFile = "ausgabe.txt";
try {
// Datei lesen (kann IOException oder DateiLeerException werfen)
String inhalt = leseDatei(inputFile);
System.out.println("Datei erfolgreich gelesen:\n" + inhalt);
// Datei schreiben
schreibeDatei(outputFile, inhalt.toUpperCase());
System.out.println("Datei erfolgreich geschrieben.");
} catch (DateiLeerException e) {
// Eigene Exception → spezielle Fehlermeldung
System.err.println("Eigener Fehler: " + e.getMessage());
} catch (IOException e) {
// IOExceptions werden hier abgefangen
System.err.println("I/O Fehler: " + e.getMessage());
}
}
/**
* Liest eine Datei Zeile für Zeile ein.
* Wirft zusätzlich eine eigene Exception, wenn die Datei leer ist.
*/
public static String leseDatei(String dateiname) throws IOException, DateiLeerException {
StringBuilder sb = new StringBuilder();
// Datei wird automatisch geschlossen (try-with-resources)
try (BufferedReader reader = new BufferedReader(new FileReader(dateiname))) {
String zeile;
while ((zeile = reader.readLine()) != null) {
sb.append(zeile).append(System.lineSeparator());
}
}
// Eigene Exception werfen, wenn Datei leer
if (sb.toString().trim().isEmpty()) {
throw new DateiLeerException("Die Datei '" + dateiname + "' ist leer.");
}
return sb.toString();
}
/**
* Schreibt Text in eine Datei.
*/
public static void schreibeDatei(String dateiname, String text) throws IOException {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(dateiname))) {
writer.write(text);
}
}
}
/**
* Eigene Exception für den Fall, dass die Datei leer ist.
* Eigene Exceptions erben in der Regel von Exception (checked exception).
*/
class DateiLeerException extends Exception {
// Konstruktor übernimmt die Fehlermeldung
public DateiLeerException(String message) {
super(message);
}
}
EXEPTIONS
Exeptions nochmal aber alles
/**
* Dieses Beispiel zeigt den Umgang mit Exceptions:
* - mehrere catch-Blöcke
* - eigene checked Exception
* - eigene RuntimeException (unchecked)
* - try-catch-finally
* - bewusstes Auslösen von Exceptions (throw)
* - Unterschiede zwischen checked und unchecked Exceptions
*/
public class ExceptionBeispiel {
public static void main(String[] args) {
try {
int ergebnis = teile(10, -5); // teste: 0 für Arithmetic, -5 für eigene Exceptions
System.out.println("Ergebnis: " + ergebnis);
} catch (ArithmeticException e) {
// Standard RuntimeException (unchecked)
System.err.println("Mathematischer Fehler: " + e.getMessage());
} catch (UngueltigeZahlException e) {
// Eigene checked Exception
System.err.println("Checked Exception: " + e.getMessage());
} catch (NegativeZahlRuntimeException e) {
// Eigene RuntimeException (unchecked)
System.err.println("Runtime Exception: " + e.getMessage());
} finally {
// Wird IMMER ausgeführt
System.out.println("Finally-Block wurde ausgeführt.");
}
}
/**
* Methode teilt zwei Zahlen.
* Unterschiede:
* - checked Exception (UngueltigeZahlException) MUSS deklariert werden (throws)
* - RuntimeException (NegativeZahlRuntimeException) MUSS NICHT deklariert werden
*/
public static int teile(int a, int b) throws UngueltigeZahlException {
// Checked Exception → Compiler zwingt dich zum Behandeln
if (b < -10) {
throw new UngueltigeZahlException("Der Divisor ist zu klein (< -10)!");
}
// RuntimeException → Programmierfehler / Logikfehler
if (b < 0) {
throw new NegativeZahlRuntimeException("Negative Zahl nicht erlaubt!");
}
// Standard RuntimeException (Division durch 0)
return a / b;
}
}
/**
* CHECKED EXCEPTION
* Eigenschaften:
* - erbt von Exception
* - MUSS behandelt oder mit 'throws' weitergegeben werden
* - für erwartbare Fehler (z.B. Benutzereingaben, externe Systeme)
*/
class UngueltigeZahlException extends Exception {
public UngueltigeZahlException(String message) {
super(message);
}
}
/**
* UNCHECKED EXCEPTION (RuntimeException)
* Eigenschaften:
* - erbt von RuntimeException
* - MUSS NICHT behandelt werden (optional)
* - tritt meist bei Programmierfehlern auf
* Beispiele:
* - NullPointerException
* - ArithmeticException
* - ArrayIndexOutOfBoundsException
*/
class NegativeZahlRuntimeException extends RuntimeException {
public NegativeZahlRuntimeException(String message) {
super(message);
}
}
/*
===========================
UNTERSCHIEDE ZUSAMMENGEFASST
===========================
1. CHECKED EXCEPTION
- Erbt von Exception
- Compiler zwingt zur Behandlung
- Verwendung:
→ Wenn Fehler erwartbar und behandelbar ist
→ z.B. Datei nicht gefunden, falsche Eingabe
Syntax:
public void methode() throws MeineException
2. UNCHECKED EXCEPTION (RuntimeException)
- Erbt von RuntimeException
- Keine Pflicht zur Behandlung
- Verwendung:
→ Programmierfehler
→ Logikfehler
→ Dinge, die NICHT passieren sollten
Syntax:
throw new MeineRuntimeException("Fehler");
3. WANN WAS?
Checked:
"Kann passieren → Benutzer/Umwelt schuld"
Unchecked:
"Sollte nicht passieren → Entwickler schuld"
4. BEST PRACTICE
- Checked: bei validierbaren, erwarteten Problemen
- Runtime: bei falscher Nutzung von Methoden / Logikfehlern
*/
Alles über Strings Buch s. 197
Strings
public class StringExample {
public static void main(String[] args) {
String text = "Hello World";
// Länge
System.out.println("Länge: " + text.length()); // Länge: 11
// Groß-/Kleinschreibung
System.out.println("UpperCase: " + text.toUpperCase()); // UpperCase: HELLO WORLD
System.out.println("LowerCase: " + text.toLowerCase()); // LowerCase: hello world
// Zeichenzugriff
System.out.println("Zeichen an Index 1: " + text.charAt(1)); // Zeichen an Index 1: e
// Vergleich
System.out.println("Vergleich mit 'Hello': " + text.equals("Hello")); // Vergleich mit
'Hello': false
// Teilstring
System.out.println("Substring(0,5): " + text.substring(0,5)); // Substring(0,5): Hello
// Ersetzen
System.out.println("Ersetze 'World' durch 'Java': " + text.replace("World", "Java")); //
Ersetze 'World' durch 'Java': Hello Java
// Trimmen
String text2 = " Hallo ";
System.out.println("Getrimmt: '" + text2.trim() + "'"); // Getrimmt: 'Hallo'
// Aufteilen
String[] words = text.split(" ");
for(String word : words) {
System.out.println("Word: " + word);
// Word: Hello
// Word: World
}
// Enthält prüfen
System.out.println("Enthält 'World'? " + text.contains("World")); // Enthält 'World'?
true
}
}
StringBuilder
public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
// Anhängen
sb.append(" World");
System.out.println(sb); // Hello World
// Einfügen
sb.insert(6, "Java ");
System.out.println(sb); // Hello Java World
// Löschen
sb.delete(6, 11);
System.out.println(sb); // Hello World
// Zeichen ersetzen
sb.setCharAt(0, 'h');
System.out.println(sb); // hello World
// Umkehren
sb.reverse();
System.out.println("Reverse: " + sb); // Reverse: dlroW olleh
// Länge
System.out.println("Length: " + sb.length()); // Length: 11
}
}
StringBuffer
public class StringBufferExample {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
System.out.println(sb); // Hello World
sb.insert(6, "Java ");
System.out.println(sb); // Hello Java World
sb.replace(6, 10, "C++");
System.out.println(sb); // Hello C++ World
sb.delete(6, 9);
System.out.println(sb); // Hello + World
sb.reverse();
System.out.println("Reverse: " + sb); // Reverse: dlroW + olleH
}
}
CharSequence
public class CharSequenceExample {
public static void main(String[] args) {
CharSequence cs1 = "Hello"; // String
CharSequence cs2 = new StringBuilder("World"); // StringBuilder
System.out.println("Länge cs1: " + cs1.length()); // Länge cs1: 5
System.out.println("Zeichen an Index 1 cs2: " + cs2.charAt(1)); // Zeichen an Index 1
cs2: o
// Subsequence
System.out.println("Subsequence cs1: " + cs1.subSequence(0, 4)); // Subsequence cs1:
Hell
System.out.println("Subsequence cs2: " + cs2.subSequence(1, 4)); // Subsequence cs2: orl
}
}
StringTokenizer
import java.util.StringTokenizer;
public class TokenizerBeispiel {
public static void main(String[] args) {
String text = "Apfel,Birne,Banane,Kiwi";
// StringTokenizer erstellen, Trennzeichen ist ein Komma
StringTokenizer tokenizer = new StringTokenizer(text, ",");
// Alle Tokens ausgeben
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
System.out.println(token);
}
}
}
String – Cheat sheet komplett
public class StringCheatSheet {
public static void main(String[] args) {
// --- String Basics ---
String text = "Hello World 123";
System.out.println("Original: " + text); // Original: Hello World 123
System.out.println("Length: " + text.length()); // Length: 15
System.out.println("UpperCase: " + text.toUpperCase()); // UpperCase: HELLO WORLD 123
System.out.println("LowerCase: " + text.toLowerCase()); // LowerCase: hello world 123
System.out.println("charAt(1): " + text.charAt(1)); // charAt(1): e
System.out.println("startsWith(\"Hello\"): " + text.startsWith("Hello")); // true
System.out.println("endsWith(\"123\"): " + text.endsWith("123")); // true
System.out.println("indexOf(\"o\"): " + text.indexOf("o")); // 4
System.out.println("lastIndexOf(\"o\"): " + text.lastIndexOf("o")); // 7
System.out.println("contains(\"World\"): " + text.contains("World")); // true
System.out.println("substring(0,5): " + text.substring(0,5)); // Hello
System.out.println("replace(\"World\", \"Java\"): " + text.replace("World", "Java")); //
Hello Java 123
System.out.println("replaceAll(\"\\d\", \"\"): " + text.replaceAll("\\d", "")); //
Hello World *
System.out.println("trim(): '" + " test ".trim() + "'"); // 'test'
System.out.println("matches(\".World.\"): " + text.matches(".World.")); // true
// --- equalsIgnoreCase ---
String mercedes = "Mercedes";
String lowerCaseMercedes = "mercedes";
System.out.println("equalsIgnoreCase: " + mercedes.equalsIgnoreCase(lowerCaseMercedes));
// true
// --- Split ---
String[] words = text.split(" ");
System.out.println("Split:");
for(String word : words) {
System.out.println(word);
// Hello
// World
// 123
}
// --- String Formatting ---
String formatted = String.format("Name: %s, Age: %d", "Anna", 25);
System.out.println("Formatted: " + formatted); // Name: Anna, Age: 25
// --- StringBuilder ---
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println("StringBuilder append: " + sb); // Hello World
sb.insert(6, "Java ");
System.out.println("StringBuilder insert: " + sb); // Hello Java World
sb.delete(6, 11);
System.out.println("StringBuilder delete: " + sb); // Hello World
sb.setCharAt(0, 'h');
System.out.println("StringBuilder setCharAt: " + sb); // hello World
sb.reverse();
System.out.println("StringBuilder reverse: " + sb); // dlroW olleh
System.out.println("StringBuilder length: " + sb.length()); // 11
// --- StringBuffer (Thread-safe) ---
StringBuffer sbf = new StringBuffer("Buffer");
sbf.append(" Test");
System.out.println("StringBuffer append: " + sbf); // Buffer Test
sbf.replace(0, 6, "Changed");
System.out.println("StringBuffer replace: " + sbf); // Changed Test
sbf.delete(7, 12);
System.out.println("StringBuffer delete: " + sbf); // Changed
sbf.reverse();
System.out.println("StringBuffer reverse: " + sbf); // dednahC
// --- CharSequence ---
CharSequence cs1 = "CharSeq";
CharSequence cs2 = new StringBuilder("Example");
System.out.println("CharSequence length cs1: " + cs1.length()); // 7
System.out.println("CharSequence charAt cs2: " + cs2.charAt(2)); // a
System.out.println("CharSequence subsequence cs1: " + cs1.subSequence(0,4)); // Char
System.out.println("CharSequence subsequence cs2: " + cs2.subSequence(2,5)); // amp
}
}
DecimalFormat
Kurze Erläuterung:
- Dient zur Formatierung von Dezimalzahlen (double, float) in Strings.
- Ermöglicht das Festlegen von Nachkommastellen, Tausendertrennzeichen und Vorzeichen.
- Nützlich für Währungen, Prozentzahlen oder genaue mathematische Ausgaben.
- Benötigt den Import: import java.text.DecimalFormat;
Beispiele:
import java.text.DecimalFormat;
public class DecimalFormatBeispiel {
public static void main(String[] args) {
double zahl = 12345.6789;
// Zwei Nachkommastellen erzwingen (rundet automatisch auf/ab)
DecimalFormat df1 = new DecimalFormat("0.00");
System.out.println(df1.format(zahl)); // Ausgabe: 12345,68
// Mit Tausendertrennzeichen und zwei Nachkommastellen
DecimalFormat df2 = new DecimalFormat("#,##0.00");
System.out.println(df2.format(zahl)); // Ausgabe: 12.345,68
// Prozentformatierung (multipliziert automatisch mit 100)
DecimalFormat df3 = new DecimalFormat("#.##%");
double prozent = 0.753;
System.out.println(df3.format(prozent)); // Ausgabe: 75,3%
}
}
Wichtige Merkmale & Stolpersteine:
- 0 vs. # im Pattern: Eine 0 erzwingt eine Ziffer (füllt mit Nullen auf, falls keine Ziffer da ist, z. B. 0.5 wird bei 0.00 zu 0.50). Ein # zeigt eine Ziffer nur an, wenn sie existiert (keine führenden/anhängenden Nullen).
- Rundung: DecimalFormat rundet standardmäßig nach dem "Half-Even" Prinzip (kaufmännisches Runden).
- Lokalisierung: Das Formatierungszeichen (Punkt oder Komma) hängt von der Spracheinstellung des Betriebssystems ab (in Deutschland ist das Komma das Dezimaltrennzeichen).
Wrapper-Klassen
Kurze Erläuterung:
- Wrapper-Klassen kapseln primitive Datentypen (int, double, boolean etc.) in echte Objekte.
- Warum? Komplexe Datenstrukturen wie Collections (z. B. ArrayList) können nur Objekte speichern, keine primitiven Datentypen.
- Bieten nützliche Hilfsmethoden (z. B. Konvertierung von String zu int).
Die Klassen:
- int → Integer
- double → Double
- boolean → Boolean
- char → Character
- byte → Byte, short → Short, float → Float, long → Long
Beispiele:
import java.util.ArrayList;
public class WrapperBeispiel {
public static void main(String[] args) {
// 1. Parsing (String in Zahl umwandeln - sehr wichtig für GUI-Textfelder!)
String eingabe = "123";
int zahl = Integer.parseInt(eingabe); // String zu int
double kommazahl = Double.parseDouble("45.67"); // String zu double
// 2. Autoboxing (Primitiver Typ wird automatisch zum Objekt)
Integer objZahl = 5;
// Unboxing (Objekt wird automatisch zum primitiven Typ)
int primitiveZahl = objZahl;
// 3. Verwendung in Collections (List<int> geht NICHT!)
ArrayList < Integer > zahlenListe = new ArrayList < > ();
zahlenListe.add(10); // Autoboxing greift hier
// 4. Konstanten nutzen
System.out.println("Maximaler int-Wert: " + Integer.MAX_VALUE);
}
}
Wichtige Merkmale & Stolpersteine:
- NullPointerException: Im Gegensatz zu primitiven Typen (die einen Standardwert wie 0 haben), können Wrapper-Objekte null sein. Ein unbedachtes Unboxing eines null-Wertes führt zum Programmabsturz.
- Speicher: Wrapper-Objekte verbrauchen mehr Speicher und Rechenzeit als primitive Datentypen.
- Vergleich: Objekte (also auch Wrapper) ab dem Wert 128 immer mit .equals() vergleichen, nicht mit ==!
Date & Calendar (sowie SimpleDateFormat)
Kurze Erläuterung:
- java.util.Date: Repräsentiert einen genauen Zeitpunkt (Datum + Uhrzeit).
- java.util.Calendar: Hilfsklasse, um mit Daten zu rechnen (Tage addieren/subtrahieren, bestimmte Felder wie den Monat auslesen).
- java.text.SimpleDateFormat: Wird genutzt, um Date-Objekte in lesbare Strings zu verwandeln (und umgekehrt).
- (Hinweis: Seit Java 8 gibt es die moderne API java.time. wie LocalDate. In Prüfungen wird aber oft noch explizit nach den alten Klassen Date/Calendar gefragt).*
Beispiele:
import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class DateCalendarBeispiel {
public static void main(String[] args) throws Exception {
// 1. Aktuelles Datum ausgeben
Date heute = new Date();
System.out.println("Rohformat: " + heute);
// 2. Datum formatieren (SimpleDateFormat)
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
String formatiert = sdf.format(heute);
System.out.println("Formatiert: " + formatiert); // z.B. 23.05.2026 14:30:00
// 3. String in Datum umwandeln (Parsen) - wirft evtl. ParseException
String datumString = "24.12.2026";
SimpleDateFormat sdf2 = new SimpleDateFormat("dd.MM.yyyy");
Date weihnachten = sdf2.parse(datumString);
// 4. Mit Calendar rechnen
Calendar cal = Calendar.getInstance(); // Erstellt Kalender mit aktuellem Datum
cal.setTime(heute); // Setzt den Kalender auf ein bestimmtes Date
// 5 Tage in die Zukunft springen
cal.add(Calendar.DAY_OF_MONTH, 5);
// 1 Monat abziehen
cal.add(Calendar.MONTH, -1);
// Zurück in ein Date-Objekt wandeln, um es auszugeben
Date neuesDatum = cal.getTime();
System.out.println("Neues Datum: " + sdf.format(neuesDatum));
}
}
Wichtige Merkmale & Stolpersteine:
- Die Monats-Falle (VORSICHT!): In der Klasse Calendar beginnen die Monate bei Index 0! Januar = 0, Februar = 1, ..., Dezember = 11. Das ist eine der häufigsten Fehlerquellen in Prüfungen! Tage beginnen jedoch normal bei 1.
- Veraltet (Deprecated): Fast alle direkten Getter/Setter-Methoden der Date-Klasse (wie heute.getYear()) sind veraltet. Man muss den Calendar nutzen, um Datumswerte auszulesen oder zu verändern.
- SimpleDateFormat Pattern: Groß- und Kleinschreibung ist entscheidend! MM ist der Monat, mm ist die Minute. HH ist die Stunde im 24h-Format, hh im 12h-Format.
Collections
import java.util.*;
public class SetDemo {
// Enum für EnumSet-Beispiel
enum Wochentag { MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG }
public static void main(String[] args) {
// ========================
// HashSet
// ========================
Set<String> hashSet = new HashSet<>();
hashSet.add("Apfel");
hashSet.add("Banane");
hashSet.add("Kiwi");
hashSet.add("Banane"); // Duplikate werden ignoriert
System.out.println("HashSet (ungeordnet): " + hashSet);
// ========================
// TreeSet
// ========================
Set<String> treeSet = new TreeSet<>(hashSet); // automatisch sortiert
treeSet.add("Orange");
System.out.println("TreeSet (sortiert): " + treeSet);
// ========================
// Andere
// 3. Collections.unmodifiableSet
// ========================
Set<String> readOnlySet = Collections.unmodifiableSet(treeSet);
System.out.println("UnmodifiableSet: " + readOnlySet);
// readOnlySet.add("Traube"); // ❌ führt zu RuntimeException
// ========================
// EnumSet
// ========================
EnumSet<Wochentag> arbeitstage = EnumSet.of(Wochentag.MONTAG, Wochentag.DIENSTAG,
Wochentag.FREITAG);
System.out.println("EnumSet Arbeitstage: " + arbeitstage);
// ========================
// Methoden-Demo
// ========================
System.out.println("\nTreeSet enthält 'Kiwi'? " + treeSet.contains("Kiwi"));
System.out.println("HashSet Größe: " + hashSet.size());
treeSet.remove("Orange");
System.out.println("TreeSet nach remove: " + treeSet);
System.out.println("\nIterieren über EnumSet:");
for (Wochentag tag : arbeitstage) {
System.out.println(" - " + tag);
}
}
}
Generische Datentypen
// Generische Klasse
class Box<T> {
private T inhalt;
public void setInhalt(T inhalt) {
this.inhalt = inhalt;
}
public T getInhalt() {
return inhalt;
}
}
public class GenericsBeispiel {
public static void main(String[] args) {
// Box für Integer
Box<Integer> intBox = new Box<>();
intBox.setInhalt(123);
System.out.println("Integer in Box: " + intBox.getInhalt());
// Box für String
Box<String> stringBox = new Box<>();
stringBox.setInhalt("Hallo Welt");
System.out.println("String in Box: " + stringBox.getInhalt());
}
}
Enum
// Definition des Enums
enum Wochentag {
MONTAG,
DIENSTAG,
MITTWOCH,
DONNERSTAG,
FREITAG,
SAMSTAG,
SONNTAG
}
public class EnumBeispiel {
public static void main(String[] args) {
// Enum verwenden
Wochentag heute = Wochentag.MITTWOCH;
// Ausgabe
System.out.println("Heute ist: " + heute);
// Enum in einer Schleife
System.out.println("Alle Wochentage:");
for (Wochentag tag : Wochentag.values()) {
System.out.println(tag);
}
// Enum mit Switch
switch (heute) {
case SAMSTAG, SONNTAG -> System.out.println("Es ist Wochenende!");
default -> System.out.println("Es ist ein Arbeitstag.");
}
}
}
Java Imports
// GUI-Komponenten
import javax.swing.JFrame; // Hauptfenster
import javax.swing.JPanel; // Panel zur Gruppierung von Komponenten
import javax.swing.JButton; // Button
import javax.swing.JLabel; // Label
import javax.swing.JTextField; // Eingabefeld
import javax.swing.JFileChooser; // Datei-Auswahldialog
import javax.swing.JOptionPane; // Popup-Dialog
// GUI-Komponenten (Swing)
import javax.swing.*; // JFrame, JPanel, JButton, JLabel, JTextField, JOptionPane, JFileChooser etc.
// Layouts
import java.awt.GridLayout; // Grid-Layout
import java.awt.BorderLayout; // Border-Layout
import java.awt.FlowLayout; // Flow-Layout
import java.awt.Font; // Schriftarten
// Layouts & Schriftarten (AWT)
import java.awt.*; // GridLayout, BorderLayout, FlowLayout, Font, Color etc.
// Event-Handling
import java.awt.event.ActionListener; // Listener für Aktionen (z.B. Button klicken)
import java.awt.event.ActionEvent; // Event-Objekt für Aktionen
import java.awt.event.KeyListener; // Listener für Tastatureingaben
import java.awt.event.KeyEvent; // Event-Objekt für Tastatureingaben
import java.awt.event.MouseListener; // Listener für Mausaktionen
import java.awt.event.MouseEvent; // Event-Objekt für Mausaktionen
// Event-Handling (AWT Events)
import java.awt.event.*; // ActionListener, ActionEvent, KeyListener, KeyEvent, MouseListener, MouseEvent etc.
// Datei-Handling
import java.io.File; // Dateien und Verzeichnisse
import java.io.FileReader; // Dateien lesen
import java.io.FileWriter; // Dateien schreiben
import java.io.BufferedReader; // Puffern beim Lesen
import java.io.BufferedWriter; // Puffern beim Schreiben
import java.io.IOException; // Ausnahmebehandlung für Dateioperationen
// Datei-Handling
import java.io.*; // File, FileReader, FileWriter, BufferedReader, BufferedWriter, IOException etc.
Schwimmer GUI übung von Seidel
SchwimmerGUI.java
import javax.swing.*;
import java.awt.*;
public class SchwimmerGUI extends JFrame {
// Instanzvariablen nur für benötigte Elemente
private JTextField tfName;
private JTextField tfVorname;
private JTextField tfKlasse;
// Feld für bis zu 100 Schwimmer
private Schwimmer[] teilnehmer = new Schwimmer[100];
private int index = 0; // nächste freie Position
public SchwimmerGUI() {
super("Schwimmerverwaltung");
setLayout(new GridLayout(6, 1));
setSize(400, 300);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Erste Zeile – Titel
JLabel lblTitel = new JLabel("Schwimmer-Erfassung", SwingConstants.CENTER);
lblTitel.setFont(new Font("Courier", Font.ITALIC, 20));
add(lblTitel);
// Zeile 2 – Name
JPanel p1 = new JPanel();
p1.add(new JLabel("Name:"));
tfName = new JTextField(20);
p1.add(tfName);
add(p1);
// Zeile 3 – Vorname
JPanel p2 = new JPanel();
p2.add(new JLabel("Vorname:"));
tfVorname = new JTextField(20);
p2.add(tfVorname);
add(p2);
// Zeile 4 – Klasse
JPanel p3 = new JPanel();
p3.add(new JLabel("Klasse:"));
tfKlasse = new JTextField(3);
p3.add(tfKlasse);
add(p3);
// Zeile 5 – Speichern Button
JButton btnSave = new JButton("Speichern");
btnSave.addActionListener(new SpeichernEreignis(this));
add(btnSave);
// Zeile 6 – Zurücksetzen Button
JButton btnReset = new JButton("Zurücksetzen");
btnReset.addActionListener(new ZuruecksetzenEreignis(tfName, tfVorname, tfKlasse));
add(btnReset);
setVisible(true);
}
// Zugriffsmethoden für Ereignisklasse
public String getNameEingabe() { return tfName.getText(); }
public String getVornameEingabe() { return tfVorname.getText(); }
public String getKlasseEingabe() { return tfKlasse.getText(); }
public void addSchwimmer(Schwimmer s) {
if (index < teilnehmer.length) {
teilnehmer[index] = s;
index++;
}
}
public void printArray() {
System.out.println();
for (int i = 0; i < index; i++) {
System.out.println(teilnehmer[i]);
}
}
public static void main(String[] args) {
new SchwimmerGUI();
}
}
Ereignisklassen.java
// Innere Ereignisklasse getrennt von GUI-Datei
import java.awt.event.*;
class SpeichernEreignis implements ActionListener {
private SchwimmerGUI gui;
public SpeichernEreignis(SchwimmerGUI gui) {
this.gui = gui;
}
@Override
public void actionPerformed(ActionEvent e) {
// Daten aus GUI auslesen
String name = gui.getNameEingabe();
String vorname = gui.getVornameEingabe();
String klasse = gui.getKlasseEingabe();
// Neues Schwimmer-Objekt erzeugen
Schwimmer s = new Schwimmer(name, vorname, klasse);
// Im Array speichern
gui.addSchwimmer(s);
// Ausgabe des vollständigen Arrays
gui.printArray();
}
}
class ZuruecksetzenEreignis implements ActionListener {
private JTextField tfName, tfVorname, tfKlasse;
public ZuruecksetzenEreignis(JTextField tfName, JTextField tfVorname, JTextField tfKlasse) {
this.tfName = tfName;
this.tfVorname = tfVorname;
this.tfKlasse = tfKlasse;
}
@Override
public void actionPerformed(ActionEvent e) {
tfName.setText("");
tfVorname.setText("");
tfKlasse.setText("");
}
}
Schwimmer.java
public class Schwimmer {
private String name;
private String vorname;
private String klasse;
public Schwimmer(String name, String vorname, String klasse) {
this.name = name;
this.vorname = vorname;
this.klasse = klasse;
}
@Override
public String toString() {
return name + ", " + vorname + " (" + klasse + ")";
}
}
Schwimmer GUI LÖSUNG von Seidel
SchwimmerGUI.java
import java.awt.*;
import javax.swing.*; //0,5
import java.awt.event.*; //Aufgabe 2
public class SchwimmerGUI extends JFrame { //0,5
Schwimmer[] starterliste = new Schwimmer[100]; //1 Feld für 100 Schwimmer
JTextField tName, tVorname, tKlasse; //1 (nur notwendig!)
public SchwimmerGUI() {
this.setLayout(new GridLayout(6,1)); //1
this.setTitle("Schulmeisterschaft Schwimmen"); //0,5
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //0,5
this.setSize(400,300); //0,5
this.setResizable(false); //0,5
//0,5
JLabel jlUeberschrift = new JLabel("Teilnehmerin / Teilnehmer",JLabel.CENTER);
jlUeberschrift.setFont(new Font("Courier",Font.ITALIC,20)); //1
add(jlUeberschrift); //0,5
JPanel panelSchwimmer1 = new JPanel(); //0,5
JLabel jlName = new JLabel("Name : ",JLabel.RIGHT); //0,5
panelSchwimmer1.add(jlName); //0,5
tName = new JTextField(20); //0,5
panelSchwimmer1.add(tName); //0,5
add(panelSchwimmer1); //0,5
JPanel panelSchwimmer2 = new JPanel();
JLabel jlVorname = new JLabel("Vorname : ",JLabel.RIGHT);
panelSchwimmer2.add(jlVorname); //0,5 analog zu Block "name"
tVorname = new JTextField(20);
panelSchwimmer2.add(tVorname);
add(panelSchwimmer2);
JPanel panelKlasse = new JPanel();
JLabel jlKlasse = new JLabel("Klasse : ",JLabel.RIGHT);
panelKlasse.add(jlKlasse);
tKlasse = new JTextField(3); //0,5 analog zu Block "name"
panelKlasse.add(tKlasse);
add(panelKlasse);
JButton jbSpeichern = new JButton("Speichern"); //0,5
jbSpeichern.addActionListener(new SpeichernEreignis());
add(jbSpeichern); //0,5
JButton jbLoeschen = new JButton("Eingaben löschen"); //0,5
jbLoeschen.addActionListener(new ZuruecksetzenEreignis(tName,tVorname,tKlasse));
add(jbLoeschen); //0,5
this.setVisible(true); //0,5
}
public static void main(String[] args){
new SchwimmerGUI(); //0,5 nur notwendige Objekterzeugung
}
class SpeichernEreignis implements ActionListener{ //0,5
//0,5 Position
public void actionPerformed(ActionEvent ae){ //0,5
String name = tName.getText(); //0,5
String vorname = tVorname.getText(); //0,5
String klasse = tKlasse.getText(); //0,5
starterliste[Schwimmer.teilnehmer-1] = new Schwimmer(name,vorname,klasse);
//1 //1
System.out.println(); //0,5 Leerzeile
for (int lauf = 0;lauf < Schwimmer.teilnehmer;lauf++ ) {
System.out.println(starterliste[lauf]); //1,5
} // end of for
}
}
}
ZuruecksetzenEreignis.java
import java.awt.event.*;
import javax.swing.*; //0,5 nur notwendige Importe
class ZuruecksetzenEreignis implements ActionListener{
JTextField tName, tVorname, tKlasse; //0,5
ZuruecksetzenEreignis(JTextField tName,JTextField tVorname,JTextField tKlasse){
this.tName = tName; //1
this.tVorname = tVorname; //1 alle Zuweisungen
this.tKlasse = tKlasse;
}
public void actionPerformed(ActionEvent ae){ //0,5
tName.setText("");
tVorname.setText(""); //1 alle set - Befehle
tKlasse.setText("");
}
}
Pizza-Übung von ITT78 (PRIO, bei bedarf schwimmer anschauen)
PizzaTest.java
class PizzaTest {
public static void main(String[] args){
// Titel für das Fenster wird hier übergeben
new PizzaBestellung("L'Osteria ITT8");
}
}
Pizzabestellung.java
import java.awt.*; // Datentypen wie JTextField
import java.awt.event.*; //Ereignisbehandlung
import java.io.*; // Für Input und Output
import javax.swing.*; // Für JFrame etc.
class PizzaBestellung extends JFrame implements ActionListener{
//Interface
//Instanzvariablen - Global verfügbar -> Wenn nicht notwendig: Im Konstruktor anlegen
JTextField jtName, jtTel;
JRadioButton g_26, g_30;
ButtonGroup group;
JComboBox<String> pizzaArt;
JCheckBox jcBSalami, jcBPeperoni, jcBSchinken;
Integer bestellNr = 1;
public PizzaBestellung(String titel){
// JTextField jtName, jtTel; --- Für den Fall, dass die Felder nicht Global verfügbar sein müssen
// Legt Fenstertitel fest
super(titel); //super(); wird automatisch ausgeführt, wenn nicht anders spezifiziert
//setTitle(titel); - Alternativ
setLayout(new GridLayout(8,1));
//kein Layout: setLayout(null);
Font schrift = new Font("Monospaced",Font.BOLD+Font.ITALIC,30);
Font schrift1 = new Font("Monospaced",Font.BOLD+Font.ITALIC,20);
//-------------------- Zeile 1: Farbiges Text-Label ---------------------
JLabel lb1 = new JLabel("Pizzabestellung",JLabel.CENTER);
lb1.setForeground(Color.RED); // ... new Color(123,45,6);
lb1.setBackground(Color.YELLOW);
lb1.setOpaque(true);
lb1.setFont(schrift);
//lb1.setFont(new Font("Monospaced",Font.BOLD+Font.ITALIC,30));
add(lb1);
//--------------------- Zeile 2: Textfeld für Name --------------------
JPanel pZeile2 = new JPanel(); //leeren Container erzeugen
//Default: FlowLayout
JLabel jlName = new JLabel("Name: ");
jlName.setFont(schrift);
pZeile2.add(jlName); //Komponenten dem Panel zuordnen
jtName = new JTextField(20);
pZeile2.add(jtName);
add(pZeile2); //Panel in zweite Grid-Zelle
//--------------------- Zeile 3: Textfeld für Telefonnummer --------------------
JPanel pZeile3 = new JPanel();
JLabel jlTel = new JLabel("Tel.: ");
jlTel.setFont(schrift);
pZeile3.add(jlTel); //Komponenten dem Panel zugeordnet
jtTel = new JTextField(20);
pZeile3.add(jtTel);
add(pZeile3); //Panel in dritte Grid-Zelle
//--------------------- Zeile 4: Radiobutton-Group für Größe --------------------
JPanel pZeile4 = new JPanel();
//Optik
g_26 = new JRadioButton("26cm");
g_26.setSelected(true);
g_26.setFont(schrift);
pZeile4.add(g_26);
g_30 = new JRadioButton("30cm");
g_30.setSelected(true); //wird ignoriert aufgrund der button group
g_30.setFont(schrift);
pZeile4.add(g_30);
add(pZeile4);
//Logik
group = new ButtonGroup();
group.add(g_26);
group.add(g_30);
//--------------------- Zeile 5: Dropdown für Sorte --------------------
String[] pizza = { "Salami", "Hawaii", "VierJahresZeiten" , "Ruccula" };
pizzaArt = new JComboBox<String>(pizza);
pizzaArt.setSelectedIndex(2); // Standard-Auswahl festlegen
pizzaArt.setFont(schrift);
add(pizzaArt);
//--------------------- Zeile 6: Label --------------------
JLabel lb6 = new JLabel("Extra: ",JLabel.LEFT);
lb6.setForeground(Color.BLUE); // ... new Color(123,45,6);
lb6.setFont(schrift);
add(lb6);
//--------------------- Zeile 7: Checkboxen für Zusatzoptionen --------------------
JPanel pZeile7 = new JPanel();
jcBSalami = new JCheckBox("Salami");
jcBSalami.setFont(schrift1);
pZeile7.add(jcBSalami);
jcBPeperoni = new JCheckBox("Peperoni");
jcBPeperoni.setFont(schrift1);
pZeile7.add(jcBPeperoni);
jcBSchinken = new JCheckBox("Schinken");
jcBSchinken.setFont(schrift1);
pZeile7.add(jcBSchinken);
add(pZeile7);
//--------------------- Zeile 8: Panel für Buttons --------------------
JPanel pZeile8 = new JPanel();
JButton jbSenden = new JButton("Senden");
jbSenden.setFont(schrift1);
jbSenden.addActionListener(this);
pZeile8.add(jbSenden);
JButton jbAbbrechen = new JButton("Abbrechen");
jbAbbrechen.setFont(schrift1);
jbAbbrechen.addActionListener(new AbbrechenEreignis());
pZeile8.add(jbAbbrechen);
JButton ende = new JButton("Ende");
ende.setFont(schrift1);
ende.addActionListener(new EndeEreignis(jtName));
pZeile8.add(ende);
add(pZeile8);
setSize(400,400);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent e){
//hier steht das, was passiert
System.out.println("Action Performed");
if (e.getActionCommand().equals("Senden"))
{
//Textfelder
String name = jtName.getText(); //Auslesen des Textfeldes
String tel = jtTel.getText();
//RadioButton
String groesse;
if (g_26.isSelected()) {
groesse = "26cm";
}
else {
groesse = "30cm";
} // end of if-else
//ComboBox - Implizites Typecasting, da Object returned wird
String p_Art = (String)pizzaArt.getSelectedItem();
//CheckBoxen
String salami;
if (jcBSalami.isSelected()) {
salami = "Salami";
}
else {
salami = "nein";
} // end of if-else
String peperoni;
if (jcBPeperoni.isSelected()) {
peperoni = "Peperoni";
}
else {
peperoni = "nein";
} // end of if-else
String schinken;
if (jcBSchinken.isSelected()) {
schinken = "Schinken";
}
else {
schinken = "nein";
} // end of if-else
//Ausgabe in der Console
System.out.println("------Pizzabestellung-------");
System.out.println();
System.out.println("Name : " + name);
System.out.println("Tel. : " + tel);
System.out.println();
System.out.println("Groesse: " + groesse);
System.out.println("Art : " + p_Art);
System.out.println("Extras:");
System.out.println(salami);
System.out.println(peperoni);
System.out.println(schinken);
System.out.println();
System.out.println("Vielen Dank fuer ihre Bestellung!");
JOptionPane.showMessageDialog(null,"Best.-Nr. \n"+
bestellNr,"Bestellungsübersicht",JOptionPane.INFORMATION_MESSAGE);
try {
// File-Writer im Append-Modus durch "true" als zweiter Übergabeparameter
BufferedWriter writer = new BufferedWriter(new FileWriter("Bestellungen.txt", true)); //
In Datei schreiben durch Angabe des Dateinamen
writer.write(bestellNr.toString());
writer.newLine(); // Neue Zeile in die Datei
writer.close();
} catch (Exception exception) {
exception.printStackTrace();
}
System.out.println("Einlesen der letzten Bestellungsnummern:\n");
try {
BufferedReader in = new BufferedReader(new FileReader("Bestellungen.txt"));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
br2bw(in,out);
}
catch (Exception exception) {
exception.printStackTrace();
}
bestellNr++;
}
else {
} // end of if-else
}
public static void br2bw(BufferedReader br, BufferedWriter bw)
throws IOException {
String z; // Zeile
while ((z = br.readLine()) != null) { // lesen, Stromende pruefen,
bw.write(z); // ausgeben und
bw.newLine(); // Zeilenwechsel ausgeben
}
br.close();
bw.close(); // Schließt den Output-Stream permanent! Auch System.out!
}
class AbbrechenEreignis implements ActionListener{
public void actionPerformed(ActionEvent e){
//Textfelder leeren
jtName.setText("");
jtTel.setText("");
//Radiobutton unausgewaehlt
g_26.setSelected(true);
//ComboBox - Vorauswahl
pizzaArt.setSelectedIndex(2);
//Checkboxen leeren
jcBSalami.setSelected(false);
jcBPeperoni.setSelected(false);
jcBSchinken.setSelected(false);
}
}
}
EndeEreignis.java
import java.awt.event.*; //Ereignisbehandlung
import javax.swing.JTextField;
class EndeEreignis implements ActionListener{
JTextField jtname;
// Beim Erstellen der Klasse wird das Textfeld übergeben, da es nicht global verfügbar ist
EndeEreignis(JTextField jtname){
this.jtname = jtname;
}
public void actionPerformed(ActionEvent e){
System.out.println(jtname.getText()); // Textfeldinhalt wird ausgegeben
System.exit(0); //beendet den GUI-Prozess
}
}
Laplace/Semaphore
Teilnehmer.java
// Teilnehmer.java
import java.util.concurrent.Semaphore;
import java.util.Random;
import java.io.IOException;
public class Teilnehmer extends Thread {
private final Semaphore sem;
private final LaplaceFile file;
private final Random rnd = new Random();
public Teilnehmer(LaplaceFile file, Semaphore sem, String name) {
super(name);
this.sem = sem;
this.file = file;
}
@Override
public void run() {
// Jeder Teilnehmer schreibt 10 Zeilen mit jeweils drei Würfen (jeweils 1..6)
for (int i = 0; i < 10; i++) {
int a = rnd.nextInt(6) + 1;
int b = rnd.nextInt(6) + 1;
int c = rnd.nextInt(6) + 1;
String line = a + "," + b + "," + c; // Format: 1,2,3
String fullLine = getName() + ": " + line; // Teilnehmername voranstellen
try {
sem.acquire();
file.writeLine(fullLine);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
} catch (IOException e) {
// Fehler beim Schreiben: kurz melden und weitermachen
System.err.println("Schreibfehler von " + getName() + ": " + e.getMessage());
} finally {
sem.release();
}
try {// !!!Bräuchte man eigentlich im realen PROG. NICHT!!!
Thread.sleep(rnd.nextInt(50)); // kurz warten, um Parallelität sichtbar zu
machen
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}
}
LaplaceFile.java
// LaplaceFile.java
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException; // für lese/schreibfehler
public class LaplaceFile {
private final BufferedWriter bw;
public LaplaceFile(String datei) throws IOException {
bw = new BufferedWriter(new FileWriter(datei, false)); // false = überschreiben | true =
anhängen
}
public synchronized void writeLine(String line) throws IOException {
bw.write(line);
bw.newLine();
bw.flush();
}
public void close() throws IOException {
bw.close();
}
}
LaplaceTest.java
// LaplaceTest.java
import java.util.Scanner;
import java.util.concurrent.Semaphore;
public class LaplaceTest {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.print("Anzahl Teilnehmer: ");
int teilnehmer = sc.nextInt();
sc.close();
Semaphore sem = new Semaphore(5); // 5 Schreibende gleichzeitig
LaplaceFile lf = new LaplaceFile("laplace.txt");
Teilnehmer[] arr = new Teilnehmer[teilnehmer];
for (int i = 0; i < teilnehmer; i++) {
arr[i] = new Teilnehmer(lf, sem, "Teilnehmer" + (i + 1));
arr[i].start(); // !!!Threads starten run()!!!
}
for (int i = 0; i < teilnehmer; i++) {
arr[i].join(); // !!!Warten bis alle Threads beendet sind.!!!
}
lf.close();// Datei schließen
System.out.println("Alle Würfe geschrieben in `laplace.txt`.");
}
}
LaplaceAnalyzer.java(REGEX)
// LaplaceAnalyzer.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class LaplaceAnalyzer {
public static void main(String[] args) {
// nicht notwendig Argument auslesen wenn was da „laplace.txt“ nutzen
String path = args.length > 0 ? args[0] : "laplace.txt";
// Sehr einfacher Regex: sucht exakt nach der Sequenz 6,6,6
Pattern pattern = Pattern.compile("6,6,6");// <- Hier REGEX
int count = 0;
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
String line;
while ((line = br.readLine()) != null) {
Matcher m = pattern.matcher(line);
if (m.find()) {
count++;
}
}
System.out.println("Datei: " + path);
System.out.println("Verwendeter regulärer Ausdruck: " + pattern.pattern());
System.out.println("Anzahl Zeilen mit dreimal 6: " + count);
} catch (FileNotFoundException e) {
System.err.println("Datei nicht gefunden: " + path);
System.err.println("Stelle sicher, dass die Datei im Projektverzeichnis liegt oder
gib einen Pfad als Argument an.");
} catch (IOException e) {
System.err.println("Fehler beim Lesen der Datei: " + e.getMessage());
}
}
}
Try-Vergleich Alt/Neu
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
public class TryVergleich {
public static void main(String[] args) {
String dateiName = "test.txt";
erstelleTestDatei(dateiName);
// --- VARIANTE 1: Der klassische try-Block ---
System.out.println("--- Variante 1: Klassisch ---");
Scanner klassischerScanner = null;
try {
// Die Ressource wird im Block geöffnet
klassischerScanner = new Scanner(new File(dateiName));
System.out.println("Inhalt: " + klassischerScanner.nextLine());
// PROBLEM: Wenn hier ein Fehler passiert, wird .close() nie erreicht!
// klassischerScanner.close();
} catch (FileNotFoundException e) {
System.err.println("Fehler: Datei nicht gefunden.");
} finally {
// Wir MÜSSEN manuell prüfen und schließen
if (klassischerScanner != null) {
klassischerScanner.close();
System.out.println("Scanner manuell geschlossen.");
}
}
System.out.println("\n--- Variante 2: Try-with-Resources ---");
// --- VARIANTE 2: Das moderne try (Ressource) { ... } ---
// Die Ressource wird in den RUNDEN Klammern definiert.
try (Scanner modernerScanner = new Scanner(new File(dateiName))) {
System.out.println("Inhalt: " + modernerScanner.nextLine());
// KEIN .close() nötig! Java schließt den Scanner automatisch,
// sobald die geschweifte Klammer unten erreicht wird.
} catch (FileNotFoundException e) {
System.err.println("Fehler: Datei nicht gefunden.");
}
// Kein 'finally' Block für das Schließen mehr nötig.
System.out.println("Scanner wurde automatisch von Java geschlossen.");
}
// Hilfsmethode zum Erstellen der Datei
private static void erstelleTestDatei(String name) {
try (PrintWriter writer = new PrintWriter(name)) {
writer.println("Hallo Java-Welt!");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
Java-Programm zu REGEX
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class RegexBeispiele {
public static void main(String[] args) {
System.out.println("--- 1. EINFACHE VALIDIERUNG (String Methoden) ---");
stringMatchesDemo();
System.out.println("\n--- 2. KOMPLEXE SUCHE & EXTRAKTION (Pattern & Matcher) ---");
patternMatcherFindDemo();
System.out.println("\n--- 3. ERSETZEN VON TEXT (Replace) ---");
replaceDemo();
System.out.println("\n--- 4. TEXT AUFTEILEN (Split) ---");
splitDemo();
System.out.println("\n--- 5. REGEX MIT JAVA STREAMS (Java 8+) ---");
streamPredicateDemo();
}
// 1. Validierung direkt auf dem String
private static void stringMatchesDemo() {
String email = "test.user@example.com";
// Einfacher Regex für E-Mails (nicht für den produktiven Einsatz optimiert)
String regex = "^[A-Za-z0-9+_.-]+@(.+)$";
// String.matches() prüft, ob der GANZE String dem Muster entspricht
boolean isValid = email.matches(regex);
System.out.println("Ist die E-Mail gültig? " + isValid);
}
// 2. Suchen und Extrahieren (Gruppen)
private static void patternMatcherFindDemo() {
String text = "Die Bestellung #12345 kostet 99.50 Euro. Bestellung #67890 kostet 12.00
Euro.";
// Pattern.compile() ist effizienter, wenn das Muster mehrfach genutzt wird.
// Wir nutzen Capture Groups '()' um Nummer und Preis zu extrahieren.
Pattern pattern = Pattern.compile("#(\\d+).*?(\\d+\.\\d{2})");
Matcher matcher = pattern.matcher(text);
// Matcher.find() sucht das nächste Vorkommen im Text
while (matcher.find()) {
System.out.println("Gefunden: " + matcher.group(0)); // Gesamter Match
System.out.println(" -> Bestellnummer (Gruppe 1): " + matcher.group(1));
System.out.println(" -> Preis (Gruppe 2): " + matcher.group(2));
}
}
// 3. Text ersetzen
private static void replaceDemo() {
String unsaubererText = "Hier sind viel zu viele Leerzeichen.";
// String.replaceAll() nutzt intern Regex
String saubererText = unsaubererText.replaceAll("\\s+", " ");
System.out.println("Bereinigt: " + saubererText);
// Ersetzen mit Matcher (komplexere Logik)
String datum = "Heute ist der 2026-02-23.";
Pattern datePattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher dateMatcher = datePattern.matcher(datum);
// Formatiert YYYY-MM-DD zu DD.MM.YYYY ($3 = Gruppe 3, etc.)
String deutschesDatum = dateMatcher.replaceAll("$3.$2.$1");
System.out.println("Datum umformatiert: " + deutschesDatum);
}
// 4. Strings in Arrays aufteilen
private static void splitDemo() {
String csvZeile = "Apfel, Banane; Orange|Pfirsich";
// Wir splitten bei Komma, Semikolon oder Pipe, gefolgt von optionalen Leerzeichen
String[] fruechte = csvZeile.split("[,;|]\\s*");
System.out.println("Gefundene Früchte:");
for (String frucht : fruechte) {
System.out.println("- " + frucht);
}
}
// 5. Moderne Filterung mit Streams und Pattern.asPredicate()
private static void streamPredicateDemo() {
List<String> worte = Arrays.asList("Apfel", "123", "Banane", "456", "Kirsche");
// Nur Strings behalten, die ausschließlich aus Zahlen bestehen
Pattern numberPattern = Pattern.compile("^\\d+$");
List<String> nurZahlen = worte.stream()
.filter(numberPattern.asPredicate()) // Wandelt Regex in ein Predicate um
.collect(Collectors.toList());
System.out.println("Nur Zahlen gefiltert: " + nurZahlen);
}
}
Java REGEX PDF







Beispiel Aufgaben REGEX
Wörter beginnen und enden mit aba
^aba(a|b)*aba$
^ → Start des Strings
aba → muss am Anfang stehen
(a|b)* → beliebige Folge aus a und b (auch leer erlaubt)
aba → muss am Ende stehen
$ → Ende des Strings
Nur Paare ab oder ba
^(ab|ba)+$
(ab|ba) → erlaubt nur die Paare „ab“ oder „ba“
+ → mindestens ein solches Paar
dadurch sind nur gerade Längen möglich und keine einzelnen a oder b
DNA-Sequenz mit A,T,C,G unabhängig von Groß-/Kleinschreibung
^(?i)[ATCG]+$
Oder
^[ATCGatcg]+$ (insensitive)
Erklärung:
- (?i) → Groß-/Kleinschreibung ignorieren
- ATCG → nur erlaubte Zeichen
- → mindestens ein Zeichen
Beispiel Regex
Hier ist eine kompakte Sammlung sehr nützlicher Regex-Beispiele in Java, jeweils mit kurzer Erklärung und Beispiel:
Nur Buchstaben (a–z, A–Z)
"^[a-zA-Z]+$"
✔ erlaubt nur Buchstaben, mindestens 1 Zeichen
Nur Zahlen
"^[0-9]+$"
✔ nur Ziffern (z. B. „12345“)
Alphanumerisch (Buchstaben + Zahlen)
"^[a-zA-Z0-9]+$"
Einfache E-Mail-Prüfung
"^[\\w.-]+@[\\w.-]+\.[a-zA-Z]{2,}$"
✔ deckt typische Fälle ab (nicht 100 % RFC-konform, aber praxisnah)
Starkes Passwort
(Mind. 8 Zeichen, Groß-, Kleinbuchstaben, Zahl)
"^(?=.[a-z])(?=.[A-Z])(?=.*\\d).{8,}$"
Telefonnummer (einfach)
"^\\+?[0-9 ]{7,15}$"
✔ erlaubt internationale Nummern mit optionalem +
URL (vereinfacht)
"^(https?://)?(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}.*$"
DNA-Sequenz (A, T, C, G, case-insensitive)
"(?i)^[ATCG]+$"
✔ (?i) = Groß-/Kleinschreibung ignorieren
Wiederholte Zeichen erkennen
(z. B. „aaa“, „111“)
"(.)\\1+"
Leerzeichen trimmen (Anfang & Ende)
"^\\s+|\\s+$"
Wort finden (z. B. „cat“ als ganzes Wort)
"\bcat\b"
Datum (Format: DD.MM.YYYY)
"^(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[0-2])\.[0-9]{4}$"
Java Anwendung allgemein
String regex = "^a-zA-Z+$";
boolean result = "Hallo".matches(regex);
Semaphore_Buch(Seidel)
Besucher.java
import java.util.concurrent.Semaphore;
import java.io.*;
public class Besucher extends Thread {
Semaphore sem;
Kondolenzbuch opaF;
String name;
// Konstruktor für zwei Übergabewerte(Semaphore, String)
Besucher(Kondolenzbuch opaF,Semaphore sem, String name) {
this.sem = sem;
this.opaF = opaF;
this.name = name;
}
public void run() {
try {
// Besucher wartet auf einen Platz
System.out.println(this.name + " Wartet auf Eintritt.");
sem.acquire();
// Gast hat einen Platz bekommen
System.out.println(this.name + " Kann ins Kondolenzbuch schreiben.");
// Schreiben in Datei - Baustein
opaF.writeLog("Ruhe sanft, Opa Friedrich wünscht " + this.name);
}
catch (InterruptedException e) {}
catch (IOException e) {
}
finally {
sem.release();
// Der Gast gibt den Platz wieder frei
System.out.println(this.name + " verlässt Ruhesanft2.0.");
}
}
}
Kondolenzbuch.java
import java.io.*;
import java.util.*;
class Kondolenzbuch{
BufferedWriter bw;
public Kondolenzbuch(String datei) throws IOException{
bw = new BufferedWriter(new FileWriter(datei,true));
}
public synchronized void writeLog(String message) throws IOException{
bw.write(new Date().toString());
bw.write(message);
bw.newLine();
}
public void schliessen() throws IOException{
bw.close();
}
}
RuheSanft.java(Main)
import java.util.concurrent.Semaphore;
public class RuheSanft {
public static void main(String[] args) throws Exception{
Semaphore sem = new Semaphore(2); //faire Warteschlange
Kondolenzbuch opaF = new Kondolenzbuch("opaF.txt");
String name = "Besucher";
Besucher[] bes = new Besucher[20];
// 20 Besucher von "Opa Friedrich"
for (int i = 0; i < 20; i++) {
bes[i] = new Besucher(opaF,sem, name+(i+1));
bes[i].start();
}
for (int i = 0; i < 20; i++) {
bes[i].join();
} // end of for
opaF.schliessen();
}
}
Runnable + Thread
// Methode 1: Implementierung des Runnable-Interfaces (Empfohlen)
// Hier trennen wir die Aufgabe (Task) von der Ausführung (Thread).
class MeinTask implements Runnable {
private String name;
public MeinTask(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(name + " arbeitet... Schritt " + i);
try {
// Simuliert eine kurze Arbeitspause (500 Millisekunden)
Thread.sleep(500);
} catch (InterruptedException e) {
System.out.println(name + " wurde unterbrochen.");
return;
}
}
System.out.println(name + " ist fertig!");
}
}
//--------------------------------------------------
// Methode 2: Erweiterung der Thread-Klasse
// Dies ist einfacher, aber weniger flexibel, da man nicht mehr von anderen Klassen erben kann.
class ThreadErweiterung extends Thread {
@Override
public void run() {
System.out.println("Ich bin ein Thread, der direkt von der Thread-Klasse erbt.");
}
}
//---------------------------------------------------------
public class ThreadBeispiel {
public static void main(String[] args) {
System.out.println("--- Programm gestartet ---");
// --- Anwendung von Runnable ---
// Wir erstellen die Aufgabe (Runnable)
Runnable aufgabe1 = new MeinTask("Thread A");
Runnable aufgabe2 = new MeinTask("Thread B");
// Wir erstellen die Worker (Threads) und geben ihnen die Aufgaben
Thread thread1 = new Thread(aufgabe1);
Thread thread2 = new Thread(aufgabe2);
// --- Anwendung der Thread-Erweiterung ---
Thread thread3 = new ThreadErweiterung();
// Starten der Threads
// WICHTIG: Man ruft .start() auf, NICHT .run().
// .start() weist dem Betriebssystem an, einen neuen Thread zu erstellen.
thread1.start();
thread2.start();
thread3.start();
// Der Main-Thread läuft hier parallel weiter
System.out.println("Der Main-Thread läuft auch gerade...");
try {
// Wir warten hier, bis alle Threads fertig sind, bevor das Programm endet
thread1.join();
thread2.join();
thread3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("--- Alle Threads beendet. Programm Ende. ---");
}
}
Runnable
public class RunnableBeispiel {
public static void main(String[] args) {
// Runnable erstellen
Runnable aufgabe = new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println("Thread läuft: " + i);
try {
Thread.sleep(1000); // 1 Sekunde warten
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
// Thread mit Runnable starten
Thread thread = new Thread(aufgabe);
thread.start();
// Hauptthread läuft weiter
System.out.println("Main-Methode beendet");
}
Modern mit Lamda ab java 8
public class RunnableLambda {
public static void main(String[] args) {
Runnable aufgabe = () - > {
for (int i = 1; i <= 5; i++) {
System.out.println("Lambda-Thread: " + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread thread = new Thread(aufgabe);
thread.start();
System.out.println("Main läuft weiter");
}
}
Prüfung 2023
Aufgabe 1
public class Ratte {
private String nameMutter;
private int code;
public static final int MIN = 10000;
public static final int MAX = 99999;
public Ratte(String nameMutter) {
this.nameMutter = nameMutter;
this.code = buildCode();
}
public String getNameMutter() {
return nameMutter;
}
public void setNameMutter(String nameMutter) {
this.nameMutter = nameMutter;
}
public int getCode() {
return code;
}
private int buildCode() {
return (int)(Math.random() * (MAX - MIN + 1)) + MIN;
}
@Override
public String toString() {
return nameMutter + "-" + code;
}
}
Aufgabe 2
public class RatteTest {
public static void main(String[] args) {
Ratte r1 = new Ratte("Elvira");
Ratte r2 = new Ratte("Elvira");
Ratte r3 = new Ratte("Elvira");
System.out.println(r1);
System.out.println(r2);
System.out.println(r3);
}
}
Aufgabe 3
import javax.swing.*;
import java.awt.*;
public class Ratten_Registrierung extends JFrame {
JLabel titel;
JLabel lblName;
JTextField txtName;
JRadioButton gesund;
JRadioButton krank;
ButtonGroup gruppe;
JButton erfassen;
public Ratten_Registrierung() {
setTitle("Ratten Registrierung");
setSize(350, 150);
setLayout(new FlowLayout());
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
titel = new JLabel("Ratten Registrierung");
titel.setFont(new Font("Courier", Font.ITALIC, 24));
titel.setForeground(Color.BLUE);
lblName = new JLabel("Name Muttertier:");
txtName = new JTextField(15);
gesund = new JRadioButton("gesund", true);
krank = new JRadioButton("krank");
gruppe = new ButtonGroup();
gruppe.add(gesund);
gruppe.add(krank);
erfassen = new JButton("Erfassen");
erfassen.setBackground(Color.YELLOW);
add(titel);
add(lblName);
add(txtName);
add(gesund);
add(krank);
add(erfassen);
setVisible(true);
}
public static void main(String[] args) {
new Ratten_Registrierung();
}
}
Aufgabe 4
import java.awt.event.*;
import java.io.*;
public class Ratten_Registrierung extends JFrame {
...
public Ratten_Registrierung() {
...
erfassen.addActionListener(new RegEreignis());
setVisible(true);
}
class RegEreignis implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (krank.isSelected()) {
System.out.println("Jungtier als Versuchstier ungeeignet!");
} else {
Ratte r = new Ratte(txtName.getText());
try {
FileWriter fw = new FileWriter("Ratten_Liste.txt", true);
PrintWriter pw = new PrintWriter(fw);
pw.println(r);
pw.close();
} catch (IOException ex) {
System.out.println("Listeneintrag erfolglos!");
}
}
txtName.setText("");
gesund.setSelected(true);
}
}
}
Aufgabe 5
String name = txtName.getText();
while (name == null || name.trim().isEmpty()) {
name = JOptionPane.showInputDialog(
null,
"Bitte Namen eingeben!"
);
}
txtName.setText(name);
Danach kann die Ratte normal erzeugt werden:
Ratte r = new Ratte(name);
Aufgabe 6 – Programm Auswahl.java
import java.io.*;
import java.util.regex.*;
public class Auswahl {
public static void main(String[] args) throws Exception {
BufferedReader br =
new BufferedReader(new FileReader("Ratten_Liste.txt"));
String ersteZeile = br.readLine();
br.close();
String nameMutter =
ersteZeile.substring(0, ersteZeile.indexOf("-"));
String regex = nameMutter + "-\\d{5}";
Pattern p = Pattern.compile(regex);
br = new BufferedReader(new FileReader("Ratten_Liste.txt"));
String[] vTiere = new String[3];
int zaehler = 0;
String zeile;
while ((zeile = br.readLine()) != null && zaehler < 3) {
Matcher m = p.matcher(zeile);
if (m.matches()) {
vTiere[zaehler] = zeile;
zaehler++;
}
}
br.close();
for (String s: vTiere) {
System.out.println(s);
}
}
}
Aufgabe 7 – Eigene Exception
Klasse ZuWenigRattenException
public class ZuWenigRattenException extends RuntimeException {
public ZuWenigRattenException(String meldung) {
super(meldung);
}
}
Instanziierung und Werfen
throw new ZuWenigRattenException(
"Zu wenig Versuchstiere vorhanden!");
Behandlung
try {
throw new ZuWenigRattenException(
"Zu wenig Versuchstiere vorhanden!");
} catch (ZuWenigRattenException e) {
System.out.println(e.getMessage());
}
Inhaltsverzeichnis
Buchseiten 4
BASICS 4
Variables & Data Types 4
Basic Input (Scanner) 4
Basic Output 4
Arithmetic Operations 5
If / Else 5
Switch Case 5
Loops (For /While) 5
Arrays 5
Methods 6
Classes & Objects & Main 6
Klassen 6
Einfache Klasse – Person 6
Abstrakte Klasse – Animal 7
Vererbung – Dog 7
Interface – Movable 7
Klasse, die ein Interface implementiert – Car 7
Main-Klasse zum Testen 7
GUI – JavaX.swing 8
Komplettes Beispiel mit allen Layouts + Eventhandling 8
JPanel – JLabel-JTextField 11
JOptionPane 12
// Einfache Nachricht 12
// Warnung 12
// Fehler 12
// Frage-Dialog 12
// Bestätigungsdialog (Ja/Nein) 12
// Bestätigungsdialog (Ja/Nein/Abbrechen) 12
// InputDialog – Freitext 12
// InputDialog – Dropdown Auswahl 13
// OptionDialog – völlig frei 13
// Eigenes Icon (optional – funktioniert nur, wenn Bild existiert) 13
// Nur Information ohne Titel 13
// Nur OptionDialog ohne Icon / pure Buttons 13
// Dialog mit Textfeld + Buttons 13
JOptionPane-Beispiel mit Ausgabe 14
FILE IO + Exeptionhandling 16
FILE IO mit exeptionhandling + eigene exeption 16
EXEPTIONS 17
Exeptions nochmal aber alles 17
Alles über Strings Buch s. 197 19
Strings 19
StringBuilder 19
StringBuffer 20
CharSequence 20
StringTokenizer 20
String – Cheat sheet komplett 21
Collections 22
// HashSet 22
// TreeSet 22
// Andere 22
// EnumSet 22
Generische Datentypen 23
Enum 23
Java Imports 24
Schwimmer GUI übung von Seidel 25
SchwimmerGUI.java 25
Ereignisklassen.java 26
Schwimmer.java 26
Schwimmer GUI LÖSUNG von Seidel 27
SchwimmerGUI.java 27
ZuruecksetzenEreignis.java 28
Pizza-Übung von ITT78 (PRIO, bei bedarf schwimmer anschauen) 29
PizzaTest.java 29
Pizzabestellung.java 29
EndeEreignis.java 32
Laplace/Semaphore 33
Teilnehmer.java 33
LaplaceFile.java 33
LaplaceTest.java 34
LaplaceAnalyzer.java(REGEX) 34
Try-Vergleich Alt/Neu 35
Java-Programm zu REGEX 36
Java REGEX PDF 38
Beispiel Aufgaben REGEX 45
Beispiel Regex 45
Nur Buchstaben (a–z, A–Z) 45
Nur Zahlen 45
Alphanumerisch (Buchstaben + Zahlen) 45
Einfache E-Mail-Prüfung 45
Starkes Passwort 46
Telefonnummer (einfach) 46
URL (vereinfacht) 46
DNA-Sequenz (A, T, C, G, case-insensitive) 46
Wiederholte Zeichen erkennen 46
Leerzeichen trimmen (Anfang & Ende) 46
Wort finden (z. B. „cat“ als ganzes Wort) 46
Datum (Format: DD.MM.YYYY) 46
Java Anwendung allgemein 46
Semaphore_Buch(Seidel) 47
Besucher.java 47
Kondolenzbuch.java 47
RuheSanft.java(Main) 48
Runnable + Thread 48
Runnable 49
Modern mit Lamda ab java 8 49
Prüfung 2023 50
Aufgabe 1 50
Aufgabe 2 50
Aufgabe 3 51
Aufgabe 4 52
Aufgabe 5 52
Aufgabe 6 – Programm Auswahl.java 53
Aufgabe 7 – Eigene Exception 53