学习程序设计,最怕的事情可能就是遇到错误却找不到错在哪里。这里列举一下笔者发现的JAVA新人常犯的错误,供目前正在上笔者JAVA课程的学生参考,其他JAVA初学者亦可借鉴。
1、源程序文件后缀名名义上是.java而实际上是.txt
JAVA要求源程序文件的后缀名为.java。也许是为了防止用户不小心更改了文件的后缀名,Windows默认情况下是隐藏后缀名的,这就为初学者犯错埋下了隐患。此时,我们创建一个文本文件,然后把它的“后缀名”改为.java,如下图所示:
表面上看,它的文件全名是HelloWorld.java,然而当你编译时却报“找不到文件”的错误,如下图所示:
运行dir命令,显示当前目录下的所有目录和文件,这个文件就会露出它的庐山真面目。如下图所示:
可以看出,它的后缀名仍然是.txt。Windows隐藏了文件的后缀名,所以当我们把文件更名为HelloWorld.java时,并没有改掉它的后缀名,.java只是文件名的一部分,并非为后缀名。
解决办法是不要让Windows隐藏文件的后缀名。打开“我的电脑”,点击顶部菜单栏的“工具”->“文件夹选项”,打开“文件夹选项”对话框,点击“查看”标签,在“高级设置”中,清除掉“隐藏已知文件类型的扩展名”前面的勾选。如下图所示:
确定后,我们就可以在Windows下清楚地看到文件“HelloWorld.java”的真实面目了。如下图所示:
2、没有区分中英文
在JAVA语言中(实际上其他语言诸如C也一样),起特殊作用的分号“;”、括号(包括圆括号“()”、中括号“[]”、大括号“{}”),以及双引号“""”、单引号等,都必须是英文的。若不小心输入为中文的,就会报语法错误。此类错误对于初学者来说非常隐蔽,常会耗费大量的时间和耐心。以分号为例,可采用如下方法检测是不是误写为中文的了:按快捷键Ctrl+F,可打开搜索对话框,输入中文的分号,让它搜索,看搜索到的分号是不是应该写为英文的。为保证能对整个程序文件进行搜索,可在搜索前预先把光标移动到程序的开始处。因为搜索默认情况下是从当前光标处搜索到文件尾,光标之前的内容不会搜索到。或者使用某些搜索选项,让它搜索完整个文件。分别以EditPlus和Windows的记事本编辑器示例如下:
Editplus,确认选中红框中的选项。
记事本:如下图,默认向下搜索。向下搜索完后,再点击“向上”,让它向上搜索。
3、括号、引号等不配对
在程序中,圆括号(())、方括号([])、大括号({})以及双引号("")和单引号必须成对出现,否则报错。如以下的的错误“进行语法解析时已到达文件结尾”,即是因为少了一个右大括号。为避免发生此类错误,可先把左右括号/引号写好,然后再往里面添加代码。
4、缺少大括号
对于if/else和循环,若只需执行一条语句,可以不用大括号。但是当需要添加语句时,就需要用大括号把多条语句包含起来。这一点容易被忽略,而一旦被忽略,就是逻辑错误(程序能运行,但结果不对)。排查逻辑错误要比语法错误困难很多,因为编译器不会报错,所以常常会耗费大量时间和耐心。因此,为避免这类错误,应养成习惯:即使只执行一条语句,也应用大括号包含。
5、类名/变量名写错或没有区分大小写
类名应保证正确,变量定义后,再使用此变量也应该保证与定义时的名字一致。更容易出错的是,JAVA是区分大小写的语言,有人把String写成string,或者同一个变量名,前后使用时大小写不一致,都会报错。因此,当编译器报“找不到符号”的错误时,就应该根据编译器的错误提示信息仔细检查相关类名/变量名是不是这两方面犯了错。例如,下图的错误分别是把类String写成了string,以及定义了变量scan,但使用此变量时却写成了sscan。
6、公共类名应与文件名同名
我们一般写的类都是公共的(public),JAVA要求保存公共类的文件的文件名必须与类同名,而且要注意大小写。否则会报错:类XX是公共的,应在名为XX.java的文件中声明。这里的“XX”指代某个类名,以下亦然。
7、修改后未保存或未重新编译
发现错误更改后未保存,这时修改并未生效,因此应该首先保存。保存后还应重新编译生成新的字节码文件(.class)文件,因为真正运行的是字节码文件。不重新编译的话,运行的还是旧的字节码文件。
8、错误:仅当显式请求注释处理时才接受类名称“XX.JAVA”
这个错误是前一段时间批改学生程序时遇到的,程序本身没有发现任何问题,只是文件名写成了XX.JAVA,一时我也不知道错在哪里。后来把文件后缀名.JAVA改为.java,就好了。由于笔者写程序时一直把后缀名写为.java,因此一直未遇到这种问题(或者遇到了,但是忘记了)。看到大写的后缀名后,潜意识里认为后缀名属于Windows的概念,而Windows是不区分大小写的,因此也未在意。但我当时显然忽略了一点,当我们用javac命令编译程序时,javac是JAVA的东西,它对于将要编译的文件的文件名,是区分大小写的。因此,文件名XX.JAVA与XX.java对它来说,是不一样的。正如上面的第三条所讲,公共类名应与文件名同名,而且要注意大小写。而如果我们把javac写成JAVAC,则没有问题。因为javac命令是Windows帮我们调用的,它不区分大小写。
9、设置classpath环境变量时忘了添加当前目录
在不使用IDE的情况下,若要引用第三方jar包,需把这些jar包引入到classpath环境变量中。但若设置classpath时,没有包含当前目录(.),那么即使是在字节码文件所在的目录使用java命令运行此字节码文件,也会报java.lang.NoClassDefFoundError。这是因为若不设置classpath,则classpath自动包含当前目录;而若设置后,则不再自动包含当前目录,需要我们显式指定包含,这一点与path环境变量不同。
10、方法调用没有参数时遗漏了圆括号
与C一样,JAVA中调用方法,即使没有参数,也应带上圆括号。犯这种错误,说明基础知识不牢固。
11、import语句位置不对
例如以下程序:
import java.text.DecimalFormat;
class A
{
}
import java.util.Scanner;
class B
{
}
则会报第7行出错:“需要为 class、 interface或enum”。这是因为import语句应写在类定义之前,不能在两个类的定义之间出现import语句。因此,上述程序应修改如下:
import java.text.DecimalFormat;
import java.util.Scanner;
class A
{
}
class B
{
}
为避免此类错误,建议每个类写在单独的文件中。
(发现其他问题,将继续更新)
猛戳这里全面系统地学习MyBatis 3
低版本的JAVA6无法访问SQL Server 2008