本文是软件构造系列的第一篇文章。其余文章在:
https://ruanx.net/tag/software-construction/
首先让我们看这一幅图:
在编程语言中,有一些错误在编译时就可以发现,例如函数少了一个参数;有些错误在运行时才可以发现,例如除零错。前者称为静态检查,后者称为动态检查。
不仅 Java 提供了这些检查,一般的语言在这方面是相通的。具体来讲,划分如下:
静态检查
以下错误在编译时就能发现,从而阻断编译:
语法错误。例如多余的标点符号、多余的关键词、Python 中的缩进错误。
名字错误。例如 Math.sine(2)
.
参数个数错误。例如 Math.sin(1,2,3)
.
参数类型错误。例如 Math.sin("hello")
.
返回类型错误。函数的返回与其签名不一致。
动态检查
以下错误在编译时无法发现,必须在运行时才抛出:
非法运算。例如整数除零、整数模零。
无法表示的返回值。运行后实际得到的返回值,无法用签名的返回值来表示。
非法访问。例如访问非法内存、访问不存在的文件。
对 null
对象解引用。
总结
静态错误是与值无关的错误。这些地方无论如何都会出错,因此编译器可以直接判断。而动态错误是否出现,与运行时的值有关,编译时无法判断,故交由运行时判断。