12.异常机制

来源:互联网 发布:淘宝V6会员网贷 编辑:程序博客网 时间:2024/05/21 17:01
1.异常是什么?
  (1)异常模拟的是现实世界中不正常事件
  (2)Java中采用类去模拟异常
  (3)类是可以创建对象的 异常是类 
 2.异常机制作用?

    程序发生异常事件后,为我们输出了一些信息,程序员可以根据信息处理,使程序更加健壮

3.异常继承结构


 4.处理异常有两种方式
        1.声明抛出 throws

2.捕捉  try...catch...

5.声明抛出:在方法声明的位置上使用throws关键字向上抛出异常

 
import java.io.*;public class test01{                                              //IOException  Excetion 都可以public static void main(String[] args)throws FileNotFoundException{//创建文件输入流,读取文件FileInputStream fis = new FileInputStream("D:/java程序/text.txt");}}//以上程序不通过/* test01.java:12: 错误: 未报告的异常错误FileNotFoundException; 必须对其进行捕获或声明以便抛出        FileInputStream fis = new FileInputStream("D:/java程序/text.txt");                              ^  */

          深入throws

import java.io.*;public class test01{public static void main(String[] args)throws FileNotFoundException{//真正的处理try{m1();}catch(FileNotFoundException e){}System.out.println("hello world");}//使用throws处理异常并不是真正的处理异常,而是推卸责任//谁调用就会抛给谁//上面的m1方法如果出现了异常,因为采用的是上抛,给了JVM,JVM遇到这个异常就会退出JVM,下面的这个代码不会执行public static void m1()throws FileNotFoundException{m2();}public static void m2()throws FileNotFoundException{m3();}public static void m3()throws FileNotFoundException{FileInputStream fis = new FileInputStream("c:/test");}}//在程序运行过程中发生了FileNotFoundException类型异常//JVM为我们创建了一个FileNotFoundException类型的对象//JVM负责将该对象的信息打印到控制台//并且JVM停掉了程序的运行(所以没有输出hello world)/*throws后结果:D:\java程序\static>java test01Exception in thread "main" java.io.FileNotFoundException: c:\test (系统找不到指定的文件。)        at java.io.FileInputStream.open0(Native Method)        at java.io.FileInputStream.open(Unknown Source)        at java.io.FileInputStream.<init>(Unknown Source)        at java.io.FileInputStream.<init>(Unknown Source)        at test01.m3(test01.java:12)        at test01.m2(test01.java:11)        at test01.m1(test01.java:10)        at test01.main(test01.java:6)try...catch 后结果:hello world*/

6.捕捉

       (1).语法:
       try{
  可能出现异常的代码
  }catch(异常类型1 变量){
      处理异常的代码;
  }catch(异常类型2 变量){
  处理异常的代码;
  }...
(2).catch语句块可以写多个
(3).但是从上到下catch,必须从小类型异常到大类型异常进行捕捉
        (4).try..catch 中最多执行一个语句块,执行后就结束了

import java.io.*;public class test01{public static void main(String[] args){try{//程序执行到此发生了FileNotFoundException错误//JVM会自动创建一个FileNotFoundException类型的对象,将该对象的内存地址赋值给catch语句块中的e变量FileInputStream fis = new FileInputStream("C:/abc");    //上面的代码出现了异常,try语句块不再继续执行,直接进入catch语句块执行System.out.println("hello world");fis.read();}catch(FileNotFoundException e){System.out.println("读取的文件不存在");//FileNotFoundException将Object中的toString方法重写System.out.println(e);//java.io.FileNotFoundException: C:\abc (系统找不到指定的文件。)}catch(IOException e){System.out.println("其它IO异常");}}}

7.e.printStackTrace() 和 e.getMessage()

import java.io.*;public class test01{public static void main(String[] args){try{FileInputStream a = new FileInputStream("c:/abc");}catch(FileNotFoundException e){    e.printStackTrace();//打印异常堆栈信息,一般情况下使用该方式调用String message = e.getMessage();System.out.println(message);//没有上一个方法详细}System.out.println("hello world");}}/*输出结果:java.io.FileNotFoundException: c:\abc (系统找不到指定的文件。)at java.io.FileInputStream.open0(Native Method)at java.io.FileInputStream.open(Unknown Source)at java.io.FileInputStream.<init>(Unknown Source)at java.io.FileInputStream.<init>(Unknown Source)at test01.main(test01.java:6)c:\abc (系统找不到指定的文件。)hello world*/

8.关于finally语句块
   1.finally语句块 可以直接和try语句块联用 try...finally...
   2.try...catch...finally也可以
   3.在finally中的代码一定会执行

public class test01{public static void main(String[] args){ int i = m1(); System.out.println(i);//10}static int i =10;static int m1(){try{return i;}finally{i++;System.out.println("m1的i:"+i);//11}}}/*结果:m1的i:11      10以上代码执行原理:try{int temp = i;return temp;}finally{i++;System.out.println("m1的i:"+i);}*/

9.final finalize finally的区别?

final:     final可以用来修饰类,修饰的类无法被继承  

               可以用来修饰方法,修饰的方法无法被覆盖  

               修饰的局部变量一旦赋值不可再改变,修饰的成员变量需手动赋值 ,与static连用称为常量

finalize:   是Object内的一个方法的名字,垃圾回收器在回收Java对象之前,会先自动调用Java对象的finalize方法

finally:   异常处理机制中的finally语句块

10.自定义"无效名字"异常:
  1.编译时异常,直接继承Exception
  2.运行时异常,直接继承RuntimeException

public class test01 extends Exception//编译时异常  //public class test01 extends RuntimeException运行时异常{//定义异常一般提供两个构造方法public test01(){}public test01(String msg){  super(msg);}}

//顾客相关业务public class CustomerService{public void register(String name)throws test01{//完成注册if(name.length<6){//异常//创建异常对象并手动抛出异常throw new test01("用户名长度不能少于六位");}//如果代码能执行到此处证明用户名是合法的System.out.println("");}}

//模拟注册public class test{public static void main(String[] args){//假如用户提供的用户名如下String username = "jack"//注册     CustomerService cs = new CustomerService(); try{cs.register(username);}catch(test01){ System.out.println(e.getMessage()); }}}