java异常处理
我们在编程过程中或多或少遇见过错误,这些错误用官方术语来说就称为异常
什么是异常
异常是指程序运行过程中出现的不期而遇的各种状况,影响了正常的程序执行流程
异常的分类
异常分为以下三种:
- 检查型异常:用户错误或问题引起的异常,是程序员无法预见的(例如打开一个不存在的文件)
- 运行时异常:最可能被程序员避免的异常
- 错误:错误不属于异常,是脱离程序员控制的问题,在代码中常常被忽略(例如栈的溢出)
异常体系结构
java把异常当作对象来处理,并定义了一个基类java.lang.Throwable作为所有异常的超类
在javaAPI中已经定义了许多异常类,这些异常类分为两大类:错误Error和异常Exception
然后为大家附上异常体系结构图:
Error和Exception
Error特征:
- Error类对象由java虚拟机生成并抛出,大多数错误与代码编写者无关
- java虚拟器运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常出现时,一般选择线程终止
- 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError),连接错误(LinkageError)。这些错误不可查,因为它们在应用程序的控制和处理能力之外,而且绝大部分时程序运行时不允许出现的状况
Exception特征:
- 运行时异常是不检查异常,程序中可以选择捕获处理也可以选择不处理
- 这些异常一般是由程序错误引起的,程序应该从逻辑角度尽量避免这些异常的出现
两者的区别:
- Error常常是灾难性的致命错误,是程序无法控制和处理的,当出现这些异常时,JVM一般选择直接终止线程
- Exception常常是可以被程序处理的,并且在程序中应该尽量去处理这些异常
捕获,抛出异常
针对异常有两种处理方式
- try,catch,finally
- throw,throws
首先针对try:
一般格式为:
代码语言:javascript复制 try {
执行代码
}catch (异常类型 e){
执行失败后代码
}finally {
必定执行代码
}
例子:
代码语言:javascript复制public class Demo1 {
public static void main(String[] args) {
int a = 1;
int b = 0;
//try尝试,catch捕捉,finally最终实现
try {
System.out.println(a/b);
}catch (ArithmeticException e){
System.out.println("被除数为0");
}finally {
System.out.println("运行结束");
}
}
}
这里注意:catch可以有多层,一般从小异常到大异常
代码语言:javascript复制public class Demo2 {
public static void main(String[] args) {
int a = 1;
int b = 0;
//try尝试,catch捕捉,finally最终实现
try {
System.out.println(a/b);
}catch (Error e){
System.out.println("Error");
}catch (ArithmeticException e){
System.out.println("ArithmeticException");
}catch (Throwable e){
System.out.println("Throwable");
}finally {
System.out.println("finally ");
}
}
}
再来说说throw:
一般格式:
代码语言:javascript复制throw new 异常类型();
例子:
代码语言:javascript复制public class Demo3 {
public static void main(String[] args) {
int a = 1;
int b = 0;
//主动抛出异常
if (b == 0) {
throw new ArithmeticException();
}
}
}
throw一般用于方法中:
代码语言:javascript复制public class Demo4 {
public static void main(String[] args) {
try{
new Demo4().test(1,0);
}catch(ArithmeticException e){
e.printStackTrace();
}
}
//若方法处理不了异常,方法上抛出异常
public void test(int a,int b) throws ArithmeticException{
if(b == 0){
//主动抛出异常,一般在方法中使用
throw new ArithmeticException();
}
}
}
针对异常处理有快捷键:
代码语言:javascript复制ctrl Alt T
在这里我们补充一下printStackTrace
printStackTrace的作用是为了展示出错行数,一般用于调试
代码语言:javascript复制public class Demo5 {
public static void main(String[] args) {
int a = 1;
int b = 0;
//try尝试,catch捕捉,finally最终实现
try {
System.out.println(a/b);
}catch (ArithmeticException e){
e.printStackTrace();
}finally {
System.out.println("运行结束");
}
}
}
结果:
代码语言:javascript复制java.lang.ArithmeticException: / by zero
at error.Demo5.main(Demo5.java:12)
运行结束
在idea中由软件给出,但在记事本或其他软件中需要printStackTrace得出错误行数便于纠正修改
实际应用中的经验总结
- 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch来处理
- 在多重catch块后面,可以加上一个catch(Exception)来处理可能会被遗漏的异常
- 对于不确定的代码,也可以加上try-catch处理潜在异常
- 尽量去处理异常,切忌只是简单的调用printStackTrace()去打印输出
- 具体如何处理异常,要根据不同的业务需求和异常类型去处理
- 尽量添加finally语句块去释放占用的资源
结束语
好的,关于java异常先简单介绍到这里