零基础学Java第2版
上QQ阅读APP看书,第一时间看更新

1.4 常见疑难解答

对于初学者而言,在Java程序的开发、编译和执行过程中,都或多或少会遇到问题,如环境变量设置不正确,源程序的语法错误、语义错误,或在程序编译、运行时发生错误等。如果这些错误或问题不能得到适当的处理,那么会对初学者造成很大的障碍,本节将介绍几种常见的错误,以使读者在学习的过程中少走弯路。

1.4.1 环境变量设置错误

图1.11 无法找到Javac可执行程序

在编译并运行Java应用程序之前,需要设置环境变量,其目的是使Windows系统可以知道DOS窗口中运行的Java工具可执行程序,如Javac源程序编译工具等。图1.11说明Windows操作系统无法发现Javac编译程序。JDK环境变量的设置可以参考第2章的内容。

当然如果已经安装了JDK,则可以在DOS提示符下输入Javac的绝对路径,通过绝对路径来识别该命令的位置。如果采用JBuilder9自带的jdk,那么目录为C:\JBuilder9\jdk1.5\bin。也可以在源文件的当前路径下输入C:\JBuilder9\jdk1.5\bin\Javac HelloWorld.Java。显然这种方式很烦琐,因为每次编译源文件都要输入一串路径和命令信息。读者可以通过第2.5节掌握如何设置JDK环境变量。

1.4.2 语法错误

图1.12 语法错误

Java语言规范设计了语法规则,但是如果疏漏了部分内容,违反了Java的语法规则,编译器会发出语法错误消息,该消息包含错误类型、发生错误的代码在程序中的位置(以该错误代码行为标识)等,并且在错误处标识一个“^”。语法错误如图1.12所示。

在HelloWorld.Java源程序中将语句System.out.println(“HelloWorld!”)后的分号去掉,使得程序语句缺少结束标志,这就违反了Java语法规则。在编译期发生任何类型的错误都会导致无法生成.class文件。所以此时需要读者仔细分析错误类型,细致检查程序中的错误,直到源程序顺利通过编译。

1.4.3 语义错误

编译器也会发生语义错误。编译器无法识别一个标识的语义,如发现一个未定义的变量,错误输入了系统类库的类的名字等。图1.13演示了一个语义错误,笔者故意将语句System的首字母改为小写,使编译器无法识别,从而输出语义错误。

注意

Java程序区分大小写。

图1.13 语义错误

1.4.4 运行时错误

运行时错误指在执行程序过程中发生的错误,如某个类没有实例化而造成空指针,无法找到指定的类文件等。下面介绍三种初学者常见的运行时错误。

1. 无法发现类文件

在用户编译或执行Java程序时,由于种种原因可能输入了不正确的类名字,使得编译器或虚拟机无法发现该文件所在的位置。类文件名输入错误如图1.14所示。

图1.14 类文件名输入错误

在图1.14中,笔者想运行HelloWorld程序,但是输入了错误的类名HelloWorldd,所以执行系统抛出Java.long.NoClassDefFoundError错误。

使用Java工具会启动Java虚拟机,此时系统会首先在当前目录下寻找类文件,如果没有则默认到操作系统的系统环境变量classpath中搜索。所以读者也可以在该变量中设置需要编译的类文件所在的目录。

注意

变量的设置方式可以参考第2.5节设置classpath环境变量。

2. 执行Java工具时类名错误

对于初学者而言,很容易出现的一个错误是使用Java执行程序时,往往会输入类文件名如HelloWorld.class,这是不允许的,此时会抛出异常。类名输入错误如图1.15所示。

图1.15 类名输入错误

注意

在调用Java工具执行程序时,需要在其后输入类名而不是类文件名,如输入Java HelloWorld才是正确的方式。

3. 无法发现main()方法

在第1.3节已经知道,任何Java应用程序执行的类中必须有main()方法,该方法是程序的入口,通过它才可以继续调用程序所需的各种其他资源。如果在类中没有定义main()方法或该方法书写错误,都会导致图1.16所示的缺少main()方法错误。

图1.16 缺少main()方法错误

笔者在HelloWorld.Java源程序中修改了main()方法的名字,继续编译并执行该程序,虚拟机将无法加载该类,因为无法发现类HelloWorld的程序入口。