Throwable主要分为两大类,Error和Exception
Error(错误),代表JVM本身的错误,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等,不能被程序员所编写的代码处理,结果只有一个,那就是退出程序,无法处理
Exception(异常),表示程序可以处理的异常,可以捕获且可能恢复,分为两大类,运行时异常(RuntimeException)和编译时异常。
常见的运行时异常:
ClassCastException: 类型转换异常,当试图将对象强制转换为不是实例的子类时,抛出该异常;
ArrayIndexOutOfBoundsException: 数组下标越界异常,当你使用不合法的索引访问数组时会抛出该异常;
NullPointerException: 空指针异常,需要对象的地方使用null会抛出该异常;
ArithmeticException: 算术运算异常,比如除数为0,抛出该异常;
NumberFormatException: 数字转换异常,当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常;
处理异常的两种方式:
异常在发生时,就会生成(new)一个异常类对象,并抛出,如果没有被捕获,就会一直向上抛
1.try...catch...
try {
} catch (Exception e) {
e.printStackTrace();
//getMessage() 返回异常信息(String类型)
//printStackTrace() 追踪堆栈异常信息,打印异常类名和异常信息,以及异常出现在程序中的位置。返回值void
}finally{
//....
}
1) try不管有没有发生异常,都会去执行finally
2)可以将多个异常声明在一个catch中
try{ //要求父类异常在后,子类异常在前
}catch(Exception1){
}catch(Exception2){
}
try{
} //jdk8新特性,要求父类异常在后,子类异常在前
catch(Exception1 | Exception2 | Exception3 e) {
}
3)finally是必须执行的(只要try执行,finally就执行)且必须是最后执行的 ,下面是关于return和finally的两种情况
try{
int i = 0;
i += 100;
return i;
}catch{
}finally{
i += 9;
}
//return 109
try{
int j = 0;
j += 100;
return j;
}catch{
}finally{
j += 9;
return 0; //如果finally中也有return,则finally的return会覆盖上面的return
}
// return 0
只有一种情况可以不去执行finally,那就是System.exit(0);
try {
System.out.println("try...");
// 退出JVM
System.exit(0); // 退出JVM之后,finally语句中的代码就不执行了!
} finally {
System.out.println("finally...");
}
2.throws
直接抛给方法的调用者 ,自己不具备处理异常
3.自定义异常:throw
首先,编写一个类继承 Exception
(编译异常)或者 RuntimeException
(运行异常)。然后创建两个构造器,一个有String参 , 一个无参
public class Test000 {
public static void main(String[] args) {
int age = 800;
if(age>120||age<0)
throw new AgeException("年龄错误");
System.out.println("年龄正确");
}
}
class AgeException extends RuntimeException {
public AgeException () {
}
public AgeException (String message) {
super(message);
}
}