在Java学习的道路上,我们要面临很多的难关,有的人需要很长时间的摸索,而有的人却可以快速掌握,这是因为有的人容易悟到法门,而有的人则会迟钝一些。下面提到的这些状态,如果你从来都没有体会过,或者很快就度过了,说明你的悟到了这个环节的法门,而如果你正处於这种状态,就值得细细品味了。
状态描述:
程序编译老是出错,或者根本就没法编译;有时候能够写对,不知道为什么对,大多数时候会出错,却不知道为什么出错;老师讲的一听就懂,自己做的一做就错;明明觉得很简单,就是要出错。错!错!错!
难关解析:
Java学习之路上,面对的第一个BOSS是:编译器
编译器仅仅是把Java源程序转换为字节码,java文件-->class文件,但是如果这个环节出错,程序根本无法运行,因为虚拟机只认识合格的class文件,连class文件都没有,还谈何运行。
就是这个BOSS,可能把你阻挡在门外很久。编译器所检验的是源代码是否符合语法规则,可是语法规则那么多,总也记不完,特别是记起来很枯燥。比如说:public类的类名要和源文件的名字一样,一个源文件里面只能包含一个public类,可以有多个非public类。这么一句拗口的话,要记多久才能记住?念清楚都要蛮久的时间,还那么单调,怎么办呢?
挑战BOSS
挑战这个BOSS的办法就是“错一次,记一次,长记性!”。编译器的最大特点是在源代码不符合语法规则的时候,会给我们提示信息,如果你有点敌对情绪的话,可以认为这是“报错”。但不管怎样,同一类错误,提示信息总是类似的。我的原则不是说要求自己不犯错,或者有人认为的第一次错误可以理解,第二次同类错误可以容忍,第三次犯同类错误直接pass,毕竟在同一个地方跌倒还是很正常的,因为那里可能总是有个坑,而且还坑得不明显。那我的原则是什么呢?看到某个错误信息提示,能迅速反应出问题所在,并迅速更正,最终通过编译。
这就要求我们错一次,记一次,反应速度越来越快,最终无需反应。
这其中的乐趣,远比死记硬背语法规则要多,实际上这是另外一种记忆语法规则的方式,对吗?
操作实例
光说不练假把式。如果是我现在正在开始学习Java,我会给自己做一个错误集,类似下面的记录,这些记录有的是编译错误,有的是运行错误,办法都是一样的:
信息提示 | 原因 | 解决办法 |
| 环境变量PATH没有设置对 | 先看看PATH的内容:echo %PATH%,果然没有包含jdk的bin目录。只需将PATH设置正确就ok了 |
| 当前路径找不到名为Hello.java的文件 | 先看看当前路径有没有这个文件:dir命令;果然没有,切换到java文件所在目录,再编译 |
| 写了一个公开类,类名和文件名不一样 | 改成一样就ok |
| 编译通过后的错误叫异常,这是英文的,简单翻译一下,是说找不到HelloWorld这个类 | 先看看当前目录有没有这个class文件,dir一下,果然没有,那说明你的路径错了,或者类名没整对,或者根本就没生成class文件,总之当前路径找不到;如果找到了,那说明你忘记在classpath环境变量下添加当前路径“.;”了,echo %classpath%试试,如果真是这样重新配置下classpath环境变量。 |
| 什么叫找不到符号?蒙了!别急,看到10这个数字了吗?说的是第十行,看到^这个标志了吗?说的是代码的这里出错了,编译器其实很友好,什么都告诉你了。 | 那就看看这个位置的代码吧。找不到符号的意思实际上是编译器不认识这个符号,我们这里大小写弄错了。如果你将本来是英文的“;”输成了中文的“;”,那同样也是这个类型的错误,就是这里的字符或者这个单词,你没写对。 |
| 编译啥的,都弄好了,现在出这个问题。记住javac阶段的错误叫编译错误,java阶段的错误叫运行错误,或者叫异常。 读读英文,说的好像是没有这样的方法:main | 明明写了呀!!还是确认下吧,发现main写成了mian……为啥编译不报错,这是因为方法名可以是随意的,但是程序入口方法却必须是main,而且写法是固定的。一旦看到这个错误,肯定是没有main方法,或者你以为写了一个main方法,却写错了。 |
| 好了,这个错误你自己猜猜是什么原因吧? | 待解决…… |
当然,对于初学者,截图形成第一列还是很简单的,就是截图。写出第二列和第三列你就要借助于网络、老师和书籍了。每次出错,想想这个错误是否见过,是否记录过。如果没出现过,果断问老师,解决了,记下来。出现过的,你应该不好意思告诉别人你在同一个地方摔倒过多少次吧,虽然我们前面给你找了理由。
好了,开始你的挑战之旅吧,记住,编译器是纸老虎,你这一生不会见到超过100种编译错误,我说的是“种”,不是“个”,如果你的记录表超过了100条,你来找我。