- 一、异常的分类
- 二、RuntimeException常见的异常有哪些
- 三、throw和throws的区别
- 四、自定义异常
Throwable 类是Java异常类型的顶层父类,一个对象只有是 Throwable 类的(直接或者间接)实例,他才是一个异常对象,才能被异常处理机制识别。JDK中内建了一些常用的异常类,我们也可以自定义异常。<br /> Throwable类有两个直接子类:<br /> Exception:出现的问题是可以被捕获的;<br /> Error:系统错误,通常由JVM处理。
一、异常的分类
- Exception又包含了运行时异常(RuntimeException, 又叫非检查异常)和非运行时异常(又叫检查异常)
- Error是程序无法处理了, 如果OutOfMemoryError、OutOfMemoryError等等, 这些异常发生时, java虚拟机一般会终止线程。
- 运行时异常都是RuntimeException类及其子类,如 NullPointerException、IndexOutOfBoundsException等, 这些异常是不检查的异常, 是在程序运行的时候可能会发生的, 所以程序可以捕捉, 也可以不捕捉. 这些错误一般是由程序的逻辑错误引起的, 程序应该从逻辑角度去尽量避免。
检查异常是运行时异常以外的异常, 也是Exception及其子类, 这些异常从程序的角度来说是必须经过捕捉检查处理的, 否则不能通过编译. 如IOException、SQLException等。
二、RuntimeException常见的异常有哪些
1. NullPointerException - 空指针引用异常
当应用程序试图在需要对象的地方使用
null
时,抛出该异常什么场景会出现:
调用null对象的方法。
- 访问或修改null对象的域。
- 如果null是一个数组,并获取null的长度。
- 如果null对象是一个对象数组,并访问会修改null对象的子元素
-
2. classnotfoundexception
解释是"指定的类不存在",这里主要考虑一下类的名称和路径是否正确即可。
什么场景会出现:
是否使用了重复的类库,且版本不一致,导致低版本被优先使用
- 类名错了,在调用class类中的forname方法时会出异常,很明显,我的是在调用classloader的loadclass方法时出错
-
3. .ArrayIndexOutOfBoundsException
是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围
4. ClassCastException - 类型强制转换异常
什么场景会出现:
5.IllegalArgumentException- 传递非法参数异常
什么场景会出现:
方法传递的参数如果涉及到类型转换,如果转换的不是自己想要的格式会出现这种情况
6.IArithmeticException - 算术运算异常
什么场景会出现:
7.IndexOutOfBoundsException - 下标越界异常
什么场景会出现:
一个ArrayList数组中没有元素,而你想获取第一个元素,运行是就会报此类型的错误
8.INumberFormatException - 数字格式异常
在页面向controller传参时用String接收的参数,但是数据库实体中jies接收该参数时是int类型
三、throw和throws的区别
throw:
- 表示方法内抛出某种异常对象
- 如果异常对象是非 RuntimeException 则需要在方法申明时加上该异常的抛出 即需要加上 throws 语句 或者 在方法体内 try catch 处理该异常,否则编译报错
- 执行到 throw 语句则后面的语句块不再执行
- throws:
- 方法的定义上使用 throws 表示这个方法可能抛出某种异常
- 需要由方法的调用者进行异常处理
四、自定义异常
(1)继承 Exception 或 RuntimeException
/**IllegalAgeException:非法年龄异常,继承Exception类*/
class IllegalAgeException extends Exception {
//默认构造器
public IllegalAgeException() {
}
//带有详细信息的构造器,信息存储在message中
public IllegalAgeException(String message) {
super(message);
}
}
(3)使用异常
class Person {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) throws IllegalAgeException {
if (age < 0) {
throw new IllegalAgeException("人的年龄不应该为负数");
}
this.age = age;
}
public String toString() {
return "name is " + name + " and age is " + age;
}
}
public class TestMyException {
public static void main(String[] args) {
Person p = new Person();
try {
p.setName("Lincoln");
p.setAge(-1);
} catch (IllegalAgeException e) {
e.printStackTrace();
System.exit(-1);
}
System.out.println(p);
}
}