Java异常机制
异常机制Exception
什么是异常
-
检查型异常:
-
运行时异常:
(1/0、ClassNotFound找不到类、NullPoint空指针、UnKnowType未知类型转换、下标越界异常)
-
错误ERROE:由虚拟机生成并抛出,在应用程序的控制和处理能力之外
(AWT、JVM虚拟机异常(StackOverFlow栈溢出、OutOfMemory内存溢出))
异常体系结构
Java把异常当作对象来处理
异常处理
-
抛出异常
-
捕获异常
-
异常处理关键字:try、catch、finally、throw、throws
1 //try,catch,finally 2 public class Test { 3 public static void main(String[] args) { 4 5 int a = 10; 6 int b = 0; 7 8 try { //try监控区域 9 System.out.println(a/b); 10 }catch (ArithmeticException e){ //catch捕获异常 catch(要捕获的异常类型) 11 e.printStackTrace(); //可以有多个catch,但要注意异常由小到大捕获 12 }finally{ //处理善后工作 13 System.out.println("end"); 14 } 15 //finally可以不要,一般用于执行IO流、资源等的关闭操作 16 //idea快捷键:选中当前行->code->Surround with 17 } 18 } 19 //throw,throws 20 public class Test { 21 public static void main(String[] args) { 22 try { 23 new Test().test(1,0); 24 } catch (ArithmeticException e) { 25 e.printStackTrace(); 26 } 27 //捕获异常后程序可以继续执行下去,不会因为异常而停止 28 } 29 30 //throws只是声明此方法可能抛出的异常,具体的抛出由throw进行 31 //如果方法内部已经捕获了异常,则不需要方法再抛出异常 32 public void test(int a,int b) throws ArithmeticException{ 33 //System.out.println(a/b); 34 if (b == 1){ 35 throw new ArithmeticException(); //主动抛出异常,一般在方法中使用 36 } 37 } 38 }
自定义异常
继承Exception类即可自定义异常
1 //自定义异常类:继承Exception 2 public class MyException extends Exception{ 3 //传入的参数 4 private int detail; 5 6 //异常类的构造器 7 public MyException(int a){ 8 this.detail = a; 9 } 10 11 //toString:异常的打印信息 (为什么这里要重载toString?) 12 @Override 13 public String toString() { 14 return "MyException{" + "detail=" + detail + '}'; 15 } 16 } 17 =========================================================== 18 //测试程序 19 public class Test { 20 21 //可能存在异常的方法 22 static void test(int a) throws MyException{ 23 if(a>10) throw new MyException(a); 24 System.out.println("OK"); 25 } 26 27 public static void main(String[] args) { 28 try { 29 test(11); 30 } catch (MyException e) { 31 //这里可以增加一些处理异常的代码 32 e.printStackTrace(); 33 } 34 } 35 }
实际应用中的经验总结
-
处理运行异常时,采用逻辑合理规避,同时辅助try-catch处理
-
多重catch后可以加一个catch(Exception),处理可能被遗漏的异常
-
对于不确定的代码也可以用try-catch处理潜在的异常
-
尽量去处理异常,而不是简单的调用printStackTrace()打印输出
-
记得添加finally释放占用的资源