1. 异常
-
程序在运行过程中难免会发生错误,为此Java提供了异常处理机制来帮助程序员检查可能出现的错误,对于可能出现的异常都需要预先进行处理
-
异常也是一个对象,包含了错误信息和处理方法,有的需要手动捕获或抛出称为受检异常(Checked Exception),有的虚拟机自动进行捕获,编译时期通过,处理称为免检异常
-
异常继承图:
其中Exception及其子类(不包括RuntimeException)是必须捕获的异常
Error及其子类,RuntimeException及其子类是不需要捕获的
- 常见异常
异常名 | 解释 | |
---|---|---|
VirtualMachineError | 虚拟机异常 | |
ReflectionError | 反射异常 | |
Error | ||
IOException | IO流异常 | |
DataFormatException | 日期格式日常 | |
Exception | ||
ArithmeticException | 算术异常 | |
IndexOutOfBoundsException | 下标越界 | |
NullPointerException | 空指针 | |
ClassCastException | 类型转换异常 | |
RuntimeException |
2. 异常处理
捕获
try catch finally,把要捕获异常的语句放到try里面
public static void main(String[] args) {
try {
ExceptionTwo(); //会发生算数异常
System.out.println("try");
}catch (RuntimeException e) {
System.out.println("run");
e.printStackTrace(); //打印方法调用栈
} catch (Exception e) {
System.out.println("ex");
}finally{
System.out.println("finally");
}
System.out.println("我是异常下面的语句");
}
static void ExceptionTwo() {
ExceptionOne();
}
static void ExceptionOne() {
int a = 1/0; //算数异常
}
run
java.lang.ArithmeticException: / by zero
at exception.Test.ExceptionOne(Test.java:36)
at exception.Test.ExceptionTwo(Test.java:31)
at exception.Test.main(Test.java:11)
finally
我是异常下面的语句
-
发生异常后不执行异常后面的语句,直接跳转catch,最后一定会执行finally(除非用exit,不然return之后也会执行finally里面的语句)
-
可以有多个catch语句,但要子类放前面,父类放后面,但如果异常不是继承关系,catch条件里面可以用 '|' 逻辑运算符
-
当执行完finally会继续往finally下面的语句执行
-
调用顺序从打印语句来看是从下往上,main函数调用ExceptionTwo,ExceptionTwo调用ExceptionOne,ExceptionOne里面有算数异常
-
finally中有return,前面的return失效,直接在finally中返回
抛出
throws在方法声明中抛出,throw在方法体内抛出
当某个方法抛出异常时,如果当前方法没有捕获,异常就会被抛到上层调用方法,直到遇到某个try ...catch被捕获为止
创建异常一般使用匿名函数方式
public static void main(String[] args) {
try {
ExceptionOne(); //这里被向上抛出的异常需要捕获,或者继续向上抛出
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
static void ExceptionOne() throws FileNotFoundException {
File file = new File("D:test.txt");
FileOutputStream fs = new FileOutputStream(file);//会抛出文件异常,但在方法声明中用了throws向上抛出
}
public static void main(String[] args) throws Exception {
int a = 1;
if (a < 2){
throw new Exception("a小于2了"); //一般继承Exception,然后使用构造函数
}
}
打印
public class Test {
public static void main(String[] args) {
Logger logger = Logger.getLogger(Test.class);
try {
int a = 1/0; //会发生算数异常
}catch (RuntimeException e) {
logger.error("测试异常",e); // 使用log4j日志系统
}
}
}
-
logger.error(Object message); //只输出信息
-
logger.error(Object message,Throwable a); //输出堆栈