Меню

Синтаксические ошибки это ошибки времени компиляции

Error is an illegal operation performed by the user which results in the abnormal working of the program. Programming errors often remain undetected until the program is compiled or executed. Some of the errors inhibit the program from getting compiled or executed. Thus errors should be removed before compiling and executing. 

The most common errors can be broadly classified as follows:

1. Run Time Error: 

Run Time errors occur or we can say, are detected during the execution of the program. Sometimes these are discovered when the user enters an invalid data or data which is not relevant. Runtime errors occur when a program does not contain any syntax errors but asks the computer to do something that the computer is unable to reliably do. During compilation, the compiler has no technique to detect these kinds of errors. It is the JVM (Java Virtual Machine) that detects it while the program is running. To handle the error during the run time we can put our error code inside the try block and catch the error inside the catch block. 

For example: if the user inputs a data of string format when the computer is expecting an integer, there will be a runtime error. Example 1: Runtime Error caused by dividing by zero 

Java

class DivByZero {

    public static void main(String args[])

    {

        int var1 = 15;

        int var2 = 5;

        int var3 = 0;

        int ans1 = var1 / var2;

        int ans2 = var1 / var3;

        System.out.println(

            "Division of va1"

            + " by var2 is: "

            + ans1);

        System.out.println(

            "Division of va1"

            + " by var3 is: "

            + ans2);

    }

}

Runtime Error in java code:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at DivByZero.main(File.java:14)

Example 2: Runtime Error caused by Assigning/Retrieving Value from an array using an index which is greater than the size of the array 

Java

class RTErrorDemo {

    public static void main(String args[])

    {

        int arr[] = new int[5];

        arr[9] = 250;

        System.out.println("Value assigned! ");

    }

}

RunTime Error in java code:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
    at RTErrorDemo.main(File.java:10)

2. Compile Time Error: 

Compile Time Errors are those errors which prevent the code from running because of an incorrect syntax such as a missing semicolon at the end of a statement or a missing bracket, class not found, etc. These errors are detected by the java compiler and an error message is displayed on the screen while compiling. Compile Time Errors are sometimes also referred to as Syntax errors. These kind of errors are easy to spot and rectify because the java compiler finds them for you. The compiler will tell you which piece of code in the program got in trouble and its best guess as to what you did wrong. Usually, the compiler indicates the exact line where the error is, or sometimes the line just before it, however, if the problem is with incorrectly nested braces, the actual error may be at the beginning of the block. In effect, syntax errors represent grammatical errors in the use of the programming language. 

Example 1: Misspelled variable name or method names 

Java

class MisspelledVar {

    public static void main(String args[])

    {

        int a = 40, b = 60;

        int Sum = a + b;

        System.out.println(

            "Sum of variables is "

            + sum);

    }

}

Compilation Error in java code:

prog.java:14: error: cannot find symbol
            + sum);
              ^
  symbol:   variable sum
  location: class MisspelledVar
1 error

Example 2: Missing semicolons 

Java

class PrintingSentence {

    public static void main(String args[])

    {

        String s = "GeeksforGeeks";

        System.out.println("Welcome to " + s)

    }

}

Compilation Error in java code:

prog.java:8: error: ';' expected
        System.out.println("Welcome to " + s)
                                             ^
1 error

Example: Missing parenthesis, square brackets, or curly braces 

Java

class MissingParenthesis {

    public static void main(String args[])

    {

        System.out.println("Printing 1 to 5 n");

        int i;

        for (i = 1; i <= 5; i++ {

            System.out.println(i + "n");

        }

    }

}

Compilation Error in java code:

prog.java:10: error: ')' expected
        for (i = 1; i <= 5; i++ {
                               ^
1 error

Example: Incorrect format of selection statements or loops 

Java

class IncorrectLoop {

    public static void main(String args[])

    {

        System.out.println("Multiplication Table of 7");

        int a = 7, ans;

        int i;

        for (i = 1, i <= 10; i++) {

            ans = a * i;

            System.out.println(ans + "n");

        }

    }

}

Compilation Error in java code:

prog.java:12: error: not a statement
        for (i = 1, i <= 10; i++) {
                      ^
prog.java:12: error: ';' expected
        for (i = 1, i <= 10; i++) {
                                ^
2 errors

Logical Error: A logic error is when your program compiles and executes, but does the wrong thing or returns an incorrect result or no output when it should be returning an output. These errors are detected neither by the compiler nor by JVM. The Java system has no idea what your program is supposed to do, so it provides no additional information to help you find the error. Logical errors are also called Semantic Errors. These errors are caused due to an incorrect idea or concept used by a programmer while coding. Syntax errors are grammatical errors whereas, logical errors are errors arising out of an incorrect meaning. For example, if a programmer accidentally adds two variables when he or she meant to divide them, the program will give no error and will execute successfully but with an incorrect result. 

Example: Accidentally using an incorrect operator on the variables to perform an operation (Using ‘/’ operator to get the modulus instead using ‘%’) 

Java

public class LErrorDemo {

    public static void main(String[] args)

    {

        int num = 789;

        int reversednum = 0;

        int remainder;

        while (num != 0) {

            remainder = num / 10;

            reversednum

                = reversednum * 10

                  + remainder;

            num /= 10;

        }

        System.out.println("Reversed number is "

                           + reversednum);

    }

}

Output:

Reversed number is 7870

Example: Displaying the wrong message 

Java

class IncorrectMessage {

    public static void main(String args[])

    {

        int a = 2, b = 8, c = 6;

        System.out.println(

            "Finding the largest number n");

        if (a > b && a > c)

            System.out.println(

                a + " is the largest Number");

        else if (b > a && b > c)

            System.out.println(

                b + " is the smallest Number");

        else

            System.out.println(

                c + " is the largest Number");

    }

}

Output:

Finding the largest number 

8 is the smallest Number

Syntax Error:

Syntax and Logical errors are faced by Programmers.

Spelling or grammatical mistakes are syntax errors, for example, using an uninitialized variable, using an undefined variable, etc., missing a semicolon, etc.

int x, y;
x = 10 // missing semicolon (;)
z = x + y; // z is undefined, y in uninitialized.

Syntax errors can be removed with the help of the compiler.

Error is an illegal operation performed by the user which results in the abnormal working of the program. Programming errors often remain undetected until the program is compiled or executed. Some of the errors inhibit the program from getting compiled or executed. Thus errors should be removed before compiling and executing. 

The most common errors can be broadly classified as follows:

1. Run Time Error: 

Run Time errors occur or we can say, are detected during the execution of the program. Sometimes these are discovered when the user enters an invalid data or data which is not relevant. Runtime errors occur when a program does not contain any syntax errors but asks the computer to do something that the computer is unable to reliably do. During compilation, the compiler has no technique to detect these kinds of errors. It is the JVM (Java Virtual Machine) that detects it while the program is running. To handle the error during the run time we can put our error code inside the try block and catch the error inside the catch block. 

For example: if the user inputs a data of string format when the computer is expecting an integer, there will be a runtime error. Example 1: Runtime Error caused by dividing by zero 

Java

class DivByZero {

    public static void main(String args[])

    {

        int var1 = 15;

        int var2 = 5;

        int var3 = 0;

        int ans1 = var1 / var2;

        int ans2 = var1 / var3;

        System.out.println(

            "Division of va1"

            + " by var2 is: "

            + ans1);

        System.out.println(

            "Division of va1"

            + " by var3 is: "

            + ans2);

    }

}

Runtime Error in java code:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at DivByZero.main(File.java:14)

Example 2: Runtime Error caused by Assigning/Retrieving Value from an array using an index which is greater than the size of the array 

Java

class RTErrorDemo {

    public static void main(String args[])

    {

        int arr[] = new int[5];

        arr[9] = 250;

        System.out.println("Value assigned! ");

    }

}

RunTime Error in java code:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
    at RTErrorDemo.main(File.java:10)

2. Compile Time Error: 

Compile Time Errors are those errors which prevent the code from running because of an incorrect syntax such as a missing semicolon at the end of a statement or a missing bracket, class not found, etc. These errors are detected by the java compiler and an error message is displayed on the screen while compiling. Compile Time Errors are sometimes also referred to as Syntax errors. These kind of errors are easy to spot and rectify because the java compiler finds them for you. The compiler will tell you which piece of code in the program got in trouble and its best guess as to what you did wrong. Usually, the compiler indicates the exact line where the error is, or sometimes the line just before it, however, if the problem is with incorrectly nested braces, the actual error may be at the beginning of the block. In effect, syntax errors represent grammatical errors in the use of the programming language. 

Example 1: Misspelled variable name or method names 

Java

class MisspelledVar {

    public static void main(String args[])

    {

        int a = 40, b = 60;

        int Sum = a + b;

        System.out.println(

            "Sum of variables is "

            + sum);

    }

}

Compilation Error in java code:

prog.java:14: error: cannot find symbol
            + sum);
              ^
  symbol:   variable sum
  location: class MisspelledVar
1 error

Example 2: Missing semicolons 

Java

class PrintingSentence {

    public static void main(String args[])

    {

        String s = "GeeksforGeeks";

        System.out.println("Welcome to " + s)

    }

}

Compilation Error in java code:

prog.java:8: error: ';' expected
        System.out.println("Welcome to " + s)
                                             ^
1 error

Example: Missing parenthesis, square brackets, or curly braces 

Java

class MissingParenthesis {

    public static void main(String args[])

    {

        System.out.println("Printing 1 to 5 n");

        int i;

        for (i = 1; i <= 5; i++ {

            System.out.println(i + "n");

        }

    }

}

Compilation Error in java code:

prog.java:10: error: ')' expected
        for (i = 1; i <= 5; i++ {
                               ^
1 error

Example: Incorrect format of selection statements or loops 

Java

class IncorrectLoop {

    public static void main(String args[])

    {

        System.out.println("Multiplication Table of 7");

        int a = 7, ans;

        int i;

        for (i = 1, i <= 10; i++) {

            ans = a * i;

            System.out.println(ans + "n");

        }

    }

}

Compilation Error in java code:

prog.java:12: error: not a statement
        for (i = 1, i <= 10; i++) {
                      ^
prog.java:12: error: ';' expected
        for (i = 1, i <= 10; i++) {
                                ^
2 errors

Logical Error: A logic error is when your program compiles and executes, but does the wrong thing or returns an incorrect result or no output when it should be returning an output. These errors are detected neither by the compiler nor by JVM. The Java system has no idea what your program is supposed to do, so it provides no additional information to help you find the error. Logical errors are also called Semantic Errors. These errors are caused due to an incorrect idea or concept used by a programmer while coding. Syntax errors are grammatical errors whereas, logical errors are errors arising out of an incorrect meaning. For example, if a programmer accidentally adds two variables when he or she meant to divide them, the program will give no error and will execute successfully but with an incorrect result. 

Example: Accidentally using an incorrect operator on the variables to perform an operation (Using ‘/’ operator to get the modulus instead using ‘%’) 

Java

public class LErrorDemo {

    public static void main(String[] args)

    {

        int num = 789;

        int reversednum = 0;

        int remainder;

        while (num != 0) {

            remainder = num / 10;

            reversednum

                = reversednum * 10

                  + remainder;

            num /= 10;

        }

        System.out.println("Reversed number is "

                           + reversednum);

    }

}

Output:

Reversed number is 7870

Example: Displaying the wrong message 

Java

class IncorrectMessage {

    public static void main(String args[])

    {

        int a = 2, b = 8, c = 6;

        System.out.println(

            "Finding the largest number n");

        if (a > b && a > c)

            System.out.println(

                a + " is the largest Number");

        else if (b > a && b > c)

            System.out.println(

                b + " is the smallest Number");

        else

            System.out.println(

                c + " is the largest Number");

    }

}

Output:

Finding the largest number 

8 is the smallest Number

Syntax Error:

Syntax and Logical errors are faced by Programmers.

Spelling or grammatical mistakes are syntax errors, for example, using an uninitialized variable, using an undefined variable, etc., missing a semicolon, etc.

int x, y;
x = 10 // missing semicolon (;)
z = x + y; // z is undefined, y in uninitialized.

Syntax errors can be removed with the help of the compiler.

Чтобы разобраться, в чем разница между ошибками времени компиляции и ошибками времени выполнения в Java, разберемся в сути каждого вида.

Ошибки времени компиляции

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

Пример

public class Test{
   public static void main(String args[]){
      System.out.println("Hello")
   }
}

Итог

C:Sample>Javac Test.java
Test.java:3: error: ';' expected
   System.out.println("Hello")

Ошибки времени выполнения

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

Пример

import java.io.File;
import java.io.FileReader;

public class FilenotFound_Demo {
   public static void main(String args[]) {
      File file = new File("E://file.txt");
      FileReader fr = new FileReader(file);
   }
}

Итог

C:>javac FilenotFound_Demo.java
FilenotFound_Demo.java:8: error: unreported exception
FileNotFoundException; must be caught or declared to be thrown
   FileReader fr = new FileReader(file);
                   ^
1 error

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

В предыдущей части мы рассмотрели исходный код и его составляющие.

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

Отладка программы

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

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

отладка программы

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

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

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

Семантические ошибки

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

Рассмотрим данный пример:

3 + 5 * 6

По порядку приоритета, называемому старшинством операции, с учетом математических правил мы ожидаем, что сначала будет оценена часть умножения, и окончательный результат будет равен 33. Если программист хотел, чтобы сначала происходило добавление двух чисел, следовало поступить иначе. Для этого используются круглые скобки, которые отвечают за смещение приоритетов в математической формуле. Исправленный пример должен выглядеть так:

(3 + 5) * 6

3 + 5, заключенные в скобки, дадут желаемый результат, а именно 48.

Ошибки в процессе выполнения

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

Вот хороший пример:

input = 25
x = 0.8/(Math.sqrt(input) - 5)

Фрагмент кода выше будет скомпилирован успешно, но input 25 приведет к ZeroDivisionError. Это ошибка во время выполнения. Другим популярным примером является StackOverflowError или IndexOutofBoundError. Важно то, что вы идентифицируете эти ошибки и узнаете, как с ними бороться.

Существуют ошибки, связанные с тем, как ваш исходный код использует память и пространство на платформе или в среде, в которой он запущен. Они также являются ошибками во время выполнения. Такие ошибки, как OutOfMemoryErrorand и HeapError обычно вызваны тем, что ваш исходный код использует слишком много ресурсов. Хорошее знание алгоритмов поможет написать код, который лучше использует ресурсы. В этом и заключается отладка программы.

Процесс перезаписи кода для повышения производительности называется оптимизацией. Менее популярное наименование процесса – рефакторинг. Поскольку вы тратите больше времени на кодинг, то должны иметь это в виду.

Отладка программы

Вот несколько советов о том, как правильно выполнять отладку:

  1. Использовать Linters. Linters – это инструменты, которые помогают считывать исходный код, чтобы проверить, соответствует ли он ожидаемому стандарту на выбранном языке программирования. Существуют линты для многих языков.
  2. Превалирование IDE над простыми редакторами. Вы можете выбрать IDE, разработанную для языка, который изучаете. IDE – это интегрированные среды разработки. Они созданы для написания, отладки, компиляции и запуска кода. Jetbrains создают отличные IDE, такие как Webstorm и IntelliJ. Также есть NetBeans, Komodo, Qt, Android Studio, XCode (поставляется с Mac), etc.
  3. Чтение кода вслух. Это полезно, когда вы ищете семантическую ошибку. Читая свой код вслух, есть большая вероятность, что вы зачитаете и ошибку.
  4. Чтение логов. Когда компилятор отмечает Error, обязательно посмотрите, где он находится.

Двигаемся дальше

Поздравляем! Слово «ошибка» уже привычно для вас, равно как и «отладка программы». В качестве новичка вы можете изучать кодинг по книгам, онлайн-урокам или видео. И даже чужой код вам теперь не страшен 🙂

В процессе кодинга измените что-нибудь, чтобы понять, как он работает. Но будьте уверены в том, что сами написали.

Викторина

  1. Какая ошибка допущена в фрагменте кода Python ниже?
items = [0,1,2,3,4,5]
print items[8]
//комментарий: элементы здесь представляют собой массив с шестью элементами. Например, чтобы получить 4-й элемент, вы будете использовать [3]. Мы начинаем отсчет с 0.
  1. Какая ошибка допущена в фрагменте кода Python ниже?
input = Hippo'
if input == 'Hippo':
  print 'Hello, Hippo'

Ответы на вопросы

  1. Ошибка выполнения: ошибка индекса вне диапазона.

2. Синтаксическая ошибка: Отсутствует стартовая кавычка в первой строке.

Классификация ошибок

Ошибки, которые могут быть в программе,
принято делить на три группы:

  • синтаксические;

  • ошибки времени выполнения;

  • алгоритмические.

Синтаксические ошибки, их также называют
ошибками времени компиляции (Compile-time
error), наиболее легко устранимы. Их
обнаруживает компилятор, а программисту
остается только внести изменения в
текст программы и выполнить повторную
компиляцию.

Ошибки времени выполнения, в Delphi они
называются исключениями (exception), тоже,
как правило, легко устранимы. Они обычно
проявляются уже при первых запусках
программы и во время тестирования.

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

После возникновения ошибки
программист может либо прервать
выполнение программы, для этого надо
из менюRun выбрать
команду Program
Reset, 
либо продолжить
ее выполнение, например, по шагам (для
этого из менюRun надо
выбрать команду Step), наблюдая
результат выполнения каждой инструкции.

Рис. 13.1. Сообщение
об ошибке при запуске программы из
Delphi

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

Рис. 13.2. Сообщение
об ошибке при запуске программы из
Windows

С алгоритмическими ошибками дело обстоит
иначе. Компиляция программы, в которой
есть алгоритмическая ошибка, завершается
успешно. При пробных запусках программа
ведет себя нормально, однако при анализе
результата выясняется, что он неверный.
Для того чтобы устранить алгоритмическую
ошибку,» приходится анализировать
алгоритм, вручную «прокручивать»
его выполнение.

Предотвращение и обработка ошибок

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

Нарушение в работе программы называется
исключением. Обработку исключений
(ошибок) берет на себя автоматически
добавляемый в выполняемую программу
код, который обеспечивает, в том числе,
вывод информационного сообщения. Вместе
с тем Delphi дает возможность программе
самой выполнить обработку исключения.

Инструкция обработки исключения в общем
виде выглядит так:

try

// здесь инструкции, выполнение которых
может вызвать исключение

except //
начало секции обработки исключений

on ТипИсключения1 do Обработка1;

on ТипИсключения2 do Обработка2;

on ТипИсключенияJ do ОбработкаJ;

else

// здесь инструкции обработки остальных
исключений

end;

где:

  • try — ключевое слово, обозначающее, что
    далее следуют инструкции, при выполнении
    которых возможно возникновение
    исключений, и что обработку этих
    исключений берет на себя программа;

  • except — ключевое слово, обозначающее
    начало секции обработки исключений.
    Инструкции этой секции будут выполнены,
    если в программе возникнет ошибка;

  • on — ключевое слово, за которым следует
    тип исключения, обработку которого
    выполняет инструкция, следующая за do;

  • else — ключевое слово, за которым следуют
    инструкции, обеспечивающие обработку
    исключений, тип которых не указаны в
    секции except.

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

Таблица 13.1. Типичные
исключения

Тип исключения

Возникает

EZeroDivide

При выполнении операции деления, если
делитель равен нулю

EConvertError

При выполнении преобразования, если
преобразуемая величина не может быть
приведена к требуемому виду. Наиболее
часто возникает при преобразовании
строки символов в число

Тип исключения

Возникает

EFilerError

При обращении к файлу. Наиболее частой
причиной является отсутствие требуемого
файла или, в случае использования
сменного диска, отсутствие диска в
накопителе

Ошибки выполнения:

Определения данных;

Передачи;

Преобразования;

Перезаписи;

Неправильные данные.

Логические;

Неприемлемый подход;

Неверный алгоритм;

Неверная структура данных;

Другие;

Кодирования;

Проектирования;

Некорректная работа с переменными;

Некорректные вычисления;

Ошибки интерфейсов;

Неправильная реализация алгоритма;

Другие.

Накопления погрешностей;

Игнорирование ограничений разрядной
сетки;

Игнорирование способов уменьшения
погрешностей.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

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

  • Отсутствует скобка ( } )
  • Печать значения переменной без его объявления
  • Отсутствует точка с запятой (терминатор)

Ниже приведен пример, демонстрирующий ошибку времени компиляции:

#include<stdio.h>

void main()

{

int x = 10;

int y = 15;

printf ( "%d" , (x, y))

}

Ошибка:

 ошибка: ожидается ';' перед токеном '}'

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

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

Ошибка:

 предупреждение: деление на ноль [-Wdiv-by-zero]
     div = n / 0;

В данном примере есть ошибка деления на ноль. Это пример ошибки времени выполнения, т. Е. Ошибок, возникающих во время работы программы.

Различия между ошибкой времени компиляции и ошибкой времени выполнения:

Ошибки времени компиляции Ошибки во время выполнения
Это синтаксические ошибки, которые обнаруживает компилятор. Это ошибки, которые не обнаруживаются компилятором и дают неверные результаты.
Они предотвращают запуск кода, поскольку он обнаруживает некоторые синтаксические ошибки. Они препятствуют полному выполнению кода.
Он включает синтаксические ошибки, такие как отсутствие точки с запятой (;), неправильное написание ключевых слов и идентификаторов и т. Д. Сюда входят такие ошибки, как деление числа на ноль, поиск квадратного корня из отрицательного числа и т. Д.

Аннотация: Лекция носит факультативный характер. Здесь мы рассматриваем виды допускаемых в программировании ошибок, способы тестирования и отладки программ, инструменты встроенного отладчика.

Цель лекции

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

Тестирование и отладка программы

Чем больше опыта имеет программист, тем меньше ошибок в коде он совершает. Но, хотите верьте, хотите нет, даже самый опытный программист всё же допускает ошибки. И любая современная среда разработки программ должна иметь собственные инструменты для отладки приложений, а также для своевременного обнаружения и исправления возможных ошибок. Программные ошибки на программистском сленге называют багами (англ. bug — жук), а программы отладки кода — дебаггерами (англ. debugger — отладчик). Lazarus, как современная среда разработки приложений, имеет собственный встроенный отладчик, работу с которым мы разберем на этой лекции.

Ошибки, которые может допустить программист, условно делятся на три группы:

  1. Синтаксические
  2. Времени выполнения (run-time errors)
  3. Алгоритмические

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

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

Найденная компилятором синтаксическая ошибка - нет объявления переменной i

Рис.
27.1.
Найденная компилятором синтаксическая ошибка — нет объявления переменной i

Подобные ошибки могут возникнуть при неправильном написании директивы или имени функции (процедуры); при попытке обратиться к переменной или константе, которую не объявляли (
рис.
27.1); при попытке вызвать функцию (процедуру, переменную, константу) из модуля, который не был подключен в разделе uses; при других аналогичных недосмотрах программиста.

Как уже говорилось, компилятор при нахождении подобной ошибки приостанавливает процесс компиляции, выводит сообщение о найденной ошибке и устанавливает курсор на допущенную ошибку, или после неё. Программисту остается только внести исправления в код программы и выполнить повторную компиляцию.

Ошибки времени выполнения

Ошибки времени выполнения (run-time errors) тоже, как правило, легко устранимы. Они обычно проявляются уже при первых запусках программы, или во время тестирования. Если такую программу запустить из среды Lazarus, то она скомпилируется, но при попытке загрузки, или в момент совершения ошибки, приостановит свою работу, выведя на экран соответствующее сообщение. Например, такое:

Сообщение Lazarus об ошибке времени выполнения

Рис.
27.2.
Сообщение Lazarus об ошибке времени выполнения

В данном случае программа при загрузке должна была считать в память отсутствующий текстовый файл MyFile.txt. Поскольку программа вызвала ошибку, она не запустилась, но в среде Lazarus процесс отладки продолжается, о чем свидетельствует сообщение в скобках в заголовке главного меню, после названия проекта. Программисту в подобных случаях нужно сбросить отладчик командой меню «Запуск -> Сбросить отладчик«, после чего можно продолжить работу над проектом.

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

Если программу запустить из самой Windows, при возникновении этой ошибки появится такое же сообщение. При этом если нажать «OK«, программа даже может запуститься, но корректно работать все равно не будет.

Ошибки времени выполнения бывают не только явными, но и неявными, при которых программа продолжает свою работу, не выводя никаких сообщений, а программист даже не догадывается о наличии ошибки. Примером неявной ошибки может служить так называемая утечка памяти. Утечка памяти возникает в случаях, когда программист забывает освободить выделенную под объект память. Например, мы объявляем переменную типа TStringList, и работаем с ней:

begin
  MySL:= TStringList.Create;
  MySL.Add('Новая строка');
end;
    

В данном примере программист допустил типичную для начинающих ошибку — не освободил класс TStringList. Это не приведет к сбою или аварийному завершению программы, но в итоге можно бесполезно израсходовать очень много памяти. Конечно, эта память будет освобождена после выгрузки программы (за этим следит операционная система), но утечка памяти во время выполнения программы тоже может привести к неприятным последствиям, потребляя все больше и больше ресурсов и излишне нагружая процессор. В подобных случаях после работы с объектом программисту нужно не забывать освобождать память:

begin
  MySL:= TStringList.Create;
  MySL.Add('Новая строка');
  ...; //работа с объектом
  MySL.Free; //освободили объект
end;
    

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

begin
  try
    MySL:= TStringList.Create;
    MySL.Add('Новая строка');
    ...; //работа с объектом
  finally
    MySL.Free; //освободили объект, даже если была ошибка
  end;
end;
    

Итак, во избежание ошибок времени выполнения программист должен не забывать делать проверку на правильность ввода пользователем допустимых значений, заключать опасный код в блоки try…finally…end или try…except…end, делать проверку на существование открываемого файла функцией FileExists и вообще соблюдать предусмотрительность во всех слабых местах программы. Не полагайтесь на пользователя, ведь недаром говорят, что если в программе можно допустить ошибку, пользователь эту возможность непременно найдет.

Алгоритмические ошибки

Если вы не допустили ни синтаксических ошибок, ни ошибок времени выполнения, программа скомпилировалась, запустилась и работает нормально, то это еще не означает, что в программе нет ошибок. Убедиться в этом можно только в процессе её тестирования.

Тестирование — процесс проверки работоспособности программы путем ввода в неё различных, даже намеренно ошибочных данных, и последующей контрольной проверке выводимого результата.

Если программа работает правильно с одними наборами исходных данных, и неправильно с другими, то это свидетельствует о наличии алгоритмической ошибки. Алгоритмические ошибки иногда называют логическими, обычно они связаны с неверной реализацией алгоритма программы: вместо «+» ошибочно поставили «-«, вместо «/» — «*», вместо деления значения на 0,01 разделили на 0,001 и т.п. Такие ошибки обычно не обнаруживаются во время компиляции, программа нормально запускается, работает, а при анализе выводимого результата выясняется, что он неверный. При этом компилятор не укажет программисту на ошибку — чтобы найти и устранить её, приходится анализировать код, пошагово «прокручивать» его выполнение, следя за результатом. Такой процесс называется отладкой.

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

Добавлено 27 марта 2021 в 21:31

Введение в главу

Добро пожаловать в первую основную главу данной серии обучающих руководств о C++!

В этой главе мы сначала рассмотрим ряд тем, которые важны для каждой программы на C++. Поскольку тем, которые нужно охватить, довольно много, мы рассмотрим большую часть на довольно поверхностном (достаточном для понимания) уровне. Цель этой главы – помочь вам понять, как строятся простейшие программы на C++. К концу главы вы сможете писать свои собственные простые программы.

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

Для того чтобы продолжительность урока была управляемой, темы могут быть разделены на несколько последующих уроков. Если вам кажется, что какой-то важный концепт не рассмотрен в уроке, то, возможно, он будет рассмотрен в следующем.

Инструкции

Компьютерная программа – это последовательность инструкций, которые говорят компьютеру, что делать. Инструкция (оператор, statement) заставляет программу выполнять какое-либо действие.

Инструкции – это, безусловно, самый распространенный тип блоков в программе на C++. Это потому, что они являются наименьшей независимой единицей вычисления в языке C++. В этом отношении они действуют так же, как предложения на естественном языке. Когда мы хотим передать идею другому человеку, мы обычно пишем или говорим предложениями (а не случайными словами или слогами). В C++, когда мы хотим, чтобы наша программа что-то делала, мы обычно пишем инструкции.

Большинство (но не все) инструкций в C++ заканчиваются точкой с запятой. Если вы видите строку, оканчивающуюся точкой с запятой, вероятно, это инструкция.

В языке высокого уровня, таком как C++, одна инструкция может скомпилироваться в большое количество инструкций машинного кода.

Для продвинутых читателей


В C++ есть много разных типов инструкций:

  1. инструкции объявления;
  2. инструкции переходов;
  3. инструкции выражений;
  4. составные инструкции;
  5. инструкции выбора (условия);
  6. инструкции итерации (циклы);
  7. блоки попыток (try).

К тому времени, когда вы прочтете эту серию статей, вы поймете, что всё это такое!

Функции и функция main

В C++ инструкции обычно группируются в блоки, называемые функциями. Функция – это набор инструкций, которые выполняются последовательно (по порядку сверху вниз). По мере того, как вы научитесь писать свои собственные программы, вы сможете создавать свои собственные функции, а также смешивать и сопоставлять инструкции любым удобным для вас способом (мы покажем, как это сделать в следующих уроках).

Правило


Каждая программа на C++ должна иметь специальную функцию с именем main (все буквы в нижнем регистре). Когда программа запускается, операторы внутри main выполняются в последовательном порядке.

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

Функции обычно пишутся для выполнения определенной работы. Например, функция с именем «max» может содержать инструкции, определяющие, какое из двух чисел больше. Функция с именем «calculateGrade» может вычислять оценку учащегося на основе набора результатов тестов. Вскоре мы поговорим о функциях намного больше, поскольку они являются наиболее часто используемым инструментом организации в программе.

Примечание автора


При обсуждении функций довольно распространенным сокращением является добавление пары круглых скобок в конец имени функции. Например, если вы видите термин main() или doSomething(), это сокращение для функций с именами main или doSomething соответственно. Это помогает отличать функции от других типов объектов (например, переменных) без необходимости каждый раз писать слово «функция».

Препарирование программы HelloWorld!

Теперь, когда у вас есть краткое представление о том, что такое инструкции и функции, давайте вернемся к нашей программе «Hello world» и более подробно рассмотрим, что делает каждая строка.

#include <iostream>
 
int main()
{
   std::cout << "Hello world!";
   return 0;
}

Строка 1 – это особый тип строки, называемый директивой препроцессора. Эта директива препроцессора указывает, что мы хотели бы использовать содержимое библиотеки iostream, которая является частью стандартной библиотеки C++, которая позволяет нам читать и записывать текст из и в консоль. Эта строка нужна нам для использования std::cout в строке 5. Удаление этой строки привело бы к ошибке компиляции в строке 5, поскольку иначе компилятор не узнал бы, что такое std::cout.

Строка 2 пустая и игнорируется компилятором. Эта строка существует только для того, чтобы сделать программу более удобочитаемой для людей (путем разделения директивы препроцессора #include и последующих частей программы).

Строка 3 сообщает компилятору, что мы собираемся написать (определить) функцию с именем main. Как вы узнали ранее, каждая программа на C++ должна иметь функцию main, иначе она не сможет компилироваться.

Строки 4 и 7 сообщают компилятору, какие строки являются частью функции main. Всё, что находится между открывающей фигурной скобкой в строке 4 и закрывающей фигурной скобкой в строке 7, считается частью функции main. Это называется телом функции.

Строка 5 – это первая инструкция в функции main и первая инструкция, которая будет выполняться при запуске нашей программы. std::cout (что означает «вывод символов») и оператор << позволяют нам отправлять буквы или числа на консоль для вывода. В этом случае мы отправляем текст «Hello world!», который будет выведен на консоль. Эта инструкция создает видимый вывод программы.

Строка 6 – это инструкция (оператор) возврата. Когда выполняемая программа завершает работу, она отправляет значение обратно в операционную систему, чтобы указать, успешно она выполнилась или нет. Этот конкретный оператор return возвращает операционной системе значение 0, что означает «всё прошло хорошо!». Это последняя выполняемая инструкция в программе.

Все программы, которые мы напишем, будут следовать этому общему шаблону или его разновидностям.

Примечание автора


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

Вы можете скомпилировать и запустить эту программу самостоятельно, и вы увидите, что она выводит на консоль следующее:

Hello world!

Если у вас возникнут проблемы при компиляции или запуске этой программы, ознакомьтесь с уроком «0.8 – Несколько основных проблем C++».

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

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

В C++ тоже есть синтаксис: правила о том, как ваши программы должны быть построены, чтобы считаться корректными. Когда вы компилируете свою программу, компилятор отвечает за то, чтобы ваша программа следовала базовому синтаксису языка C++. Если вы нарушите это правило, компилятор пожалуется, когда вы попытаетесь скомпилировать свою программу, и выдаст вам синтаксическую ошибку.

Давайте посмотрим, что произойдет, если мы опустим точку с запятой в строке 5 программы «Hello world», например:

#include <iostream>
 
int main()
{
   std::cout << "Hello world!"
   return 0;
}

Не стесняйтесь компилировать самостоятельно эту плохо сформированную программу.

Visual Studio выдает следующую ошибку (ваш компилятор может генерировать сообщение об ошибке с другой формулировкой):

c:vcprojectstest1.cpp(6): error C2143: syntax error : missing ';' before 'return'

Это означает, что у вас есть синтаксическая ошибка в строке 6: компилятор ожидал точку с запятой перед оператором return, но не нашел ее. Хотя компилятор сообщит вам, какую строку кода он компилировал, когда обнаружил синтаксическую ошибку, на самом деле пропуск может быть в предыдущей строке. В этом случае ошибка фактически находится в конце строки 5 (компилятор не обнаружил проблему до строки 6).

При написании программы синтаксические ошибки встречаются часто. К счастью, их обычно легко найти и исправить, поскольку компилятор обычно указывает вам прямо на них. Компиляция программы завершится только после устранения всех синтаксических ошибок.

Вы можете попробовать удалить символы или даже целые строки из программы «Hello world», чтобы увидеть различные типы возникающих ошибок. Попробуйте восстановить отсутствующую точку с запятой в конце строки 5, а затем удалите строки 1, 3 или 4 и посмотрите, что произойдет.

Время для теста

Следующий тест призван укрепить ваше понимание представленного выше материала.


Вопрос 1

Что такое инструкция (statement)?

Ответ

Инструкция в компьютерной программе – это аналог предложения в естественном языке. Она сообщает компьютеру выполнить какое-либо действие.


Вопрос 2

Что такое функция?

Ответ

Функция – это набор инструкций, которые выполняются последовательно.


Вопрос 3

Как называется функция, которая должна быть во всех программах?

Ответ

main().


Вопрос 4

Где начинается выполнение, когда запускается программа?

Ответ

Выполнение начинается с первой инструкции внутри функции main.


Вопрос 5

Каким символом часто заканчиваются инструкции в C++?

Ответ

Точка с запятой (;).


Вопрос 6

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

Ответ

Синтаксическая ошибка – это ошибка, выдаваемая компилятором во время компиляции, когда ваша программа нарушает грамматические правила языка C++.


Вопрос 7

Что такое стандартная библиотека C++?

Подсказка

Ответ

Файл библиотеки – это набор предварительно скомпилированного кода, который был «упакован» для повторного использования в других программах. Стандартная библиотека C++ – это библиотека, поставляемая с C++. Она содержит дополнительные функции для использования в ваших программах.

Теги

C++ / CppLearnCppДля начинающихОбучениеПрограммирование

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Синтаксическая ошибка параметр не инициализирован
  • Синтаксические ошибки это определение