语法错误
语法错误是指源文件的某些代码不符合编程语言的语法规范,具体语法错误的程序是不能运行的——因为无法通过编译。
编译源文件时,编译器会分析源文件的语法,若有错误则会给出错误所在的行号与描述信息。
因此,语法错误的定位与修改较为简单,可见,编译器不仅提示了错误的个数,而且还给出了每个错误所在的行号。
- 编译器提示的错误个数可能不准确。
- 编译器提示的错误描述信息也不一定准确。
- 一般来说,提示的错误所在行号总是准确或相对准确的。
语法错误还包括一类不安全的、无效的、或在特定情况下可能引发逻辑错误“轻微错误”。例如,声明了从未被用到的变量、存在永远都不可能被执行的代码,使用了原始类型的容器。
严格来说,警告并不属于语法错误的范畴,有警告的源文件依然能够被成功编译并运行,并且通常不会影响程序的运行逻辑。
运行时错误
运行时错误是指程序在运行阶段出现的错误,这种错误通常由程序中的某些数据来自用户的输入或程序所处的软硬件环境引起的,因而不可能在编译阶段检查出来。
运行时错误通常会中断程序的执行,严重的运行时错误甚至可能引起程序的奔溃。在java中,运行时错误通常以异常的形式出现,开发者根据程序输出的异常信息,通常能够快速判断出运行时错误出现的原因及位置。
因运行时错误与程序要处理的数据以及程序所处的软硬件环境有关,因此很多时候需要对程序进行大量的测试才能重现这种错误。为降低运行时错误出现的可能性,应尽量避免数据硬编码,同时充分考虑各种有代表性的、将来用户可能会输入的数据并编写相应的处理逻辑。
逻辑错误
逻辑错误是指程序通过编译,且运行时没有出现任何异常,但实际的运行结果与预期不一致。
在软件的开发阶段,代码出现逻辑错误是不可避免的,即使对于有着丰富经验的开发者也是如此。逻辑错误发生时,通常不会出现任何异常或提示,因而这种错误也是最难发现的,寻找具有逻辑错误的代码所耗费的时间往往比改正这个错误要多得多。
通常,应先根据程序的输出信息判断出错误所在的大致位置,然后通过人工检查的方式逐行检查范围内的每行代码是否正确——主义不是检查语法上是否正确,而是检查代码是否完成了预期的逻辑,如:“应该是乘而不是加”。
人工检查的方式只适合于程序的代码行数较少或判断出的错误所在范围较小的情况,在实际开发中,这些情况很少被满足。另外,由于粗心或思维定式等原因,这种方式经常不能检查出错误所在,因此,更为可靠地定位并改正逻辑错误的方法是调试。
程序调试
- 首先,通过人工检查的方式粗略判断出错误所在的范围,若无法判断,则认为被执行的第一行代码可能有错误。
- 然后在范围的起始处设置断点,并以调试方式执行程序,当程序执行到断点处时,会暂时停止执行。
- 接着,查看相关的变量或感兴趣的表达式在这一刻的实际值与预期值是否一致,此时,被执行完的最后一行代码即使错误所在的位置。