19. 异常处理与File类

目录

1:异常(理解)

  (2)异常的体系

      (3)异常的处理:

      (4)面试题

2:File类(掌握)

           构造方法

           A:创建功能

           B:删除功能

           C:重命名功能

           D:判断功能

           E:获取功能

           F:高级获取功能

           G:过滤器功能


1:异常(理解)

       (1)程序出现的不正常的情况。

  (2)异常的体系

              Throwable

                     |--Error   严重问题,我们不处理。这种问题一般都是很严重的,比如说内存溢出

                     |--Exception   

                            |--RuntimeException      运行期异常,我们需要修正代码

                            |--RuntimeException 编译期异常,必须处理的,否则程序编译不通过

      (3)异常的处理:

              A:JVM的默认处理

                     把异常的名称,原因,位置等信息输出在控制台,同时会结束程序。

              B:自己处理

                     a:     try...catch...finally的处理格式:

             try{

                   可能出现问题的代码;

            }catch(异常名 变量) {

                    针对问题的处理;

            }finally {

                   释放资源;

            }

 finally:

被finally控制的语句体一定会执行

     注意:如果在执行到finally之前jvm退出了,就不能执行了。

     用于释放资源,在IO流操作和数据库操作中会见到

  变形格式:

            try {

                   可能出现问题的代码;

            }catch(异常名 变量) {

                   针对问题的处理;

            }

  注意:

                A:try里面的代码越少越好

                B:catch里面必须有内容,哪怕是给出一个简单的提示

JDK7出现了一个新的异常处理方案:

            try{

            }catch(异常名1 | 异常名2| ...  变量) {

                   ...

            }

             注意:这个方法虽然简洁,但是也不够好。

                    A:处理方式是一致的。(实际开发中,好多时候可能就是针对同类型的问题,给出同一个处理)

B:多个异常间必须是平级关系。

C:异常中要了解的几个方法:

public String getMessage():异常的消息字符串          

public String toString():返回异常的简单信息描述

                    此对象的类的 name(全路径名)

                    ": "(冒号和一个空格)

             调用此对象

getLocalizedMessage()方法的结果 (默认返回的是getMessage()的内容)

                    printStackTrace()获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。把信息输出在控制台。

 

public class ExceptionDemo {
       publicstatic void main(String[] args) {
              Strings = "2014-11-20";
              SimpleDateFormatsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
              try{
                     Dated = sdf.parse(s); // 创建了一个ParseException对象,然后抛出去,和catch里面进行匹配
                     System.out.println(d);
              }catch (ParseException e) { // ParseException e = new ParseException();
                     //ParseException
                     //e.printStackTrace();
                     //getMessage()
                     //System.out.println(e.getMessage());
                     //Unparseable date: "2014-11-20"
                     //toString()
                     //System.out.println(e.toString());
                     //java.text.ParseException: Unparseable date: "2014-11-20"
                     e.printStackTrace();
                     //跳转到某个指定的页面(index.html)
              }
              System.out.println("over");
       }
}

                     b:throws

                            把自己处理不了的,在方法上声明,告诉调用者,这里有问题

格式:

            throws 异常类名

            注意:这个格式必须跟在方法的括号后面。

 注意:

            尽量不要在main方法上抛出异常。

            但是我讲课为了方便我就这样做了。

 小结:

            编译期异常抛出,将来调用者必须处理。

            运行期异常抛出,将来调用可以不用处理

      (4)面试题

              A:编译期异常和运行期异常的区别?

                     编译期异常必须要处理的,否则编译不通过

                     运行期异常可以不处理,也可以处理

              B:throwthrows是的区别

                     throw:

用在方法体内,跟的是异常对象名

只能抛出一个异常对象名

表示抛出异常,由方法体内的语句处理

throw则是抛出了异常,执行throw则一定抛出了某种异常                   

throws:

用在方法声明后面,跟的是异常类名

可以跟多个异常类名,用逗号隔开

表示抛出异常,由该方法的调用者来处理

throws表示出现异常的一种可能性,并不一定会发生这些异常

       (5)finally关键字及其面试题

              A:finally用于释放资源,它的代码永远会执行。特殊情况:在执行到finally之前jvm退出了

              B:面试题

                     a:final,finally,finalize的区别?

final:        最终的意思,可以修饰类,成员变量,成员方法

                 修饰类,类不能被继承

                 修饰变量,变量是常量

                 修饰方法,方法不能被重写

finally:     是异常处理的一部分,用于释放资源。

                 一般来说,代码肯定会执行,特殊情况:在执行到finally之前jvm退出了

finalize:    是Object类的一个方法,用于垃圾回收

                     b:如果在catch里面有return,请问finally还执行吗?如果执行,在return前还是后

                            会,前。准确的说,应该是在中间。

              C:异常处理的变形

                     try...catch...finally

                     try...catch...

                     try...catch...catch...

                     try...catch...catch...fianlly

                     try....finally

(7)自定义异常

 java不可能对所有的情况都考虑到,所以,在实际的开发中,我们可能需要自己定义异常。

 而我们自己随意的写一个类,是不能作为异常类来看的,要想你的类是一个异常类,就必须继承自Exception或者RuntimeException

  两种方式:

  A:继承Exception

  B:继承RuntimeException

 

public class MyExceptionextends Exception {
       publicMyException() {
       }
       publicMyException(String message) {
              super(message);
       }
}
// public class MyExceptionextends RuntimeException {
//
// }
public class Teacher {
       publicvoid check(int score) throws MyException {
              if(score > 100 || score < 0) {
                     thrownew MyException("分数必须在0-100之间");
              }else {
                     System.out.println("分数没有问题");
              }
       }
       //针对MyException继承自RuntimeException
       //public void check(int score) {
       //if (score > 100 || score < 0) {
       //throw new MyException();
       //} else {
       //System.out.println("分数没有问题");
       //}
       //}
}
 * 自定义异常测试类
public class StudentDemo{
       publicstatic void main(String[] args) {
              Scannersc = new Scanner(System.in);
              System.out.println("请输入学生成绩:");
              intscore = sc.nextInt();
              Teachert = new Teacher();
              try{
                     t.check(score);
              }catch (MyException e) {
                     e.printStackTrace();
              }
       }
}

       (8)异常的注意实现

A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。

B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常

C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throw

2:File(掌握)

       (1)IO流操作中大部分都是对文件的操作,所以Java就提供了File类供我们来操作文件

       (2)File:文件和目录(文件夹)路径名的抽象表示形式

           构造方法

File(Stringpathname)               根据一个路径得到File对象

             File(String parent, String child):    根据一个目录和一个子文件/目录得到File对象

             File(File parent, String child):       根据一个父File对象和一个子文件/目录得到File对象

------------------------------------------------------------------------------------------------------------------------------------------

              A:File file = newFile("e:\\demo\\a.txt");

              B:File file = newFile("e:\\demo","a.txt");

              C:File file = newFile("e:\\demo");

               File file2 = new File(file,"a.txt");

注意:以上三种方式其实效果一样

------------------------------------------------------------------------------------------------------------------------------------------

 

public class FileDemo {
       publicstatic void main(String[] args) {
              //File(String pathname):根据一个路径得到File对象
              //把e:\\demo\\a.txt封装成一个File对象
              Filefile = new File("E:\\demo\\a.txt");
              //File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
              Filefile2 = new File("E:\\demo", "a.txt");
              //File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
              Filefile3 = new File("e:\\demo");
              Filefile4 = new File(file3, "a.txt");
              //以上三种方式其实效果一样
       }
}

       (3)File类的功能

           A:创建功能

public boolean createNewFile():       创建文件 如果存在这样的文件,就不创建了

public boolean mkdir():                   创建文件夹 如果存在这样的文件夹,就不创建了

public boolean mkdirs():                  创建文件夹,如果父文件夹不存在,会帮你创建出来

 

public class FileDemo {
       publicstatic void main(String[] args) throws IOException {
              //需求:我要在e盘目录下创建一个文件夹demo
              Filefile = new File("e:\\demo");
              System.out.println("mkdir:"+ file.mkdir());
              //需求:我要在e盘目录demo下创建一个文件a.txt
              Filefile2 = new File("e:\\demo\\a.txt");
              System.out.println("createNewFile:"+ file2.createNewFile());
              //需求:我要在e盘目录test下创建一个文件b.txt
              //Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
              //注意:要想在某个目录下创建内容,该目录首先必须存在。
              //File file3 = new File("e:\\test\\b.txt");
              //System.out.println("createNewFile:" + file3.createNewFile());
              //需求:我要在e盘目录test下创建aaa目录
              //File file4 = new File("e:\\test\\aaa");
              //System.out.println("mkdir:" + file4.mkdir());
              //File file5 = new File("e:\\test");
              //File file6 = new File("e:\\test\\aaa");
              //System.out.println("mkdir:" + file5.mkdir());
              //System.out.println("mkdir:" + file6.mkdir());
              //其实我们有更简单的方法
              Filefile7 = new File("e:\\aaa\\bbb\\ccc\\ddd");
              System.out.println("mkdirs:"+ file7.mkdirs());
              //看下面的这个东西:
              Filefile8 = new File("e:\\liuyi\\a.txt");
              System.out.println("mkdirs:"+ file8.mkdirs());
       }
}

           B:删除功能

public boolean delete()

注意:

           A:如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。

         B:Java中的删除不走回收站。

         C:要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹

 

public class FileDemo {
   publicstatic void main(String[] args) throws IOException {
          //创建文件
          //File file = new File("e:\\a.txt");
          //System.out.println("createNewFile:" + file.createNewFile());
          //我不小心写成这个样子了
          Filefile = new File("a.txt");
          System.out.println("createNewFile:"+ file.createNewFile());
          //继续玩几个
          Filefile2 = new File("aaa\\bbb\\ccc");
          System.out.println("mkdirs:"+ file2.mkdirs());
          //删除功能:我要删除a.txt这个文件
          Filefile3 = new File("a.txt");
          System.out.println("delete:"+ file3.delete());
          // 删除功能:我要删除ccc这个文件夹
          Filefile4 = new File("aaa\\bbb\\ccc");
          System.out.println("delete:"+ file4.delete());
          // 删除功能:我要删除aaa文件夹
          //File file5 = new File("aaa");
          //System.out.println("delete:" + file5.delete());
          File file6 = new File("aaa\\bbb");
          Filefile7 = new File("aaa");
          System.out.println("delete:"+ file6.delete());
          System.out.println("delete:"+ file7.delete());
   }
}

 

           C:重命名功能

public boolean renameTo(Filedest)

如果路径名相同,就是改名。

如果路径名不同,就是改名并剪切。

             路径以盘符开始:       绝对路径       c:\\a.txt

路径不以盘符开始:    相对路径       a.txt

 

public class FileDemo {
   publicstatic void main(String[] args) {
          //创建一个文件对象
          //File file = new File("林青霞.jpg");
           需求:我要修改这个文件的名称为"东方不败.jpg"
          //File newFile = new File("东方不败.jpg");
          //System.out.println("renameTo:" + file.renameTo(newFile));
          File file2 = new File("东方不败.jpg");
          FilenewFile2 = new File("e:\\林青霞.jpg");
          System.out.println("renameTo:"+ file2.renameTo(newFile2));
   }
}

 

           D:判断功能

public boolean isDirectory():     判断是否是目录

public boolean isFile():             判断是否是文件

public boolean exists():             判断是否存在

public boolean canRead():         判断是否可读

public boolean canWrite():        判断是否可写

public boolean isHidden():        判断是否隐藏

 

public class FileDemo {
   publicstatic void main(String[] args) {
          //创建文件对象
          Filefile = new File("a.txt");
          System.out.println("isDirectory:"+ file.isDirectory());// false
          System.out.println("isFile:"+ file.isFile());// true
          System.out.println("exists:"+ file.exists());// true
          System.out.println("canRead:"+ file.canRead());// true
          System.out.println("canWrite:"+ file.canWrite());// true
          System.out.println("isHidden:"+ file.isHidden());// false
   }
}

           E:获取功能

publicString getAbsolutePath()     获取绝对路径

publicString getPath():                    获取相对路径

publicString getName():                  获取名称

publiclong length():                        获取长度。字节数

publiclong lastModified():               获取最后一次的修改时间,毫秒值

 

public class FileDemo {
   publicstatic void main(String[] args) {
          //创建文件对象
          Filefile = new File("demo\\test.txt");
          System.out.println("getAbsolutePath:"+ file.getAbsolutePath());
          System.out.println("getPath:"+ file.getPath());
          System.out.println("getName:"+ file.getName());
          System.out.println("length:"+ file.length());
          System.out.println("lastModified:"+ file.lastModified());
          //1416471971031
          Dated = new Date(1416471971031L);
          SimpleDateFormatsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
          Strings = sdf.format(d);
          System.out.println(s);
   }
}

 

           F:高级获取功能

public String[]list():                       获取指定目录下的所有文件或者文件夹的名称数组

public File[]listFiles():                    获取指定目录下的所有文件或者文件夹的File数组

 

public class FileDemo {
   publicstatic void main(String[] args) {
          //指定一个目录
          Filefile = new File("e:\\");
          //public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
          String[]strArray = file.list();
          for(String s : strArray) {
                 System.out.println(s);
          }
          System.out.println("------------");
          //public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
          File[]fileArray = file.listFiles();
          for(File f : fileArray) {
                 System.out.println(f.getName());
          }
   }
}

       案例:

  判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称

  分析:

                A:封装e判断目录

                B:获取该目录下所有文件或者文件夹的File数组

                C:遍历该File数组,得到每一个File对象,然后判断

                D:是否是文件

                       是:继续判断是否以.jpg结尾

                              是:就输出该文件名称

                              否:不搭理它

                       否:不搭理它

 

public class FileDemo {
   publicstatic void main(String[] args) {
          //封装e判断目录
          Filefile = new File("e:\\");
          //获取该目录下所有文件或者文件夹的File数组
          File[]fileArray = file.listFiles();
          //遍历该File数组,得到每一个File对象,然后判断
          for(File f : fileArray) {
                 //是否是文件
                 if(f.isFile()) {
                        //继续判断是否以.jpg结尾
                        if(f.getName().endsWith(".jpg")) {
                               //就输出该文件名称
                               System.out.println(f.getName());
                        }
                 }
          }
   }
}

 

           G:过滤器功能

判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称

 A:先获取所有的,然后遍历的时候,依次判断,如果满足条件就输出。

 B:获取的时候就已经是满足条件的了,然后输出即可。

要想实现这个效果,就必须学习一个接口:文件名称过滤器

public String[] list(FilenameFilter filter)

public File[] listFiles(FilenameFilter filter)

 

public class FileDemo2 {
   publicstatic void main(String[] args) {
          //封装e判断目录
          Filefile = new File("e:\\");
          //获取该目录下所有文件或者文件夹的String数组
          //public String[] list(FilenameFilter filter)
          String[]strArray = file.list(new FilenameFilter() {
                 @Override
                 publicboolean accept(File dir, String name) {
                        //return false;
                        // return true;
// 通过这个测试,我们就知道了,到底把这个文件或者文件夹的名称加不加到数组中,取决于这里的返回值是true还是false
                        //所以,这个的true或者false应该是我们通过某种判断得到的
                        //System.out.println(dir + "---" + name);
                        //File file = new File(dir, name);
                         System.out.println(file);
                        //boolean flag = file.isFile();
                        //boolean flag2 = name.endsWith(".jpg");
                        //return flag && flag2;
                        returnnew File(dir, name).isFile() && name.endsWith(".jpg");
                 }
          });
          //遍历
          for(String s : strArray) {
                 System.out.println(s);
          }
   }
}

       (4)案例:

              A:输出指定目录下指定后缀名的文件名称

                     a:先获取所有的,在遍历的时候判断,再输出

                     b:先判断,再获取,最后直接遍历输出即可

              B:批量修改文件名称

 需求:把E:\评书\三国演义下面的视频名称修改为

             00?_介绍.avi

 思路:  A:封装目录

             B:获取该目录下所有的文件的File数组

             C:遍历该File数组,得到每一个File对象

             D:拼接一个新的名称,然后重命名即可。

 

public  class FileDemo {
       public static void main(String[] args) {
              // 封装目录
              File srcFolder = newFile("E:\\评书\\三国演义");
              // 获取该目录下所有的文件的File数组
              File[] fileArray =srcFolder.listFiles();
 
              // 遍历该File数组,得到每一个File对象
              for (File file : fileArray) {
                     // System.out.println(file);
                     // E:\评书\三国演义\三国演义_001_[评书网-今天很高兴,明天就IO了]_桃园三结义.avi
                     // 改后:E:\评书\三国演义\001_桃园三结义.avi
                     String name =file.getName(); // 三国演义_001_[评书网-今天很高兴,明天就IO了]_桃园三结义.avi
                     int index =name.indexOf("_");
                     String numberString =name.substring(index + 1, index + 4);
                     //System.out.println(numberString);
                     // int startIndex =name.lastIndexOf('_');
                     // int endIndex =name.lastIndexOf('.');
                     // String nameString =name.substring(startIndex + 1, endIndex);
                     //System.out.println(nameString);
                     int endIndex =name.lastIndexOf('_');
                     String nameString =name.substring(endIndex);
                     String newName =numberString.concat(nameString); // 001_桃园三结义.avi
                     //System.out.println(newName);
                     File newFile = newFile(srcFolder, newName); // E:\\评书\\三国演义\\001_桃园三结义.avi
                     // 重命名即可
                     file.renameTo(newFile);
              }
       }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

靈熙雲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值