目录
1.异常分类
Thorwable类(表示可抛出)
是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常, 这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
Error
Error是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath等。这些异常
发生时,Java虚拟机(JVM)一般会选择线程终止。
系统级别的异常,产生的原因有:系统崩溃、虚拟机错误、内存溢出等等。
例如:你开车上班途中,出了车祸,没救了。
非运行时异常
就是编译器强制要求我们处理的异常,常见的异常有:IOException、SQLException。
不处理无法同通过编译。
例如:你发烧38度,就必须看医生了。
运行时异常
运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
例如:你得了普通感冒,自己可以不管,也可以去看看医生。
2.处理异常
2.1try{}catch{}finally{} 捕获异常
代码示例:
package ExceptionTest;
//try{}catch{}finally{]语句
public class Demo03 {
public static void main(String[] args) {
System.out.println("大家加油");
try{
int a=2;
int b= 0;
System.out.println(a/b);
int[] arr = new int[3];
System.out.println(arr[4]);
//虽然有两个异常,但是catch到一个异常后,后面的异常也不会去处理。
}catch(ArithmeticException e){
e.printStackTrace();
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
}finally {
System.out.println("武汉加油");
}
System.out.println("中国加油");
}
}
//运行结果:
// 大家加油
// java.lang.ArithmeticException: / by zero
// at ExceptionTest.Demo03.main(Demo03.java:9)
// 武汉加油
// 中国加油
注意:try、catch、finally三个语句块应注意的问题
第一:try、catch、finally三个语句块均不能单独使用,三者可以组成 try...catch...finally、try...catch、try...finally三种结 构,catch语句可以有一个或多个,finally语句最多一个。
第二:try、catch、finally三个代码块中变量的作用域为代码块内部,分别独立而不能相互访问。如果要在三个块中都可 以访问,则需要将变量定义到这些块的外面。
第三:多个catch块时候,最多只会匹配其中一个异常类且只会执行该catch块代码,而不会再执行其它的catch块,且匹 配catch语句的顺序为从上到下,也可能所有的catch都没执行。
第四:先Catch子类异常再Catch父类异常
2.2 throw 抛出异常对象
例如:员工都有员工ID编号 ID编号为6位数字 如果超出6位或者少于6位,那么我们抛出异常。
public void checkPersonId(String id){
if(id.length() == 6){
System.out.println("这是我们的员工");
}else{
throw new IllegalArgumentException("他的ID不是6位");
}
}
2.3 throws 声明异常
throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了非运行时异常,该方法的调用者才必须处理或者重新抛出该异常。
import java.io.File;
import java.io.IOException;
public class Demo07 {
public static void main(String[] args) throws IOException {
Demo07 d1 = new Demo07();
d1.show(); //此处也可以try{}catch{}异常
}
public void show() throws IOException {
File f1 = new File("1.txt");
f1.createNewFile();
}
}
3.自定义异常
实现方式比较简单 自己创建个类 继承Exception或者Exception的相关类
如果希望他是一个运行时异常 那么就继承 RumTimeException
如果希望不是一个运行时异常 那么就可以继承Exception 或者是非RumTimeException
对自定义的类中构造方法进行书写 基本就可以
代码示例:
public class MyException extends Exception{
//构造方法都是用super关键字调用父类的构造方法
public MyException() {
super();
}
public MyException(String message){
super(message);
}
public MyException(String message,Throwable te){
super(message, te);
}
public MyException(Throwable te){
super(te);
}
//剩下里面的其他代码 就是要看你的需求是什么
}