Java: Ошибки оформления (синтаксиса)
В человеческих языках грамматика важна, но текст с ошибками чаще всего можно понять и прочитать. В программировании все строго. Любое мельчайшее нарушение, и программа не запустится.
Примером может быть забытая ;, неправильно расставленные скобки и другие детали. Подобные ошибки называются синтаксическими, потому что они нарушают правила синтаксиса языка.
Что такое синтаксическая ошибка?
Синтаксическая ошибка — это нарушение грамматических правил написания кода в конкретном языке программирования. Такие ошибки возникают, если код написан с отклонением от ожидаемого формата: не закрыта строка, пропущена скобка или точка с запятой, нарушен порядок символов и так далее.
Код с ошибкой Компилятор Результат
┌──────────────────┐ ┌─────────────┐ ┌──────────────────┐
│ println("Hi" │ ──> │ javac │ ──> │ error: ')' или │
└──────────────────┘ └─────────────┘ │ ';' expected │
└──────────────────┘В отличие от естественных языков, где текст с ошибками можно понять по контексту, в программировании даже малейшее отклонение делает код неработоспособным.
Если программа на Java написана синтаксически некорректно, то компилятор выводит на экран:
- Сообщение об ошибке
- Указание на файл
- Строчка в файле, где по его мнению произошла ошибка
Ниже пример кода с синтаксической ошибкой:
System.out.println("alalaЕсли запустить код выше, то мы увидим следующее сообщение:
| Error:
| unclosed string literal
| System.out.println("alalaПочему такие ошибки считаются простыми?
Синтаксические ошибки:
- легко заметить: код часто подсвечивается в редакторе;
- легко исправить: достаточно вернуть пропущенный символ (
",),;) или поправить структуру.
Но есть ложка дёгтя. Компилятор не всегда указывает точно то место, где допущена ошибка. Иногда проблема находится несколькими строками выше. Например, открытая, но не закрытая скобка на одной строке может «сломать» весь следующий код.
Что делать при синтаксической ошибке?
- Читайте сообщение об ошибке. Оно почти всегда содержит полезную информацию — тип ошибки и строку, где компилятор «споткнулся».
- Проверьте строку, указанную в сообщении, и строку до неё: иногда ошибка «спрятана» чуть раньше (забытая
;на предыдущей строке). - Используйте редактор с подсветкой синтаксиса: он поможет сразу заметить незакрытые кавычки, скобки или пропущенные символы.
Задание
Напишите программу, которая выводит на экран:
What Is Dead May Never DieПосле того как программа заработает, намеренно сломайте её — допустите одну из синтаксических ошибок:
- уберите закрывающую кавычку
"; - уберите закрывающую скобку
); - уберите точку с запятой
;в конце строки.
Запустите код и прочитайте сообщение компилятора. Такие сообщения вы будете видеть часто — важно научиться их читать. Затем верните рабочий вариант, чтобы упражнение прошло проверку.
Полезное
Java: Ошибки оформления (синтаксиса)
В человеческих языках грамматика важна, но текст с ошибками чаще всего можно понять и прочитать. В программировании все строго. Любое мельчайшее нарушение, и программа не запустится.
Примером может быть забытая ;, неправильно расставленные скобки и другие детали. Подобные ошибки называются синтаксическими, потому что они нарушают правила синтаксиса языка.
Что такое синтаксическая ошибка?
Синтаксическая ошибка — это нарушение грамматических правил написания кода в конкретном языке программирования. Такие ошибки возникают, если код написан с отклонением от ожидаемого формата: не закрыта строка, пропущена скобка или точка с запятой, нарушен порядок символов и так далее.
Код с ошибкой Компилятор Результат
┌──────────────────┐ ┌─────────────┐ ┌──────────────────┐
│ println("Hi" │ ──> │ javac │ ──> │ error: ')' или │
└──────────────────┘ └─────────────┘ │ ';' expected │
└──────────────────┘В отличие от естественных языков, где текст с ошибками можно понять по контексту, в программировании даже малейшее отклонение делает код неработоспособным.
Если программа на Java написана синтаксически некорректно, то компилятор выводит на экран:
- Сообщение об ошибке
- Указание на файл
- Строчка в файле, где по его мнению произошла ошибка
Ниже пример кода с синтаксической ошибкой:
System.out.println("alalaЕсли запустить код выше, то мы увидим следующее сообщение:
| Error:
| unclosed string literal
| System.out.println("alalaПочему такие ошибки считаются простыми?
Синтаксические ошибки:
- легко заметить: код часто подсвечивается в редакторе;
- легко исправить: достаточно вернуть пропущенный символ (
",),;) или поправить структуру.
Но есть ложка дёгтя. Компилятор не всегда указывает точно то место, где допущена ошибка. Иногда проблема находится несколькими строками выше. Например, открытая, но не закрытая скобка на одной строке может «сломать» весь следующий код.
Что делать при синтаксической ошибке?
- Читайте сообщение об ошибке. Оно почти всегда содержит полезную информацию — тип ошибки и строку, где компилятор «споткнулся».
- Проверьте строку, указанную в сообщении, и строку до неё: иногда ошибка «спрятана» чуть раньше (забытая
;на предыдущей строке). - Используйте редактор с подсветкой синтаксиса: он поможет сразу заметить незакрытые кавычки, скобки или пропущенные символы.
Задание
Напишите программу, которая выводит на экран:
What Is Dead May Never DieПосле того как программа заработает, намеренно сломайте её — допустите одну из синтаксических ошибок:
- уберите закрывающую кавычку
"; - уберите закрывающую скобку
); - уберите точку с запятой
;в конце строки.
Запустите код и прочитайте сообщение компилятора. Такие сообщения вы будете видеть часто — важно научиться их читать. Затем верните рабочий вариант, чтобы упражнение прошло проверку.
Полезное
Ваше упражнение проверяется по этим тестам
import static org.assertj.core.api.Assertions.assertThat;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;
class AppTest {
public static void main(final String[] args) {
final var expected = "What Is Dead May Never Die";
ByteArrayOutputStream out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
App.main(null);
final var actual = out.toString().trim();
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.out.println(actual);
assertThat(actual).isEqualTo(expected);
}
}Решение учителя откроется через:
20:00
