📜  运行时错误

📅  最后修改于: 2021-09-11 06:19:23             🧑  作者: Mango

运行时错误

  • 程序运行时错误是程序编译成功后在运行时发生的错误。
  • 运行时错误通常称为“错误” ,通常在软件发布之前的调试过程中发现。
  • 当程序发布给公众后出现运行时错误时,开发人员通常会发布补丁或旨在修复错误的小更新。
  • 如果他们是初学者,任何人都可以在本文中找到他们可能面临的问题列表。
  • 在在线平台上解决问题时,可能会遇到许多运行时错误,这些错误在随附的消息中没有明确说明。会发生各种运行时错误,例如逻辑错误输入/输出错误未定义对象错误除以零错误等等。

运行时错误的类型

  • SIGFPE: SIGFPE 是一个浮点错误。它实际上总是由除以 0引起的。 SIGFPE 错误主要有以下三个主要原因:
    1. 被零除。
    2. 零模运算。
    3. 整数溢出。

    下面是说明 SIGFPE 错误的程序:

    C++
    // C++ program to illustrate
    // the SIGFPE error
      
    #include 
    using namespace std;
      
    // Driver Code
    int main()
    {
      
        int a = 5;
      
        // Division by Zero
        cout << a / 0;
        return 0;
    }


    C++
    // C++ program to illustrate
    // the SIGBRT error
      
    #include 
    using namespace std;
      
    // Driver Code
    int main()
    {
        // Assigning excessive memory
        int a = 100000000000;
        int* arr = new int[a];
      
        return 0;
    }


    Python
    # Python program to illustrate
    # the NZEC Error
       
    # Driver Code
    if __name__ == "__main__":
          arr = [1, 2]
       
        # Runtime Error
        # Array Index out of Bounds
        print(arr[2])


    C++
    // C++ program to illustrate
    // the SIGSEGV error
    #include 
    using namespace std;
      
    // Function with infinite
    // Recursion
    void infiniteRecur(int a)
    {
        return infiniteRecur(a);
    }
      
    // Driver Code
    int main()
    {
      
        // Infinite Recursion
        infiniteRecur(5);
    }


    输出:

  • SIGABRT:程序本身检测到错误,然后使用调用 abort()函数生成此信号。这个信号也被标准库用来报告内部错误。 C++ 中的 assert()函数也使用 abort() 来生成此信号。

    下面是说明 SIGBRT 错误的程序:

    C++

    // C++ program to illustrate
    // the SIGBRT error
      
    #include 
    using namespace std;
      
    // Driver Code
    int main()
    {
        // Assigning excessive memory
        int a = 100000000000;
        int* arr = new int[a];
      
        return 0;
    }
    

    输出:

  • NZEC:此错误表示“非零退出代码” 。对于 C 用户,如果 main() 方法没有 return 0语句,则会生成此错误。Java/C++ 用户抛出异常,则可能会生成此错误。以下是获取 NZEC 错误的可能原因:
    1. 无限递归或堆栈内存不足。
    2. 访问负数组索引。
    3. ArrayIndexOutOfBounds 异常。
    4. StringIndexOutOfBounds 异常。

    下面是说明NZEC错误的程序:

    Python

    # Python program to illustrate
    # the NZEC Error
       
    # Driver Code
    if __name__ == "__main__":
          arr = [1, 2]
       
        # Runtime Error
        # Array Index out of Bounds
        print(arr[2])
    

    输出:

  • SIGSEGV:此错误是最常见的错误,称为“分段错误”。当程序尝试访问不允许访问的内存或尝试以不允许的方式访问内存位置时会生成它。段错误的一些常见原因列表是:
    1. 访问数组越界。
    2. 取消引用 NULL 指针。
    3. 取消引用已释放的内存。
    4. 取消引用未初始化的指针。
    5. “&” (地址)和“*” (取消引用)运算符的错误使用。
    6. printf 和 scanf 语句中的格式说明符不正确。
    7. 堆栈溢出。
    8. 写入只读存储器。

    下面是说明SIGSEGV错误的程序:

    C++

    // C++ program to illustrate
    // the SIGSEGV error
    #include 
    using namespace std;
      
    // Function with infinite
    // Recursion
    void infiniteRecur(int a)
    {
        return infiniteRecur(a);
    }
      
    // Driver Code
    int main()
    {
      
        // Infinite Recursion
        infiniteRecur(5);
    }
    

    输出:

避免运行时错误的方法

  • 避免使用尚未初始化的变量。这些可能在您的系统上设置为0 ,但在编码平台上不会。
  • 检查数组元素的每一次出现并确保它没有越界。
  • 避免声明太多内存。检查问题中指定的内存限制。
  • 避免声明过多的堆栈内存。大型数组应该在函数之外全局声明。
  • 使用 return 作为结束语句。
  • 避免引用空闲内存或空指针。