Java语言中,将程序执行中发生的不正常情况统称为“异常”,传统开发过程中的语法错误和逻辑错误不是异常。
执行过程中的异常事件可以分为两大类:
- Error错误,Java虚拟机无法处理的严重问题,比如JVM系统内存错误,栈溢出等
- Exception异常,其它因编程错误或者偶然的外在因素导致的一般性问题,可以使用针对性的代码进行解决,这种异常又分为两类:运行时异常,编译时异常。
异常体系结构
异常分为两大类:运行时异常和编译时异常
运行时异常是不要求强制处理的异常,编译器检查不出来,一般指编程时的逻辑错误,是程序员应该避免出现的异常,对于运行时异常,可以不作处理,这类异常很普遍,若全部处理可能会对程序的可读性和运行效率产生影响。
编译时异常是编译器要求必须处理的异常。
常见运行时异常
1.NullPointerException空指针异常
String name = null;
System.out.println(name.length());
2.ArithmeticException数学运算异常
int num = 10;
int num1 = 0;
int result = num / num1;
3.ArrayIndexOutOfBoundsException数组下标越界异常
int[] nums = {1,2};
System.out.println(nums[2]);
4.ClassCastException类型转换异常
class A{}
class B extends A{}
class C extends A{}
A a = new B();
B b = (B) a;
C c = (C) a;
5.NumberFormatException数字格式不正确异常
String num = "数组";
System.out.println(Integer.parseInt(num));
异常处理方式
在Java中有两种异常处理方式:
-
try-catch-finally,在代码中捕获异常,自行处理
try{ String name = null; System.out.println(name.length()); }catch(Exception e){ e.printStackTrace(); }
1.当发生异常以后,在异常后面的代码是不会执行的
2.没有发生异常,catch语句块就不会被执行
3.如果希望不管有没有异常发生都执行某段代码可以使用finally语句块
4.可以有多个异常,进行分别捕获,要求子异常在前面先捕获,父异常在后面,后捕获。
-
throws,将发生的异常抛出,交由调用者处理,最顶级的处理者是JVM,throws即可以抛出一个异常,也可以抛出多个异常
1.编译异常,在程序中必须处理
2.对于运行时异常,如果程序中没有处理,默认就是throws抛出异常
3.在重写的过程中,子类抛出的异常,要么跟父类一样,要么是父类的子类型,不能比父类大
4.如果有try-catch就不用throws
对于编译型异常,程序中一定要处理,对于运行时异常,如果程序中没有处理,会默认的处理行为,throws抛出
自定义异常
- 自定义异常类,继承自Exception或者RuntimeException
- 如果继承自Exception就是编译异常
- 如果继承自RuntimeException就是运行时异常
public class Demo3 {
public static void main(String[] args) {
int age = 70;
if(!(age>=80 && age <= 120)){
throw new AgeException("年龄必须在80-120之间");
}
System.out.println("您输入的年龄正常");
}
}
class AgeException extends RuntimeException{
public AgeException(String message) {
super(message);
}
}
一般我们都是继承自RuntimeException类,有默认的处理机制,方便。
throw和throws区别
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的一种类型 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键词 | 方法体中 | 异常对象 |