java SE day16 火推

来源:互联网 发布:我是歌手有网络直播吗 编辑:程序博客网 时间:2024/05/16 17:48

异常处理

异常结构中 表示范围最大的是  Throwable类 , 他有两个子类: Error 和 Exception我们要处理的是 Exception(异常) . Error(错误) 无法处理, 只能尽量避免 !

Exception ***

运行时异常 (非受检异常)(RuntimeException):  程序在执行过程中, 因为逻辑问题, 产生了异常 !非运行时异常(受检异常) :  编译器可检测异常 , 在编写代码进行javac操作时,  提示的异常 !

RuntimeException *****

当程序遇到异常时, 如果不对其进行异常处理, 程序会异常终止 !
try catch语句块 *****
我们可以在异常产生时, 通过try块捕获异常 , 通过catch块处理异常 如果try块捕获的异常, 与catch块声明的接收异常类型都不同, 则与没有异常处理一致!格式:  try{    //异常捕获代码块,     //在这里的代码 出现异常后, 会自动捕获异常    //忽略try块后续代码, 立即,将异常传递到catch块中进行处理    //如果未产生异常, 则忽略catch块}catch(异常类型1 异常名1){}catch(异常类型2 异常名2){    ...}catch(异常类型n 异常名n){}关于多个catch块中异常声明的规则:     类型越大的(父类异常) , 越靠后 !    例如:    try{        ....    }catch(NumberFormatException e){    }catch(Exception e){    }

特殊的判断结构

如果try块的最后一句代码能正确执行 , 则表示try块未产生异常 !    try {        int i = Integer.parseInt("0");        System.out.println("如果这里执行了, 表示没有产生异常!");    }catch(Exception e) {        System.out.println("如果这里执行了, 表示产生异常!");    }

为什么出现了异常以后, 会在控制台打印异常的堆栈信息

原因在于, 出现了异常后,  我们并未自行进行处理, jvm帮我们执行了输出到控制台的处理方式 !

finally ***

是异常的统一出口 ! 无论在任何的情况下, 只要代码进入了try块中, finally块必然会执行!需要注意:     哪怕在try 或 catch块中执行了return , 也阻挡不了finally的执行----------------------------------------------我们一般在这里执行什么样的操作:     一般用来执行资源释放的操作(硬件软件资源) !格式:  try{}catch(){}finally{    // 无论上述的代码块 是否产生了异常,  最后finally都会执行 !}

面试题:*****

观察如下代码,finally中的打印语句 会执行吗 ? public static int numberFormat(String text) {    try {        int i = Integer.parseInt(text);        return i;    }catch(NumberFormatException e) {        e.printStackTrace();        return 0;    }finally {        System.out.println("程序执行完毕, 已经转换了一个数字");    }}答:     只要代码执行了try块, 那么finally必然会执行, 无论是否有return操作!

throws **

在程序中, 我们对于异常 并非只能捕获, 还可以将其进行抛出操作 , 留待后续调用时再处理 !异常的抛出, 必须在方法上声明格式:      方法名()throws 抛出的异常类型{    }例如:     public static int numberFormat(String text)throws NumberFormatException{        int i = Integer.parseInt(text);        return i;    }当调用一个抛出了异常的方法时, 如果抛出的类型属于RuntimeException或它的子类, 则不会在调用处提示;如果调用的方法 抛出了一个 受检异常 , 则编译器 会强制我们进行处理 !如果将异常抛出到main方法上, 则表示将异常交给jvm去处理 !  会造成程序的异常终止 !

主动创建一个异常, 并扔出去**

异常类型 对象名 = new 异常类型();throw 异常对象名;异常的构造方法:      无参构造: 创建一个异常对象,  不包含异常的消息内容一参构造器 ,    参数1. 传入的是字符串类型的值, 表示异常的消息 !案例:    public void setAge(int age)throws RuntimeException {        /**         * 如果传入 的年龄范围不在0-150之间, 则抛出异常         */        if(age<0||age>150) {            // 创建一个异常对象, 将其扔出去            AgeExceptionNiFengLe e = new AgeExceptionNiFengLe("你是不是萨 , 年龄传入的有问题, 请检查");            throw e;        }        this.age = age;    }

继承一个异常类, 实现自定义异常*

继承异常类后, 不建议重写任何方法!   仅编写两个构造方法即可, 一个是无参构造器, 一个是一参字符串的构造器 !案例:     public class AgeExceptionNiFengLe extends RuntimeException {        public AgeExceptionNiFengLe() {            super();        }        public AgeExceptionNiFengLe(String message) {            super(message);        }    }

关于方法的重写 与异常的问题

父接接口中的方法, 或 父类中的方法声明的抛出异常, 子类在进行重写时, 子类扔出的异常 不能大于 父类扔出的异常 !并且 子类扔出的异常 ,不能是额外的异常 (不属于父类声明范围内的)总结:  只能扔出 父类声明异常的类型, 或父类声明异常类型的子类 !

IO

File类

文件或文件夹 在JAVA 中的抽象表示形式在创建对象时, 文件可以是不存在的 !

常用构造方法

1.  File(File parent,String child); ***    参数1. 表示父文件夹File对象    参数2. 表示子文件的文件名称(包含后缀名)2.  File(String parent,String child);   *    参数1. 表示父文件夹的路径    参数2. 表示子文件的文件名称(包含后缀名)3.  File(String pathName);  *****    参数1. 表示文件的路径

常用方法

booolean createNewFile()    当对象表示的文件不存在时, 创建文件且返回true , 如果文件已存在, 不会执行操作 ,直接返回falseboolean mkdir()    创建一层目录 boolean mkdirs() ***     创建此对象表示的目录 , 包括所有目录中必须有,但不存在的父路径 !boolean delete();    删除此对象表示的文件或文件夹  boolean exists()*    测试此文件或者文件夹是否存在  , 存在则返回true, 不存在则返回falseString getAbsolutePath(); **    获取文件或目录的绝对路径long length():*    获取文件的大小长度 (byte为单位)long lastModified():    文件最后一次被修改的时间String getName()***    返回文件或文件夹的名称(如果是文件,包含后缀名)String getPath()    返回文件的路径boolean isFile()*    判断当前对象表示的是否是文件, 是文件则返回true, 文件夹则返回falseString[] list()    返回当前文件夹中所有的直接子文件与直接子文件夹的文件名!File[] listFiles() ***    返回当前文件夹中, 所有的直接子文件/直接子文件夹的  File对象File getParentFile()    获取直接父文件夹的file对象renameTo(File newFile)给一个文件重新命名, 可以通过这个方式, 对其实现剪切的操作

练习:

扫描电脑的D盘 , 输出盘下的所有的文件与文件夹!  使用递归来完成设计一个方法 , 这个方法 具备如下功能:  形式参数, 要求传入一个File数组, 我们对这个File数组进行遍历 , 判断每一个File对象是否是文件, 如果是文件, 则输出其文件名称 , 文件最后修改时间, 文件的大小如果是文件夹, 则输出文件夹名称, 并通过文件夹的listFiles方法 获取所有子文件与子文件夹public static void printFiles(File[] files){    for(File file:files){        if(file.isFile()){            //这是一个文件            System.out.println("发现一个文件:文件名称:"+file.getName()+",最后一次修改:"+file.lastModified()+",文件的大小:"+file.length());        }else{            //这是一个文件夹            System.out.println("发现了一个文件夹, 文件夹的名称:"+file.getName()+",正在准备遍历内部文件");            File[] files2 = file.listFiles();            printFiles(files2);        }    }}
原创粉丝点击