👋 ПРИСОЕДИНЯЙТЕСЬ К JAVA FLAMES

Наиболее распространенные и досадные типы ошибок, которые учащиеся совершают при обучении программированию, — это синтаксические (и связанные с ними) ошибки. На самом деле, они составляют подавляющее большинство неправильного кода, который студенты запускают, пытаясь решить простые вопросы.

Чтобы понять синтаксические ошибки в программировании, полезно подумать о синтаксических ошибках в естественном (человеческом) языке, таком как английский. Синтаксис – это часть грамматики, которая определяет, как слова в языке упорядочиваются для создания предложений.

Скажем, студент пишет одно из следующих предложений как часть рассказа о своих выходных:

Каждое из них немного неверно, но читателю ясно значение всех предложений. Мы, люди, обладаем удивительной способностью исправлять орфографические или грамматические ошибки в зависимости от контекста предложения или абзаца. В вербальном общении мы еще более гибки, поэтому стенограммы случайных разговоров изобилуют грамматическими ошибками, которые замечаешь только тогда, когда они записаны.

Языки программирования, такие как Python или Java, очень просты по сравнению с естественными языками, такими как английский, испанский или японский. Однако у них есть много общего:

  • важно, в каком порядке слова;
  • у них обоих есть синтаксис (то есть грамматика), который определяет, как слова могут быть объединены вместе;
  • вы должны правильно писать слова;
  • вы можете переводить с одного языка программирования на другой;
  • они оба используют пунктуацию для структурирования и организации слов и предложений;
  • существует несколько способов написать один и тот же код или «абзац» для описания одного и того же.

Однако существует множество различий между языками программирования и человеческими языками. Одним из действительно важных моментов является то, что человеческие языки (и люди) могут справляться с двусмысленностью, а языки программирования (и компьютеры), как правило, не могут.

что такое синтаксические ошибки?

Точно так же, как когда вы пишете на естественном языке, легко сделать орфографические ошибки и опечатки по невнимательности. Однако при кодировании возникает более крупная концептуальная проблема. Многие начинающие программисты не осознают, что компьютеры полностью буквальны и что они не способны угадать, что мы имеем в виду. Для человека значение:

очевидно, потому что оно очень близко к правильному утверждению. Но для компьютера это может быть и другой язык. Как только учащиеся поймут это, это может сильно повлиять на то, как быстро они научатся кодировать.

Синтаксическая ошибка — это ошибка, возникающая, когда компилятор или интерпретатор не может понять оператор исходного кода для создания машинного кода. Другими словами, синтаксические ошибки возникают, когда в программе Java возникают синтаксические проблемы из-за неправильного использования синтаксиса Java.

Например, если вы попытаетесь создать оператор if, который не включает условие в круглых скобках, даже если условие присутствует в той же строке, что и оператор if, это синтаксическая ошибка.

Синтаксические ошибки и «семантические» ошибки — это не одно и то же. Синтаксическая ошибка — это неправильное построение исходного кода, тогда как семантическая ошибка — это ошибочная логика, которая при выполнении дает неверный результат.

Как обнаруживаются синтаксические ошибки?

Синтаксические ошибки легко обнаружить и исправить, потому что компилятор Java находит их за вас. Компилятор сообщит вам, какая часть кода в программе вызвала проблемы, и наиболее точное предположение о том, что вы сделали неправильно. Обычно компилятор указывает точную строку, где ошибка, или иногда строку непосредственно перед ней.

Компилятор поймает большинство этих ошибок за вас. Если синтаксис вашего кода неверен, то в большинстве случаев компилятор не может использовать код для создания байтового кода для JRE.

Когда компилятор Java обнаруживает синтаксические ошибки в программе, он предотвращает успешную компиляцию кода и не создает файл .class, пока ошибки не будут исправлены. На экране вывода появится сообщение об ошибке.

Эти ошибки обнаруживаются компилятором Java во время компиляции программы, поэтому они также известны как ошибки времени компиляции.

Что вызывает синтаксические ошибки?

Использование неправильной заглавной буквы

Одна из наиболее распространенных синтаксических ошибок, которую допускают новые разработчики, заключается в том, что ключевые слова пишутся с заглавной буквы, а не строчными. Java чувствителен к регистру, поэтому важно использовать правильный регистр при вводе кода.

Эта же ошибка может возникнуть с именами классов, переменными или любым другим кодом, который вы вводите как часть своего Java-приложения. Переменная с именем MyVar всегда отличается от переменной с именем myVar.

Разделение строки на две строки

В большинстве случаев Java не волнует, отображается ли ваш код в одной или нескольких строках. Однако, если вы разбиваете строку на строки так, что строка содержит символ новой строки, то компилятор будет возражать.

Ответ заключается в том, чтобы закончить строку в первой строке двойной кавычкой, добавить знак плюс, чтобы указать компилятору, что вы хотите объединить (добавить) эту строку с другой строкой, а затем продолжить строку в следующая строка такая:

System.out.print("This is a really long " +
 "string that appears on two lines.");

Обработка статического метода как метода экземпляра

Статические методы связаны с определенным классом, а методы экземпляра связаны с объектом, созданным из класса.

Забыть имя класса или объекта как часть вызова метода

Вы всегда включаете класс или объект, связанный с методом, перед вызовом метода. Например, Character.toUpperCase() и System.out.print() верны, но простой вызов toUpperCase() или print() неверен.

Исключение предложения break из операторов switch

Легко забыть добавить предложения break в оператор switch. Кроме того, компилятор не поймает эту ошибку. Из-за того, что предложение break не пропущено, ваше приложение будет продолжать выполнять код в операторе switch до тех пор, пока не встретит предложение break или пока оператор switch не завершится.

Например, следующий фрагмент кода демонстрирует выполнение задачи по умолчанию, но предложения break закомментированы.

// Import the required API classes.
import java.util.Scanner;
import java.lang.Character;
public class UseAMenu03
{
   public static void main(String[] args)
   {
      // Create the scanner.
      Scanner GetChoice = new Scanner(System.in);
      // Obtain input from the user.
      System.out.println("Optionsn");
      System.out.println("A. Yellow");
      System.out.println("B. Orange");
      System.out.println("C. Greenn");
      System.out.print("Choose your favorite color: ");
      char Choice = GetChoice.findInLine(".").charAt(0);
      // Convert the input to uppercase.
      Choice = Character.toUpperCase(Choice);
      // Choose the right color based on a switch statement.
      switch (Choice)
      {
         case 'A':
            System.out.println("Your favorite color is Yellow!");
            //break;
         case 'B':
            System.out.println("Your favorite color is Orange!");
            //break;
         case 'C':
            System.out.println("Your favorite color is Green!");
            //break;
         default:
            System.out.println(
                  "Type A, B, or C to select a color.");
            //break;
      }
   }
}

Когда вы выполняете этот код и отвечаете A, приложение выводит все возможные ответы, как показано на этом рисунке.

Отсутствие оператора return

Когда вы создаете метод, который должен возвращать значение, а затем не предоставляете оператор return для возврата значения, компилятор будет жаловаться.

Опечатка в заголовке метода main()

Компилятор не будет жаловаться на эту проблему, но вы увидите ее сразу же, когда попытаетесь запустить приложение. Java будет жаловаться, что не может найти метод main(). Помните, что метод main() должен выглядеть следующим образом:

public static void main (String []args)

Вы можете создать множество других синтаксических ошибок. Как вы поняли, прочитав этот список, компилятор найдет некоторые из них, JRE найдет другие, но с некоторыми, такими как пропуск предложения break в операторе switch, вам придется разобраться. Из трех основных типов ошибок синтаксические ошибки найти легче всего.

Отсутствует точка с запятой

class SyntaxError {
    public static void main(String[] args) {
        int a = 2;
        int b = 4 //Missing semicolon
        System.out.println(a+b);
    }
}

Вывод:

javac /tmp/UDRgGsLLQ6/SyntaxError.java
/tmp/UDRgGsLLQ6/SyntaxError.java:4: error: ';' expected
int b = 4
1 error

Объяснение:
В приведенном выше коде отсутствует точка с запятой в конце оператора int b=4.

Отсутствующие скобки

Если вы делаете вызов метода и не включаете круглые скобки после имени метода (даже если вы не отправляете никаких аргументов методу), компилятор регистрирует ошибку. Например, этот код неверен, потому что print() требует круглых скобок после него:

System.out.print;

Отсутствует скобка

Каждый раз, когда вы хотите, чтобы функция Java применялась к нескольким строкам кода, вы должны заключить весь блок в фигурные скобки ({}). В большинстве случаев компилятор поймает эту ошибку за вас.

Например, если вы попытаетесь завершить класс без закрывающей фигурной скобки, компилятор выдаст ошибку. Это одна из ошибок, когда компилятор может не показать вам точное местоположение ошибки, потому что он не может определить, где отсутствует фигурная скобка — он просто знает, что она отсутствует.

Такого рода ошибки также могут создавать ошибки времени выполнения. Например, если предполагается, что оператор if применяется к нескольким строкам кода, но вы опускаете фигурные скобки, оператор if влияет только на следующую строку кода, и приложение работает неправильно.

class SyntaxError {
    public static void main(String[] args) {
        int a = 2;
        int b = 4;
        System.out.println(a+b);
        // Missing closing bracket
}

Вывод:

javac /tmp/UDRgGsLLQ6/SyntaxError.java
/tmp/UDRgGsLLQ6/SyntaxError.java:7: error: reached end of file while parsing
}
^
1 error

Объяснение:
В приведенном выше коде отсутствует закрывающая фигурная скобка метода main().

Отсутствует двойная кавычка в строке

class SyntaxError {
    public static void main(String[] args) {
        System.out.println(Hello World!);
    }
}

Вывод:

javac /tmp/UDRgGsLLQ6/SyntaxError.java
/tmp/UDRgGsLLQ6/SyntaxError.java:3: error: ')' expected
System.out.println(Hello World!);
^
/tmp/UDRgGsLLQ6/SyntaxError.java:3: error: not a statement
System.out.println(Hello World!);
^
/tmp/UDRgGsLLQ6/SyntaxError.java:3: error: ';' expected
System.out.println(Hello World!);
^
3 errors

Объяснение.
В приведенном выше коде компилятор Java выдает несколько ошибок, потому что он не учитывает сообщение «Hello World!». как строку, поскольку в ней отсутствуют двойные кавычки.

Ключевое слово с ошибкой

class SyntaxError {
  public static void main(String[] args) {
    int a = 2;
    int b = 4;
    system.out.println(a + b); // small s at start of System
  }
}

Вывод:

javac /tmp/UDRgGsLLQ6/SyntaxError.java
/tmp/UDRgGsLLQ6/SyntaxError.java:5: error: package system does not exist
system.out.println(a+b); // small s at start of System
^
1 error

Объяснение.
В приведенном выше коде ключевое слово System в имени System.out.println() написано с ошибкой как system.

Недопустимое имя переменной или функции или класса

Существуют определенные правила для обозначения идентификатора (переменная, функция и имя класса называются идентификаторами) в Java:

  • Все идентификаторы должны начинаться с буквы (от A до Z или от a до z), символа валюты ($) или символа подчеркивания (_).
  • После первого символа идентификаторы могут иметь любую комбинацию символов.
  • Ключевое слово не может использоваться в качестве идентификатора.
  • Самое главное, идентификаторы чувствительны к регистру.
  • Примеры допустимых идентификаторов:
    name3, $uid, _value, _3b__age, roll_no.
  • Примеры недопустимых идентификаторов:
    13ab, -age.
class 1SyntaxError {
    public static void main(String[] args) {
        int a = 2;
        int b = 4;
        System.out.println(a+b);
    }
}

Вывод:

javac /tmp/UDRgGsLLQ6/1SyntaxError.java
/tmp/UDRgGsLLQ6/1SyntaxError.java:1: error: identifier expected
class 1SyntaxError {
^
1 error

Объяснение:
В приведенном выше коде имя основного класса недопустимо, так как оно начинается с цифры.

Забыть импортировать класс

Всякий раз, когда вы хотите использовать определенную функцию Java API, вы должны импортировать соответствующий класс в свое приложение. Например, если ваше приложение содержит String userName;, вы должны добавить import java.lang.String; для импорта класса String.

class SyntaxError {
  public static void main(String[] args) {
    int a = -2;
    Scanner sc = new Scanner(System.in);
    int b = sc.nextInt();
    System.out.println(a + b);
  }
}

Вывод:

javac /tmp/UDRgGsLLQ6/SyntaxError.java
/tmp/UDRgGsLLQ6/SyntaxError.java:4: error: cannot find symbol
Scanner sc = new Scanner(System.in);
^
symbol: class Scanner
location: class SyntaxError
/tmp/UDRgGsLLQ6/SyntaxError.java:4: error: cannot find symbol
Scanner sc = new Scanner(System.in);
--------------------^
symbol: class Scanner
location: class SyntaxError
2 errors

Объяснение.
В приведенном выше коде мы не импортировали пакет java.util.Scanner и не использовали Scanner для получения целочисленного ввода. Это вызвало ошибку.

незакрытый строковый литерал

Сообщение об ошибке незакрытый строковый литерал создается, когда строковый литерал заканчивается без кавычек, и сообщение появляется в той же строке, что и ошибка. (@DreamInCode) Литерал — это исходный код значения

Обычно это происходит, когда:

  • Строковый литерал не заканчивается кавычками. Это легко исправить, закрыв строковый литерал нужной кавычкой.
  • Строковый литерал выходит за пределы строки. Длинные строковые литералы могут быть разбиты на несколько литералов и объединены знаком плюс («+»).
  • Кавычки, являющиеся частью строкового литерала, не экранируются обратной косой чертой («\»).

недостижимое заявление

Операторы Unreachable относятся к операторам, которые не будут выполняться во время выполнения программы, и называются операторами Unreachable. Эти операторы могут быть недоступны по следующим причинам: Имеются операторы return или break перед ними. Перед ними бесконечный цикл.

for(;;){
   break;
   ... // unreachable statement
}
int i=1;
if(i==1)
 ...
else
 ... // dead code
Often simply moving the return statement will fix the error. Read the discussion of how to fix unreachable statement Java software error. (@StackOverflow)

Возвращает значение из метода, тип результата которого недействителен

Эта ошибка Java возникает, когда метод void пытается вернуть какое-либо значение, как в следующем примере:

public static void move()

Часто это исправляется путем изменения сигнатуры метода в соответствии с типом в операторе return. В этом случае экземпляры void можно изменить на int:

public static int move(){

System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}
{
    System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}
 
public static void usersMove(String playerName, int gesture)
{
    int userMove = move();
 
    if (userMove == -1)
    {
    break;
    }

Вызов метода с неправильными параметрами

«метод ‹X› в классе ‹Y› не может быть применен к данным типам»

Это сообщение об ошибке программного обеспечения Java является одним из наиболее полезных сообщений об ошибках. Это объясняет, как сигнатура метода вызывает неправильные параметры.

RandomNumbers.java:9: error: method generateNumbers 
  in class RandomNumbers cannot be applied to given types;
generateNumbers();
required: int[]
found:generateNumbers();
reason: actual and formal argument lists differ in length

Вызванный метод ожидает определенных аргументов, определенных в объявлении метода. Внимательно проверьте объявление метода и вызовите его, чтобы убедиться, что они совместимы.

Неверное объявление метода (требуется возвращаемый тип)

Это сообщение об ошибке программного обеспечения Java означает, что возвращаемый тип метода не был явно указан в сигнатуре метода.

public class Circle
{
    private double radius;
    public CircleR(double r)
    {
        radius = r;
    }
    public diameter()
    {
       double d = radius * 2;
       return d;
    }
}

Есть несколько способов вызвать «недопустимое объявление метода; требуется тип возвращаемого значения» ошибка:

  • Забыл указать тип
  • Если метод не возвращает значение, то в качестве типа в сигнатуре метода необходимо указать «void».
  • Имена конструкторов не должны указывать тип. Но если в имени конструктора есть ошибка, компилятор будет рассматривать конструктор как метод без установленного типа.

Поддержите нашу публикацию, подписавшись на нее