异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。
三种类型:
引入了异常处理框架 -->
在Exception分支中有一个重要的子类RuntimeException(运行时异常)
等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。如果不处理,运行时程序会自动停止;若捕获进行处理,则程序可继续执行
这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常
Error和Exception的区别:
Error通常是灾难性的致命错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
抛出异常
捕获异常
异常处理五个关键字
try, catch, finally, throw, throws
try 监控程序代码块可能的异常
catch(想要捕获的异常类型)
finally 无论程序是否有异常都执行,一般处理善后工作
Note: 假设要捕获多个异常,范围要从小到大!否则会提示类型已被覆盖
example:
public static void main(String[] args) { int a = 1; int b = 0; try{ //try监控区域 System.out.println(a/b); }catch (Error e) { System.out.println("Error"); }catch (Exception e) { System.out.println("Exception"); }catch(Throwable t){ //Throwable 可以捕获error和exception System.out.println("Throwable"); }finally { System.out.println("Finally"); } //finally 可以不要finally, 关闭IO 内存等资源 }
Idea快捷键: ctrl+alt+t 可选择代码块将statement包裹起来
关键字 throw
一般在方法中使用
public static void main(String[] args) { new Test2().testThrow(1,0); } public void testThrow(int a, int b){ if(b == 0){ //throw throws throw new ArithmeticException(); //主动抛出异常 throw } } //运行结果 /* Exception in thread "main" java.lang.ArithmeticException at com.exception.Test2.testThrow(Test2.java:13) at com.exception.Test2.main(Test2.java:7) */
关键字throws
假设这方法中处理不了这个异常,则需要在方法上抛出异常
public void testThrow(int a, int b) throws ArithmeticException{ if(b == 0){ ... } }
例:
//自定义异常类 public class MyException extends Exception{ //传递数字>10 则抛出异常 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){ System.out.println("MyException=>"+e); } } }