异常体系结构
6、异常处理机制 6.1、java中异常的作用是:增强程序健壮性。
6.2、 java中异常以类和对象的形式存在。
快捷键
Ctrl+Alt+T Surround With
e.printStackTrace(); 打印错误的栈信息
主动抛出异常
throw new ArithmeticException();
自定义异常
//自定义异常 public class MyException extends Exception{ private int detail; public MyException(int a) { this.detail = a; } //toString:异常的打印信息 @Override public String toString() { return "MyException{" + "detail=" + detail + '}'; } } //测试异常 public class Test { static void test(int a) throws MyException { System.out.println("传递的参数为"+a); if(a>10) { throw new MyException(a);//抛出异常 } System.out.println("OK"); } public static void main(String[] args) { try { test(11); } catch (MyException e) { //e默认为toString方法 System.out.println("MyException=>"+e); //尽可能地去处理异常 //尽量添加finally 语句块去释放占用的资源 //e.printStackTrace(); } } }
一般main方法中的异常建议使用try catch进行捕捉。main就不要继续上抛了。不然抛给JVM如果出现异常会终止程序。
谁调用它,就谁可以抛出。
如果是正确的,则不会有异常,不会终止程序
哪里出异常之后,下面的程序都不执行了。然后往上抛出
只要异常没有捕捉,采用上报的方式,此方法的后续代码不会执行。
JDK8新特性可以采取或的方式
System.exit(0);退出虚拟机
final 修饰的类无法继承,final修饰的方法无法覆盖,不能重新赋值;
自定义异常
两步
1.编写一个类继承Exception(表示编译时的,大多数情况)或者RuntimeException(表示运行时的,小部分情况)
2.提供两个构造方法,一个是有参数的,一个是无参数的;
这里我用绝大多数情况,编译时的异常 public class MyException extends Exception{ public MyException(){ } public MyException(String s){ super(s); } }
参考文档: https://blog.youkuaiyun.com/qq_26230421/article/details/79734370
二、常见的编译时异常
编译时的异常抛出后一般都是在类上throw new 异常名字,而不是trycatch;
1.FileNotFoundException
2.ClassNotFoundException
3.SQLException
4.NoSuchFieldException
5.NoSuchMethodException
6.ParseException
三、常见的运行时异常
1.NullPointerException
2.ArithmeticException
3.ClassCastException
4.ArrayIndexOutOfBoundsException
5.StringIndexOutOfBoundsException
养成这种编程风格,不要啥都是return;sout;抛异常直接解决了这两点
方法覆盖的遗留问题
重写后的子类的方法不能比父类抛出更宽泛的异常 ,但可以更少。
class Animal{ public void doSome(){ } } class Cat extends Animal{ public void doSome() throw Exception{ //这样是不行的,父类不抛,子类不能抛 } }