Java提供了完善的错误处理机制,在深入理解这些错误之前,先认识一下它们。
Java程序设计错误可以分为三类:语法错误
、运行时错误
和逻辑错误
。
语法错误
在编译过程中由编译器检测出来的错误称为语法错误syntax error
或编译错误compile error
。
语法错误是由创建代码时的错误引起的,例如:拼错关键字,忽略了一些必要的标点符号,或者左花括号没有对应的右花括号。
这些错误通常很容易检测到,因为编译器会告诉你这些错误在哪里,以及是什么原因造成的。
public class Welcome {
public static main(String[] args) {
System.out.println("Hello world");
}
}
观察一下上面这段代码,发现了什么问题?
运行 javac Welcome.java
Welcome.java:2: 错误: 方法声明无效; 需要返回类型
public static main(String[] args) {
^
1 个错误
从错误提示可以看出,第2行main方法前遗漏关键字void。
public class Welcome {
public static void main(String[] args) {
System.out.println("Hello world);
}
}
观察一下上面这段代码,发现了什么问题?
运行 javac Welcome.java
Welcome.java:3: 错误: 未结束的字符串文字
System.out.println(“Hello world);
从错误提示可以看出,第3行字符串应该加上引号。
有时候,提示会显示多个错误信息,一个错误会显示很多行的编译错误,因此,从最上面的行开始向下纠正错误。
D:\mapull>javac Welcome.java
Welcome.java:3: 错误: 未结束的字符串文字
System.out.println("Hello world);
^
Welcome.java:3: 错误: 需要';'
System.out.println("Hello world);
^
Welcome.java:5: 错误: 解析时已到达文件结尾
}
public class Welcome {
public static void main(String[] args) {
System.out.println("Hello world");
System.out.println("码谱");
}
}
观察一下上面这段代码,发现了什么问题?
运行 javac Welcome.java
Welcome.java:4: 错误: 非法字符: ‘\uff1b’
System.out.println(“码谱”);
^
1 个错误
很容易出现的错误,在输入完中文以后,往往在最后添加的是中文分号,导致程序出现非法字符。
如果你不知道如何纠正错误,将你的程序一个字符一个字符地仔细对照示例代码。在初期,你可能要花许多时间纠正语法错误,但是很快你会熟悉Java语法,并快速纠正语法错误。
运行时错误
运行时错误runtime error
是引起程序非正常终止的错误。运行应用程序时,当环境检测到一个不可能执行的操作时,就会出现运行时错误。输入错误是典型的运行时错误。当程序等待用户输入一个值,而用户输入了一个程序不能处理的值时,就会发生输入错误。
例如:如果程序希望读入的是一个数值,而用户输入的却是一个字符串,就会导致程序出现数据类型错误。
另一个常见的运行时错误是将 0 作为除数。当整数除法中除数为 0 时可能引发这种况。
public class Welcome {
public static void main(String[] args) {
System.out.println("Hello world");
System.out.println(1/0);
}
}
运行 javac Welcome.java
,不会有任何输出,证明程序被正确编译。
运行 java Welcome
D:\mapull>java Welcome
Hello world
Exception in thread “main” java.lang.ArithmeticException: / by zero
at Welcome.main(Welcome.java:4)
运行时错误只在程序运行时报错,能正确通过编译。
逻辑错误
当程序没有按预期的方式执行时就会发生逻辑错误logic error
。
这种错误发生的原因有很多种。
下面有一个除法的例子,我希望计算 3 除以 2 的结果,理想结果应该是 1.5
public class Welcome {
public static void main(String[] args) {
System.out.println(3/2);
}
}
D:\mapull>java Welcome
1
你将得到结果1,而这是不符合预期的,结果应该是1.5。
Java中,整数相除是返回除法的整数部分,即小数部分被截掉。
要得到正确的结果,需要使用’3.0/2’,这样得到结果1.5。
通常情况下,因为编译器可以明确指出错误的位置以及出错的原因,所以语法错误是很容易发现和纠正的。
运行时错误也不难找,因为在程序异常终止时,错误的原因和位置都会显示在控制台上。
然而,查找逻辑错误就很有挑战性了。
之后,我们将学习跟踪程序 debug 以找到逻辑错误。查错能力将是一个程序员厉不厉害重要的指标。
常见错误
对于编程初学者来说,遗漏右括号
、遗漏分号
、遗漏字符串的引号
、名称拼写错误
是常见的错误。
遗漏右括号
括号用来标识程序中的块
。每个左括号必须有一个右括号与之匹配。常见的错误是遗漏右括号。
为避免这个错误,任何时候输入左括号的时候就输入右括号,如下面的例子:
public class Welcome{
立刻输入此右括号}
以匹配左括号。
如果使用 Eclipse 和 IDEA 这样的IDE,在输入左括号时会自动插入一个右括号。
遗漏分号
每个语句都以一个语句结束符;
结束。
通常,编程初学者会忘了在一个块的最后行语句后加上语句结束符,如下面例子所示:
public class Welcome {
public static void main(String[] args) {
System.out.println("Hello world")
System.out.println(1/0);
}
}
遗漏引号
字符串必须放在引号中。通常,编程初学者会忘记在字符串结尾处加上一个引号,如下面例子所示:
System.out.printIn("Study in Mapull);
遗漏一个引号
如果使用 Eclipse 和 IDEA 这样的IDE,在输入左引号时会自动插入一个右引号。
名称拼写错误
编程初学者常将名称拼写错。
例如,下面的代码中main错误拼写成Main,System 错误拼写成 system
public class Welcome {
public static void Main(String[] args) {
system.out.println("Hello world")
}
}
在之后,会接触到更多更复杂的错误,Java提供了完善的错误机制。
在 异常处理 部分,会有更多的处理异常的手段。