一、基本概念
二、异常分类
发生Error,属于严重问题,程序只能奔溃
三、为什么要有异常处理机制?
比如以下代码:
public class Exception_1 {
public static void main(String[] args) {
int num1=10;
int num2=0;
int res=num1/num2;//当程序执行到num1/num2时,因为num2=0,程序就会抛出异常
//抛出异常后,程序就会退出,奔溃了,下面的代码不再执行
System.out.println("程序继续运行....");
}
}
发生一点小错误,程序就会当场崩溃退出,后面的代码也不执行,这是我们不希望看见的,我们希望即使有些小错误,程序能能跑完。
所以,Java的开发者提供了异常处理机制
public class Exception_1 {
public static void main(String[] args) {
int num1=10;
int num2=0;
try {
int res=num1/num2;
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("程序继续运行....");
}
}
有异常,抛出去,继续执行下面代码 。对于错误(Error),程序只能奔溃。
四、五大运行时异常
1.空指针异常
public class NullPointerException {
public static void main(String[] args) {
String name=null;
System.out.println(name.length());
}
}
2.数学运算异常
public class Exception_1 {
public static void main(String[] args) {
int num1=10;
int num2=0;
int res=num1/num2;
}
}
3.数组下标越界异常
public class Exception {
public static void main(String[] args) {
int[] arr = new int[4];
System.out.println(arr[4]);
}
}
4.类型转换异常
public class Exception {
public static void main(String[] args) {
A b = new B();
B b1 = (B) b;
C b2 = (C) b;
}
}
class A {
}
class B extends A {
}
class C extends A {
}
5.数字格式不正确异常
public class Exception {
public static void main(String[] args) {
String name = "123456";
int a = Integer.parseInt(name);
System.out.println(a);
}
}
以上可正常转
以下就会出现异常
public class Exception {
public static void main(String[] args) {
String name = "shdjkahsf";
int a = Integer.parseInt(name);
System.out.println(a);
}
}
五、编译异常
六、异常处理方式
1.try-catch-finally
如果你把父类异常写在子类异常的前面,父类异常都处理完了,后面的子类异常写出来也没有意义
执行到int n=num1 / num2;就有异常了,此时没有处理,因为是main方法,默认抛出给JVM,但是有finally,所以只能强撑着执行完finally块中的代码,然后打印异常信息,程序奔溃;
2.throws
throws处理方式就是把异常向它的调用者抛,调用者可以选择try-catch掉,也可以选择继续向上抛。 如果说一直抛到最高层的调用者JVM,JVM的处理异常方式为,输出异常信息,立刻中断程序退出。
如果某个方法有异常,则可以选择try-catch掉或者抛给方法的调用者处理,编译异常必须显性处理,不可默认处理(throws)
编译异常需显性处理,不写throws和try-catch则使用默认处理,也就是throws
对于运行时异常,不需要程序员显性处理,因为有默认处理机制
方法f3( )后面其实是默认处理机制,隐藏了throws ....
七、自定义异常
自定义异常的步骤:
一般情况下,我们都是继承RuntimeException,使用默认处理机制;
举个自定义异常的例子:
当我们接收age时,要求范围在18-120之间,否则抛出一个自定义异常,并给出提示信息;
public class CustomException {
public static void main(String[] args) {
int age=180;
if (age<18||age>120){
throw new AgeException("年龄范围有误");
}
}
}
class AgeException extends RuntimeException{
public AgeException(String message) {
super(message);
}
}