java异常学习整理

来源:互联网 发布:黑白网络官网 编辑:程序博客网 时间:2024/05/21 07:03
java 异常
体系结构:
java.lang.Object
|---java.lang.Throwable
|---java.lang.Error 错误。java程序对此无能为力,不显示的处理
|---java.lang.Exception 异常。需要进行处理
|---RuntimeException 运行时异常
|---ArrayIndexOutOfBoundsException 数组下标越界异常 NullPointerException 空指针异常 ArithmeticException 算术异常 ClassCastException 类型转换异常
|---非RuntimeException 编译时异常


导致异常的可能原因:
客户输入数据化的格式
读取的文件是否存在
网络是否始终保持畅通


Java程序在执行过程中所发生的异常事件可分为两类:
Error:Java虚拟机无法解决的严重问题,如JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。
Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。
如:空指针访问
试图读取不存在的文件
网络连接中断


异常的解决方法:1.终止运行
2.编写时,考虑到错误的检测,错误消息的提示,以及错误的处理。


分类:编译时异常:执行javac.exe命令时
 运行时异常:执行java.exe时


编写的是.java 文件 ,通过编译(javac命令)生成字节码文件(.class)再运行(java命令)生成结果


当执行一个程序时,若出现异常,则异常之后的代码不再执行了


异常的处理 代码详见HandleException
java采用异常处理机制,将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简介,并易于维护


Java提供的是异常处理的 抓抛模型
1.抛
2.抓:抓住上一步抛出来的异常类的对象,如何抓,即为异常处理的方式
java提供了两种方式用来处理一个异常类的对象
方式一:
try{
可能出现异常的代码
}catch(Exception1 e){
处理的方式1
}catch(Exception2 e){
处理的方式2
}
finally{
一定要执行的代码
}
注:
1.try中声明的变量相当于局部变量,出了try语句就没有作用了
2.catch语句内部是对异常对象的处理,有两种方法
getMessage()或者 printStackTrace()
3.finally是可选的,可有可无,按需选择
4.可以有多个catch语句,try中抛出的异常类对象从上往下去匹配catch中的异常类的类型,一旦满足就执行catch中的代码,执行完,就跳过后面的多条catch语句

5.如果异常处理了,后面的代码继续执行


下面是一些测试代码,仅供参考

package exception;import org.junit.Test;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.util.Date;import java.util.InputMismatchException;import java.util.Scanner;/** * author:kangshengjie * date:2017/7/7 * 处理异常 * Java提供的是异常处理的 抓抛模型 * 1.抛:当我们执行代码时,一旦出现异常,就会在异常的代码处生成一个对应的异常类型的对象,并将此对象抛出。 *    一旦抛出此异常类的对象,那么程序就终止执行 *    此异常类的对象抛给方法的调用者。 * 2.抓:抓住上一步抛出来的异常类的对象,如何抓,即为异常处理的方式 *   java提供了两种方式用来处理一个异常类的对象 *   try{ * *   }catch(){ * *   } */public class HandleException {    @Test    public void test1(){        Scanner s =new Scanner(System.in);        try{            int i = s.nextInt();            System.out.println(i);        }catch (InputMismatchException e){            System.out.print("出现类型不匹配的异常了");        }    }    //常见的运行时异常    /**     * 1.数组下标越界的异常     * java.lang.ArrayIndexOutOfBoundsException     */    @Test    public void test2(){        try{            int[] i =new int[10];            System.out.println(i[10]);//只有0-9        }catch (Exception e){            System.out.print("出现异常");//            e.printStackTrace();        }    }    /**     * 2.算术异常     * java.lang.ArithmeticException: / by zero     */    @Test    public void  test3(){        try {            int i=10;            System.out.print(i/0);        } catch (Exception e) {//            e.printStackTrace();            System.out.print(e.getMessage());        }    }    /**     * 3.类型转换异常     * java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String     */    @Test    public void test4(){        try {            Object obj = new Date();            String str = (String)obj;        } catch(ClassCastException e){            //catch语句从上向下依次执行,一旦符合要求了,就不再进入其他catch            System.out.println("类型转换异常");        } catch(Exception e) {//            e.printStackTrace();            System.out.print("什么异常我都收");        }    }    /**     * 4.空指针异常     *  java.lang.NullPointerException     */    @Test    public void test5(){//        Person p ;//        p = null;//        System.out.print(p.toString());        try {            String str = "aa";            str = null;            System.out.print(str.length());        } catch (Exception e) {            e.printStackTrace();        }    }    class Person{    }    /**     * 编译时异常     * (有异常未处理)     */    @Test    public void test6 (){        FileInputStream file = null;        try{//异常处理            file =new FileInputStream(new File("F:\\workspace\\hello.txt"));            int b;            while((b = file.read())!=-1){                System.out.print((char)b);            }//            file.close();        }catch(FileNotFoundException e){            System.out.print(e.getMessage());        }        catch (IOException e){            e.printStackTrace();        }        finally {            try {                file.close(); //流一定要关,所以放在了finally里卖弄            } catch (IOException e) {                e.printStackTrace();            }        }    }}