Sonderzeichen und Escape-Sequenzen in Java
Java Escape-Sequenzen wie \n, \t, \\, \" und Unicode-Escapes in String-Literalen verwenden.
Einige Zeichen lassen sich nicht direkt in einem String-Literal schreiben — ein " würde den String beenden, ein direkter Zeilenumbruch würde die Quellzeile unterbrechen, und ein Backslash hat bereits eine besondere Aufgabe: Er signalisiert dem Compiler, das Folgende als Escape zu behandeln. Java löst dieses Problem mit Escape-Sequenzen: kurze, mit einem Backslash beginnende Codes, die für diese schwierigen Zeichen stehen. Ein separater Mechanismus, Unicode-Escapes (\uXXXX), ermöglicht es, jeden Code-Punkt der Basic Multilingual Plane über seinen Hexadezimalwert anzugeben.
Diese Seite behandelt die Standard-Escape-Sequenzen, Escapes innerhalb von char-Literalen, Unicode- und Oktal-Escapes, wie Text-Blöcke die Regeln lockern, und die häufigsten Fehler, über die man stolpert.
Die Standard-Escape-Sequenzen
| Sequenz | Bedeutung |
|---|---|
\n | Zeilenumbruch (LF, U+000A) |
\r | Wagenrücklauf (CR, U+000D) |
\t | Tabulator (U+0009) |
\b | Rücktaste (U+0008) |
\f | Seitenvorschub (U+000C) |
\" | Anführungszeichen |
\' | Apostroph |
\\ | ein einzelner Backslash |
\0 | Null-Zeichen (U+0000) |
\s | Leerzeichen (U+0020), hinzugefügt in Java 15 |
Beispiele:
String multi = "Line 1\nLine 2\nLine 3";
String quoted = "She said \"hi\"";
String tabbed = "name\tage\tcity";
String path = "C:\\Users\\Ada\\code.java";Beim Ausgeben dieser Strings werden die Escape-Sequenzen zu den eigentlichen Zeichen:
Line 1
Line 2
Line 3
She said "hi"
name age city
C:\Users\Ada\code.javaInnerhalb eines char-Literals
Ein char-Literal wird in einfache Anführungszeichen eingeschlossen. Dieselben Escape-Sequenzen gelten, aber die Regeln für Anführungszeichen kehren sich um: Innerhalb einfacher Anführungszeichen muss \' escaped werden, während " direkt geschrieben werden kann. (Innerhalb eines doppelt angeführten Strings ist es umgekehrt — \" wird escaped und ' steht direkt.)
char quote = '\''; // a single-quote character
char tab = '\t'; // a tab
char back = '\\'; // one backslash
char dquote = '"'; // no escape needed hereUnicode-Escapes
Um ein beliebiges Zeichen der Basic Multilingual Plane einzubetten, verwendet man \uXXXX, wobei XXXX der vierstellige hexadezimale Code-Punkt ist:
String greeting = "Café"; // "Café"
String pi = "π ≈ 3.14"; // "π ≈ 3.14"
char heart = '♥'; // '♥'Code-Punkte außerhalb der BMP (die meisten Emoji) benötigen ein Surrogatpaar — zwei \uXXXX-Escapes — daher ist es fast immer einfacher, das Zeichen direkt einzufügen.
\uXXXX in einem allerersten Durchlauf, bevor der Quellcode überhaupt in Tokens aufgeteilt wird. Deshalb ist ein versehentliches (Zeilenumbruch) innerhalb eines Strings ein Kompilierfehler statt eines Laufzeit-Zeilenumbruchs, und warum \uXXXX überall gültig ist — in Kommentaren, Bezeichnern, sogar zwischen Operatoren. Gewöhnliche Escapes wie \n und \t werden erst später, innerhalb von String- und char-Literalen, interpretiert.Oktal-Escapes
\ gefolgt von 1–3 Oktalziffern (0–7) ergibt das Zeichen mit diesem Oktalwert:
char c = '\101'; // 'A' (decimal 65)
char d = '\14'; // form feedDiese sieht man selten — Unicode-Escapes sind klarer.
Text-Blöcke umgehen die meisten Escapes
In einem Text-Block (Java 15+) können Zeilenumbrüche und nicht escapte doppelte Anführungszeichen direkt geschrieben werden — ideal zum Einbetten von JSON, SQL oder HTML. Die einzigen Sequenzen, die noch benötigt werden, sind \\ für einen direkten Backslash und \uXXXX für Unicode:
String json = """
{
"name": "Ada",
"tagline": "She invented programming"
}
""";Zu beachten: Die Schlüssel "name" und "tagline" benötigen kein \" — sie stehen innerhalb eines """..."""-Blocks.
Eine Demonstration
Häufige Fehler
"\n"schreiben und Windows-Zeilenenden erwarten.\nist nur LF. Für plattformkorrekte Zeilenumbrüche in formatierter Ausgabe verwendet man%ninnerhalb vonprintf/format— es wird zum Zeilentrenner des Systems erweitert.- Vergessen, Backslashes in Regex zu escapen. Ein Regex-Muster lebt zunächst in einem Java-String, durchläuft also zwei Escape-Ebenen. Um eine Ziffer (
\d) zu matchen, schreibt man den String"\\d"— der Compiler macht aus\\einen Backslash, und die Regex-Engine liest dann\d. Um einen direkten Backslash zu matchen, benötigt man vier:"\\\\". verwenden, um einen Zeilenumbruch einzubetten.ist der Zeilenumbruch-Code-Punkt, und weil Unicode-Escapes vor dem Tokenizer übersetzt werden, fügt der Compiler mitten in das String-Literal einen echten Zeilenumbruch ein — was ein Syntaxfehler ist. Man verwendet\nfür Zeilenumbrüche innerhalb von Strings;\uXXXXbehält man für druckbare Zeichen vor.- Ein unvollständiges oder ungültiges Unicode-Escape. Auf
\umüssen genau vier Hexadezimalziffern folgen."\u12"oder"\uZZZZ"ist ein Kompilierfehler, kein direkter Backslash. Wenn man ein direktes\uhaben möchte, muss der Backslash escaped werden:"\\u".
Was kommt als Nächstes
Java-Zahlen bietet einen gezielten Blick auf die numerischen Typen, ihre Literale und ihre Präzision.