【问题标题】:What is the difference between run-time error and compiler error? [duplicate]运行时错误和编译器错误有什么区别? [复制]
【发布时间】:2012-03-17 07:52:57
【问题描述】:

在我的一张关于多态的教授幻灯片中,我看到这段代码带有几个 cmets:

discountVariable =              //will produce
  (DiscountSale)saleVariable;//run-time error
discountVariable = saleVariable //will produce
                                //compiler error

如您所见,它在第一个转换语句中说它会产生 run-time 错误,而在另一个转换语句中它说它会产生 编译器错误.

是什么导致了这些错误?以及它们之间有何不同?

【问题讨论】:

  • 来吧伙计们。这家伙正在努力学习,没有必要投反对票。
  • 不管它是否解决了我的例子,真正重要的是我清楚地得到了答案。那家伙用简单的方式解释了它,对于像我这样的天真的程序员来说很容易理解。
  • 你读过stackoverflow.com/faq吗?

标签: java compiler-errors


【解决方案1】:

如果你使用 Google,你会得到这个:

编译时错误是指阻止 Java 程序编译的任何类型的错误,例如语法错误、未找到类、已定义类的错误文件名、混合不同的 java 数据类型和以此类推。

运行时错误是指程序运行时发生的错误。为了处理这种错误,java定义了异常。异常是对象,表示程序流程中的异常情况。可以勾选也可以不勾选。

http://wiki.answers.com/Q/Difference_between_run_time_error_and_compile_time_error_in_java

【讨论】:

  • -1 他没有使用谷歌——他在这里问。至少将您粘贴的文本与他的示例联系起来。
  • 现在用谷歌链接到这个...哈哈
【解决方案2】:

程序运行期间发生运行时错误。当您尝试编译代码时会发生编译器错误。

如果您无法编译您的代码,那就是编译器错误。

如果你编译并运行你的代码,但是在执行过程中它失败了,那就是运行时。

【讨论】:

  • 在您的示例中,discountVariable 是声明类型 DiscountSalesaleVariable 是另一种类型。当您尝试使用行discountVariable = saleVariable 将一个值分配给另一个时,这会导致编译器错误。如果你把演员表放在(DiscountSale),这告诉编译器没关系。然后当你运行它时它会中断,因为saleVariable 实际上不是DiscountSale 类型。
  • +1 因为这是对这个问题的最简单的最佳答案:运行时错误和编译器错误有什么区别?但是,如果答案实际上解决了 OP 提供的具体示例,我会更高兴。
【解决方案3】:

这是因为编译器不知道“saleVariable”的对象类型,直到程序运行时实际设置了该值。

您将 salesVariable 中的任何内容强制转换为 DiscountSale 类型,这被认为是不安全的,直到运行时才能评估。

【讨论】:

  • 不是 +1,因为“编译器不知道 saleVariable 的对象类型”。这不是真的。编译器知道类型 - 它只是与 DiscountSale 不兼容。
  • 你说得对,我只是在考虑他是否在做类似 e.DataItem 的事情
【解决方案4】:

编译时错误意味着编译器知道discountVariable = saleVariable必须以分号结尾,如下图discountVariable = saleVariable;所以编译代码时会抛出错误。

运行时错误意味着该错误将在运行时发生,因为即使您将 saleVariable 转换为 discountVariable,也无法进行转换,因为它们的类型不同。

【讨论】:

    【解决方案5】:

    编译时错误指的是语法和语义。例如,如果您执行涉及不同类型的操作。例如:用 int 添加字符串,或将字符串除以实数。 (请阅读最后一段!!!)

    运行时错误是在程序执行时检测到的错误。例如,除以零。在执行之前,编译器无法知道 x/a-b 操作是否会导致除以零。

    这是一个非常广泛的解释。有许多智能编译器,而且,可以在不同类型之间进行内部转换,从而产生有意义的操作。即使代码未执行,也可以预编译代码并查看一些运行时错误

    也请参考此链接:Runtime vs Compile time

    【讨论】:

      【解决方案6】:

      只有在代码实际运行时才会发生运行时错误。 这些是最困难的 - 并导致程序崩溃和代码中的错误,很难追踪。

      一个示例可能是尝试将字符串:“hello”转换为整数:

      string helloWorld = "hello";
      int willThrowRuntimeError = Convert.ToInt32(helloWorld);
      

      编译器可能不会将此视为问题,但运行时会抛出错误。

      编译器错误是由于代码不准确造成的,编译器会抛出错误以提醒您某些内容无法编译,因此无法运行。

      编译器错误的一个例子是:

      int = "this is not an int";
      

      希望对您有所帮助。

      【讨论】:

      • 只有在代码实际运行时才会出现运行时错误。这些是最困难的 - 并导致程序崩溃和代码中的错误,这些错误很难追踪。 相对于编译时错误而言,这是正确的,但runtime errors 比程序更容易调试静默产生无效结果,这通常是最难识别和解决的错误类别。
      【解决方案7】:

      认为您已经大致了解了不同之处。特别是在您在 OP 中显示的代码中,

      • 在第二条语句中,编译器比较 LHS 和 RHS 上的类型,发现不可能进行隐式转换,因此会给出错误。
      • 编译器认为第一条语句是一样的,但是这里程序员显式地转换类型,这就像告诉编译器我知道我在做什么一样好,当然编译器信任你并且不会给你任何错误。

      【讨论】:

      • 派对迟到了 +1,但这很有帮助
      【解决方案8】:

      编译器错误是由于代码不准确造成的,编译器会抛出错误以提醒您某些内容无法编译,因此无法运行。

      Ex :- MethodOverloading

      class OverloadingTest {
          void sum(int a, long b) {
              System.out.println("a method invoked");
          }
      
          void sum(long a, int b) {
              System.out.println("b method invoked");
          }
      
          public static void main(String args[]) {
              OverloadingTest obj = new OverloadingTest();
              obj.sum(200, 200);// now ambiguity
          }
      }
      

      运行时错误是在程序执行时检测到的错误。例如,除以零。在执行之前,编译器无法知道 x/a-b 操作是否会导致除以零

      【讨论】:

        【解决方案9】:

        编译/编译时间/语法/语义错误: 编译或编译时间错误是由于输入错误而发生的错误,如果我们不遵循任何编程语言的正确语法和语义,则编译时间错误由编译器抛出。在您删除所有语法错误或调试编译时错误之前,它们不会让您的程序执行一行。
        示例:在 C 中缺少分号或将 int 错误输入为 Int

        运行时错误:运行时错误是程序处于运行状态时产生的错误。这些类型的错误将导致您的程序出现意外行为,甚至可能导致您的程序停止运行。它们通常被称为例外。
        示例:假设您正在读取一个不存在的文件,将导致运行时错误。

        在此处阅读有关所有programming errors 的更多信息

        【讨论】:

          【解决方案10】:

          编译时错误是语法和语义错误。

          运行时错误主要是逻辑错误。由于程序员忽略了一些事情,程序崩溃了,例如除以 0、访问变量而不先初始化等。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-20
            • 2011-08-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多