day_19——异常
异常机制
异常是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程。设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而阻断或产生不可预见的结果。
Java语言使用异常处理机制为程序提供了异常处理的能力
异常分类(Throwable:异常的基类)
1.错误(error):JVM系统内部错误或资源耗尽等严重情况 -- 属于JVM需要负担的责任这一类异常事件无法恢复或不可能捕获,将导致应用程序中断。
2.异常(Exception):其它因编程错误或偶然的外在因素导致的一般性问题。这类异常得到恰当的处理时,程序有机会恢复至正常运行状况。
Exception分类:
(数组越界、空指针、类型转换错误)
1、非受检(unchecked)异常(运行时异常 RuntimeException):编译器不要求强制处置的异常。一般是指编程时的逻辑错误。是程序员应该积极避免其出现的异常java.lang.RuntimeException及它的子类都是非受检异常:
占内存溢出:递归、创建对象、static修饰属性、final修饰属性
错误的类型转换:java.lang.ClassCastException
数组下标越界:java.lang.ArrayIndexOutOfBoundsException
空指针访问:java.lang.NullPointerException
算术异常(除0溢出):java.lang.ArithmeticException
2、受检(checked)异常 --- 一般性异常:编译器要求必须处置的异常。指的是程序在运行时由于外界因素造成的一般性异常。
没有找到指定名称的类:java.lang.ClassNotFoundException
访问不存在的文件:java.io.FileNotFoundException
操作文件时发生的异常:java.io.IOException
操作数据库时发生的异常:java.sql.SQLException
异常处理机制
1、Java程序在执行过程中如果出现异常,会自动生成一个异常类对象,该异常对象将被自自动提交给JVM,这个过程称为抛出(throw)异常。
2、当JVM接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常和处理异常。
3、如果JVM找不到可以捕获异常的代码,则运行时系统将终止,相应的Java程序也将退出。
1、捕获异常(try ... catch ... ):
try{
...代码块1...
}catch(异常类型 e){
...代码块2...
}finally{
...代码块3...
}
理解:
代码块1:存放可能要发生的异常代码
发生异常:生成异常对象,提交到JVM
catch-捕获异常类型
运行代码块2---> 处理异常的代码
执行代码块3--->finally里的代码不管发没发生异常,都会被执行
ps:从语法结构的角度去看待,有没有finally代码块都可以
public class Test01 { @SuppressWarnings("null") public static void main(String[] args) { /** * 处理异常方式一:try..catch.. * 语法结构: * try{ * ...代码块1... * }catch(异常类型 e){ * ...代码块2... * }finally{ * ...代码块3... * } * 理解: * 代码块1:存放可能要发生的异常代码 * 发生异常:生成异常对象,提交到JVM * catch-捕获异常类型 * 运行代码块2---> 处理异常的代码 * 执行代码块3--->finally里的代码不管发没发生异常,都会被执行 * ps:从语法结构的角度去看待,有没有finally代码块都可以 */ String str = null; try { boolean equals = str.equals("123"); System.out.println("1111111"); System.out.println("2222222"); } catch (NullPointerException e) { System.out.println("出现空指针异常"); str = new String(); }finally{ boolean equals = str.equals("123"); System.out.println(equals); } public class Test02 { public static void main(String[] args) { FileInputStream fis = null; FileOutputStream fos = null; try{ fis = new FileInputStream("上原亚衣.avi"); fos = new FileOutputStream("copy.avi"); byte[] b = new byte[1024]; int len; while((len = fis.read(b)) != -1){ fos.write(b,0,len); } }catch(FileNotFoundException e){ System.out.println("文件未找到异常"); }catch (IOException e) { System.out.println("IO异常"); }finally { if(fis != null){ try { fis.close(); } catch (IOException e) { } } if(fos!=null){ try { fos.close(); } catch (IOException e) { } } } } }
两种异常的处理方式一样,就可以这样编写:
catch (NullPointerException | ArithmeticException e) {
System.out.println("异常出现了");
}
2、throws抛出异常类型,一般与下面的结合
public class Test01 { public static void main(String[] args) { /** * throws:抛出异常 */ try { method01(); } catch (FileNotFoundException e) { } } public static void method01() throws FileNotFoundException{ method02(); } public static void method02() throws FileNotFoundException{ method03(); } //抛出异常,在哪里调用,就在那里处理异常 public static void method03() throws FileNotFoundException{ FileInputStream fis = new FileInputStream("xxx"); } }
3、throw抛出单个具体异常对象
public class Test01 { public static void main(String[] args) { /** * throw:手动抛出异常 * 和自定义异常类相关 */ Scanner scan = new Scanner(System.in); int a = scan.nextInt(); int b = scan.nextInt(); try { if(b == 0){ //手动抛出异常 throw new MyException(); } } catch (MyException e) { System.out.println(e); b = 1; } System.out.println(a/b); } } public class MyException extends Exception{ private static final long serialVersionUID = -8888922175971705495L; @Override public String toString() { return "除数不能为0"; } }

浙公网安备 33010602011771号