什么是异常
定义:异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等
异常英文:Exception
- Java内置了一套异常处理机制,总是使用异常来表示错误
- 异常是一种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
}
异常的分类
异常分为三种类型:
- 检查性异常
- 运行时异常
- 错误ERROR
异常体系结构
Java把异常当作对象处理,并定义一个基类java.lang.Throwable作为所有异常的超类
Throwable是异常体系的根,它继承自Object
Throwable异常分为两大类:
- 错误Error:表示严重的错误,程序对此一般无能为
- 异常Exception:运行时的错误,它可以被捕获并处理
Error错误分为:
- VirtulMachineError
- StackOverflowError:栈溢出
- OutOfMemoryError:内存耗尽
- A WTError
Exception分为两大类:
- RuntimeException
- 非RuntimeException
- IOException、ReflectiveOperationException…
某些异常是应用程序逻辑处理的一部分,应该捕获并处理
例如:
- NumberFormatException:数值类型的格式错误
- FileNotFoundException:未找到文件
- SocketException:读取网络失败
还有一些异常是程序逻辑编写不对造成的,应该修复程序本身
例如:
- NullPointerException:对某个null的对象调用方法或字段
- IndexOutOfBoundsException:数组索引越界
Error
Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关
- Java虚拟机运行时错误(VirtulMachineError)
当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError;这些异常发生时,Java虚拟机(JVM)一般会选择线程终止 - 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)
这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况
Exception
在Exception分支中有一个重要子类:RuntimeException(运行时异常)
RuntimeException
- ArrayIndexOutOfBoundsException:数组下标越界
- NullPointerException:空指针异常
- ArithmeticException:算术异常
- MissingResourceException:丢失资源
- ClassNotFoundException:找不到类
这些异常程序可以选择捕获处理,也可以不处理
这些错误一般都是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生
Error与Exception的区别
Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机一般会选择终止线程
Exception痛苦情况下是可以被程序处理的,并且在程序中应该尽可能的处理这些异常
异常处理机制
int a = 1;
int b = 0;
try { //try监控区域
System.out.println(a / b);
} catch(ArithmeticException e) { //catch(想要捕获的异常类型) 捕获异常
System.out.println("程序出现异常");
} catch(Exception e) {
e.printStackTrace(); //打印错误的栈信息
} finally { //处理善后工作
System.out.println("finally");
}
catch捕获的异常,越大的类型需要写在越下面
在try捕捉的异常之后,还可以主动抛出异常,一般在方法中使用
try {
if (b == 0) {
thorw new ArithmeticException();
}
}
public void test(int a, int b) {
if (b == 0) {
thorw new ArithmeticException();
}
}
假设这个方法中,处理不了这个异常,可以在方法上抛出异常
public void test(int a, int b) thorws ArithmeticException {
if (b == 0) {
thorw new ArithmeticException();
}
}
自定义异常
继承Exception类