黑马程序员--Java基础--05--IO流1

来源:互联网 发布:php 爬虫代码 编辑:程序博客网 时间:2024/06/15 23:59

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一.异常处理:

1.JVM默认处理异常的方式:

 1).发现异常;

 2).识别异常;

 3).封装异常对象:在类库中找到对应的"异常类",并实例化此类的对象

 4).向控制台打印异常信息:

    Exception in thread "main" java.lang.ArithmeticException: / by zeroat cn.itcast.demo15_JVM默认是如何处理异常的.Demo.main(Demo.java:7)

 5).将我们的程序结束;


2.基本语法:try...catch

1).try{

     //可能会出现异常的代码

   }catch(异常类型 变量名){

     //如果出现异常了,告诉JVM怎么做--JVM会执行这里面的代码;

     //一般情况下我们在这里做什么:

     1.开发阶段:可以打印异常异常信息,有助于调试;

     2.程序交付使用后:将错误信息写入日志文件;后期供开发人员维护升级使用;

   }


 2). 异常处理机制的执行流程:

           1.执行try中的代码

           2.如果没有发生异常,执行完try后,不执行catch,跳过catch直接执行后续语句;

            如果发生异常:

                 A.JVM先识别异常;

                 B.JVM封装异常;

                C.看我们的代码,有没有相应的catch语句,而且要匹配catch中的"异常类型";

     D.如果匹配到,执行此catch种的代码,执行完毕后,执行catch的后续语句;


<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入一个整数:");try{int n = sc.nextInt();System.out.println(n);}catch(InputMismatchException e){sc = new Scanner(System.in);}System.out.println("程序结束");}}</span>

3.多catch:try...catch...catch...catch

 1).一段代码可能会产生多种异常;

 2).我们可以写一个try语句,后面跟多个catch语句,表示捕获多种异常;

     try{

      //可能会出现异常的代码

     }catch(异常类型1 变量名){

      //如果发生"异常类型1"异常时,会执行这里的代码

     }catch(异常类型2 变量名){

      //如果发生"异常类型2"异常时,会执行这里的代码

     }catch(异常类型3 变量名){

      //如果发生"异常类型3"异常时,会执行这里的代码

     }

  3).注意:

 多catch种的异常类型,可以是"同级别"异常类型,不分先后顺序,也可以是"子父"异常类型;

  如果是"子父关系"的异常类型,父级别的异常类型,一定要放在catch列表的末尾;

<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {try{int a = 10;int b = 0;System.out.println(a / b);int[] array = {14,2,43};System.out.println(array[3]);String str = null;System.out.println(str.length());//后边还有其他代码,可能产生其它异常;但不知道是具体什么异常了}catch(ArithmeticException e){System.out.println("除数不能为0!");}catch(ArrayIndexOutOfBoundsException e){System.out.println("数组下标越界!");}catch(NullPointerException e){System.out.println("空指针!");}catch(Exception e){System.out.println("发生未知异常,请与系统管理员联系!");}}}</span>

4.JDK7的多catch语句:try...catch(异常类型1 |异常类型2 | 异常类型3  e)

  注意:一定要是"平级关系",不能是"子父关系"

<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {try{int a = 10;int b = 0;System.out.println(a / b);int[] array = {14,2,43};System.out.println(array[3]);String str = null;System.out.println(str.length());//后边还有其他代码,可能产生其它异常;但不知道是具体什么异常了}catch(ArithmeticException | ArrayIndexOutOfBoundsException | NullPointerException  e){System.out.println("空指针!");}catch(Exception e){}}}</span>

5.Throwable的常用方法:

  String getMessage():获取异常信息,返回字符串。

  String toString():获取异常类名和异常信息,返回字符串。

  void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。在调试时,此方法很有用;

<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {int a = 10;int b = 0;try{//System.out.println( a / b);fun1();}catch(ArithmeticException e){//System.out.println("getMessage() : " + e.getMessage());//System.out.println("toString() : " + e.toString());e.printStackTrace();}}private static void fun1() {fun2();}private static void fun2() {fun3();}private static void fun3() {System.out.println(10 / 0);}}</span>
6.方法内处理异常的方式一_throws语句;

 1.总原则:在方法内如果发生异常情况,尽量不要"处理",而是抛给调用者去处理;

 2.抛出的方式有两种:

    1).在方法声明时,在形参列表之后,使用throws关键字,后面跟一个,或多个异常类型名称;

           抛出的异常类型:

    A.运行时异常:调用方 可以不捕获,编译能通过。但是如果真的发生异常,JVM仍然是结束掉程序;

    B.非运行时异常:调用方法必须捕获,或者抛出;

    2).在方法内部,手动的"抛出"一个"异常对象";使用关键字:throw

           抛出的异常类型:

       A.运行时异常:1.方法可以不声明throws此类型异常;2.调用方可以不捕获;

       B.非运行时异常:1.方法声明处,必须显示的throws此类型异常;2.调用方必须捕获或者抛出;

<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {try{//System.out.println(getMax(null));//getMax()方法抛出的是:运行时异常。调用方可以不捕获,编译能通过;//System.out.println(getMax2(null));System.out.println(getMax3(null));}catch(NullPointerException e){System.out.println("异常信息:" + e.getMessage());}String str = "2015-09-20";try {Date date = stringToDate(str);//stringToDate()方法抛出的是:非运行时异常。调用方必须捕获,或者抛出;} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static int getMax(int[] array) throws NullPointerException,ArithmeticException,ArrayIndexOutOfBoundsException{int max = array[0];//产生异常,JVM实例化一个NullPointerException对象;for(int i = 0;i < array.length ; i++){max = array[i] > max ? array[i] : max;}return max;}//将String转换为Datepublic static Date stringToDate(String str) throws ParseException{SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(str);return date;}//测试throwpublic static int getMax2(int[] array){try{int max = array[0];//产生异常,JVM实例化一个NullPointerException对象;for(int i = 0;i < array.length ; i++){max = array[i] > max ? array[i] : max;}return max;}catch(NullPointerException e){e = new NullPointerException("大哥,你给我传了一个空指针!你这是要害我啊!!");throw e;}}public static int getMax3(int[] array) {if(array == null){throw new NullPointerException("空指针异常!");}int max = array[0];//产生异常,JVM实例化一个NullPointerException对象;for(int i = 0;i < array.length ; i++){max = array[i] > max ? array[i] : max;}return max;}}</span>

7.throws和throw的区别;

throws和throw都是用于处理方法内的异常的;而且都是抛出;

 throws :

   1).用在"方法声明处";它表示:此方法"可能"会抛出某种类型的异常;

   2).后面跟的是"异常类型名称",而且可以有多个;

  throw:

    1).用在"方法体内";它表示:真正的抛出一个"异常对象";

   2).后面跟的是"异常对象",只能有一个;

8.到底如何处理异常;

   1).在main()方法内,使用try_catch语句,捕获并且处理异常;

    2).在某个方法内:可以捕获,但不要处理异常,一般都是抛给调用者处理:

   抛出的方式有两种:

    A.throws:

     B.throw:

9.finally语句;

  try{

   //可能会出现异常的代码

 }catch(异常类型 变量名){

//如果出现异常,会被执行的代码;

  }finally{

   //无论是否出现异常,都会被执行的代码;

   //一般,这里用来释放一些很占用空间的"资源";

  }

<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {fun();}public static void fun(){try{int a = 10;int b = 10;System.out.println(a / b);}catch(Exception e){System.out.println("catch");}finally{//无论是否发生异常,这里的代码都会被执行的到;System.out.println("finally");}}}</span>
10.final_finally和finalize的区别;

      final:最终的,可以修饰:

       类:最终类,不能被继承

      方法:最终方法,不能被重写

            变量:拥有最终的值,只能被赋值一次,之后不能被更改:

            基本类型:值不能更改;

                引用类型:地址不能被更改;

     finally:异常处理的关键字。无论是否出现异常,都会被执行的代码块;

     finalize:Object类的一个方法。当垃圾回收器回收此对象空间之前,会调用的一个方法;

11.finally中有return语句

<span style="font-family:Microsoft YaHei;font-size:14px;">finally中有return语句;public class Demo {public static void main(String[] args) {System.out.println(fun());}public static int fun(){int n = 10;try{n = 20;return n;//1.执行return语句,先将20缓存;2.执行finally;3.返回缓存中的值;}catch(Exception e){n = 30;return n;}finally{System.out.println("finally");n = 40;return n;}}}</span>

12.自定义异常;

    1).Java类库中的异常类,不足以满足我们的要求;

    2).有时候我们需要我们自己的异常类型:

  例如:接收一个年龄值,我们业务上要求年龄值必须在:15--50之间;

 3).自定义异常:

   A.自定义类,继承自某个异常类,或者Exception

   B.最好提供一个带String参数的构造方法,用于指定"异常消息";

   C.注意:如果我们的异常类直接继承自Exception,那么我们的异常是:非运行时异常;



<span style="font-family:Microsoft YaHei;font-size:14px;">public class AgeException extends Exception{public AgeException(){super();}public AgeException(String message){super(message);}}</span>

<span style="font-family:Microsoft YaHei;font-size:14px;">class Student{private int age;public void setAge(int age) throws AgeException{if(age < 15 || age > 50){//抛出异常throw new AgeException("年龄必须在15--50之间");}}}</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {Student stu = new Student();try {stu.setAge(10);} catch (AgeException e) {System.out.println("异常了:" + e.getMessage());}}}</span>

13.重写父类方法时的异常处理;

   父类方法不抛出异常:

   子类:1.也可以不抛出;

                 2.可以抛出任何的运行时异常;

                   3.不能抛出任何的非运行时异常;

  父类方法抛出运行时异常:

    子类:1.可以不抛出任何异常;

         2.可以抛出任何的运行时异常;

                3.不能抛出任何的非运行时异常;

 父类方法抛出非运行时异常:

  子类:1.可以不抛出任何异常;

           2.可以抛出任何的运行时异常;

         3.不能抛出比父类更多的非运行时异常;

  综上所述:

 无论父类方法是否抛出任何类型异常:

    子类:1.可以不抛出任何异常;

          2.可以抛出任何的运行时异常;

  如果父类抛出非运行时异常,子类不能抛出比父类更多的非运行时异常;


二.File类:

1.File类概述;

   1).java.io.File(类):代表磁盘上的一个文件或目录:

   2).此类的一个对象,可以获取文件的大小、绝对路径、是否可读、是否可写.....

   3).构造方法:

     public File(String pathname):使用一个String封装的目录构造一个File对象

     public File(String parent,String child):使用父级目录和子目录构造一个File

     public File(File parent,String child):使用File表示的父目录和String的子目录构造一个File

  

    绝对路径:带盘符的全路径的文件名;

    相对路径:指在当前项目运行的目录下;

<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;public class Demo {public static void main(String[] args) {File file = new File("C:\\test\\test.txt");//使用绝对路径构造File file2 = new File("test.txt");//使用相对路径构造File file3 = new File("C:\\test","test.txt");//此对象跟file表示的路径相同;File file4 = new File("C:\\test");File file5 = new File(file4,"test.txt");}}</span>

2.File类创建功能;

  创建功能

  public boolean createNewFile():创建文件

  public boolean mkdir():创建单级目录;

  public boolean mkdirs():创建多级目录;

<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;import java.io.IOException;public class Demo {public static void main(String[] args) {File file = new File("demo30.txt");try {System.out.println("创建文件:" + file.createNewFile());} catch (IOException e) {e.printStackTrace();}File file2 = new File("test\\aaaa");//file2.createNewFile();//建立的仍然是文件System.out.println("创建单级目录:" + file2.mkdir());File file3 = new File("test2\\aaa2\\bbb2\\ccc2");System.out.println("创建多级目录:" + file3.mkdirs());}}</span>

3.File类删除功能;

  public boolean delete():用于删除文件,和"空目录":不走Windows回收站;

  如果是多级目录,或者非空目录,一定要先清理目录下的所有内容后,才能删除,后边我们做练习会使用递归删除;

<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;public class Demo {public static void main(String[] args) {File file = new File("demo30.txt");System.out.println("删除文件:" + file.delete());File file1 = new File("test");System.out.println("删除目录:" + file1.delete());}}</span>

4.重命名功能 

  public boolean renameTo(File dest) 

   相同目录:重命名文件;

   不同目录:剪切,并重命名;

<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;public class Demo {public static void main(String[] args) {File file = new File("C:\\test\\test.txt");//System.out.println("重命名文件:" + file.renameTo(new File("C:\\test\\myFile.txt")));System.out.println("重命名文件:" + file.renameTo(new File("myFile.txt")));}}</span>


5.File类的判断功能:

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

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

  public boolean exists():文件或目录是否存在

  public boolean canRead():是否可读;

  public boolean canWrite():是否可写

  public boolean isHidden():是否隐藏;


<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;public class Demo {public static void main(String[] args) {File file = new File("Myfile.txt");//对于文件名,这里和磁盘上的文件名不区分大小写;System.out.println("是否是一个目录:" + file.isDirectory());System.out.println("是否是一个文件:" + file.isFile());System.out.println("文件或目录是否存在:" + file.exists());System.out.println("是否可读:" + file.canRead());System.out.println("是否可写:" + file.canWrite());System.out.println("是否隐藏:" + file.isHidden());}}</span>

6.基本获取功能

 public String getAbsolutePath():获取绝对路径;

  public String getPath():获取File封装的路径;

   public String getName():获取文件/目录的名称

 public long length():获取文件/目录的大小;单位:字节

 public long lastModified():获取文件/目录的最后修改时间;单位:毫秒

<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;import java.text.SimpleDateFormat;import java.util.Date;public class Demo {public static void main(String[] args) {File file = new File("myFile.txt");System.out.println("绝对路径:" + file.getAbsolutePath());System.out.println("File封装的路径:" + file.getPath());System.out.println("文件名:" + file.getName());System.out.println("文件大小:" + file.length() + " 字节");System.out.println("最后修改时间:" + file.lastModified() + " 毫秒");long time = file.lastModified();Date date = new Date(time);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String str = sdf.format(date);System.out.println("最后修改时间:" + str);}}</span>

7.高级获取功能

public String[] list():获取当前目录下所有的文件、目录的名称;

public File[] listFiles():获取当前目录下所有文件、目录的File数组

这两个方法区别:

1).第一个方法简单的返回了此目录下所有文件/目录的"名称";

2).第二个方法是将目录下的每个文件/目录又封装为一个File对象,并存到一个File[]数组中。

  如果我们需要在获取后,对每个文件需要进一步的操作,可以使用此方法比较方便;

<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {File file = new File("C:\\20150822");String[] fileArray = file.list();for(String s : fileArray){System.out.println(s);}System.out.println("-----------------------------------------------------");File[] fileArray2 = file.listFiles();for(File f : fileArray2){System.out.println(f.getAbsolutePath());}}}</span>

8.输出指定目录下指定后缀名的文件;

 输出C:\\test\\所有的.java文件

  1.封装初始目录:File file = new File("C:\\test");

  2.获取目录下的所有的文件/目录的名称-->File[]数组

  3.遍历File[]数组,分别判断每个File是否是文件:

    是:判断是否.java结尾;

    是:输出:

     否:--

     否:---

<p><span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;</span></p>
<span style="font-family:Microsoft YaHei;font-size:14px;">public class Demo {public static void main(String[] args) {File file = new File("C:\\test");File[] fileArray = file.listFiles();for(File f : fileArray){if(f.isFile() && f.getName().endsWith(".java")){System.out.println(f.getAbsolutePath());}}}}</span>
9.批量修改文件名称案例

  将C:\\20150822\\day18下的所有的avi文件, 存储到:"c:\\20150822\\day18\\avi"目录下; 并且要将原文件名中的所有的"集合框架"字样去掉。

  步骤:

   1.封装原目录:

     2.封装目标目录:

    3.判断目标目录是否存在,如果不存在,则创建;

    4.获取原目录下的所有的.avi文件:使用文件过滤器;

    5.遍历所有.avi文件的数组:

   1).获取每个avi文件的文件名;

   2).将文件名中的"集合框架"字样去掉;

   3).重命名到新目录;

<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;import java.io.FilenameFilter;public class Demo {public static void main(String[] args) {File srcFile = new File("C:\\20150822\\day18");File destFile = new File("C:\\20150822\\day18\\avi\\");//判断目标目录是否存在if(!destFile.exists()){destFile.mkdir();}//获取原目录下所有的.avi文件File[] fileArray = srcFile.listFiles(new FilenameFilter(){@Overridepublic boolean accept(File dir, String name) {File file = new File(dir,name);if(file.isFile() && file.getName().endsWith(".avi")){return true;}return false;}});//遍历数组for(File f : fileArray){//获取原文件名String name = f.getName();//去掉集合框架字样name = name.replace("集合框架", "");f.renameTo(new File(destFile,name));}System.out.println("复制结束!");}}</span>
10.文件过滤器

  在File中还有两个list()和listFiles()的重载方法:

   public String[] list(FilenameFilter filter)

   public File[] listFiles(FilenameFilter filter

<span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.File;import java.io.FilenameFilter;public class Demo {public static void main(String[] args) {File file = new File("C:\\20150822");String[] fileNameArray  = file.list(new FilenameFilter(){@Overridepublic boolean accept(File dir, String name) {//return false;//全不匹配//return true;//全部匹配//写我们自己的匹配逻辑//System.out.println("dir = " + dir + " name = " + name);File file = new File(dir,name);//我们需要确定这个File要是一个文件,所以要构造一个File对象if(file.isFile() && file.getName().endsWith(".java")){return true;}return false;}});for(String s : fileNameArray){System.out.println(s);}}}</span>

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------





 

 

 

 

 

0 0
原创粉丝点击