本文是软件构造系列的第一篇文章。其余文章在:
https://ruanx.net/tag/software-construction/

  首先让我们看这一幅图:

▲ 来源: Programmer Humor

  在编程语言中,有一些错误在编译时就可以发现,例如函数少了一个参数;有些错误在运行时才可以发现,例如除零错。前者称为静态检查,后者称为动态检查。

  不仅 Java 提供了这些检查,一般的语言在这方面是相通的。具体来讲,划分如下:

静态检查

  以下错误在编译时就能发现,从而阻断编译:

  语法错误。例如多余的标点符号、多余的关键词、Python 中的缩进错误。

  名字错误。例如 Math.sine(2) .

  参数个数错误。例如 Math.sin(1,2,3) .

  参数类型错误。例如 Math.sin("hello").

  返回类型错误。函数的返回与其签名不一致。

动态检查

  以下错误在编译时无法发现,必须在运行时才抛出:

  非法运算。例如整数除零、整数模零。

  无法表示的返回值。运行后实际得到的返回值,无法用签名的返回值来表示。

  非法访问。例如访问非法内存、访问不存在的文件。

  null 对象解引用。

总结

  静态错误是与值无关的错误。这些地方无论如何都会出错,因此编译器可以直接判断。而动态错误是否出现,与运行时的值有关,编译时无法判断,故交由运行时判断。