Java内置了一套异常处理机制,总是使用异常来表示错误。
一,使用try……catch来捕获错误
异常是一种class,因此它本身带有类型信息。异常可以在任何地方抛出,但只需要在上层捕获,这样就和方法调用分离了:
try {
String s = processFile(“C:\\test.txt”);
// ok:
} catch (FileNotFoundException e) {
// file not found:
} catch (SecurityException e) {
// no read permission:
} catch (IOException e) {
// io error:
} catch (Exception e) {
// other error:
}
Java规定:
必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,这种类型的异常称为Checked Exception。
不需要捕获的异常,包括Error及其子类,RuntimeException及其子类。
一般,我们会使用try……catch来捕获异常.
另外,我们也可以在方法名后面声明强制需要捕获的异常.
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException {
...
}
在方法定义的时候,使用throws Xxx表示该方法可能抛出的异常类型。调用方在调用的时候,必须强制捕获这些异常,否则编译器会报错。
而捕获错误后,我们通常会把它打印到控制台以便分析.
try {
return s.getBytes("GBK");
} catch (UnsupportedEncodingException e) {
// 先记下来再说:
e.printStackTrace();
}
所有异常都可以调用printStackTrace()方法打印异常栈,这是一个简单有用的快速打印异常的方法。
二,多个catch和finally
有多个错误需要捕获的话,就可以使用多个catch,当然,错误的子类必须写在前面.并且多个catch语句只有一个能被执行。
而,finally,就是无论如何都会被执行的部分代码:
public static void main(String[] args) {
try {
process1();
process2();
process3();
} catch (UnsupportedEncodingException e) {
System.out.println("Bad encoding");
} catch (IOException e) {
System.out.println("IO error");
} finally {
System.out.println("END");
}
}
三,异常的传播
和js中一样,异常会不断向上传播,直到被try……catch捕获
public class Main {
public static void main(String[] args) {
try {
process1();
} catch (Exception e) {
e.printStackTrace();
}
}
static void process1() {
process2();
}
static void process2() {
Integer.parseInt(null); // 会抛出NumberFormatException
}
}
四,空指针异常NullPointerException
空指针异常,就和js中的undefined差不多啦.
try {
String s = null;
System.out.println(s.toLowerCase());
} catch (NullPointerException e) {
e.printStackTrace();
}
五,日志的打印
像前端的开发,我们打印日志直接使用console,后端则使用System.out.println(),但是后端是起一个服务给另一方调用,打印显得很麻烦,我们希望有文件可以追溯调用情况.
对于日志的打印.
我们常用的是log4j