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