黑马程序员---IO异常

来源:互联网 发布:mac外置光驱安装win7 编辑:程序博客网 时间:2024/06/05 21:57
  ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
                                                                          第一讲 异常概述
一,异常概述:

  1.我们以前在开发中,遇到一些情况:代码编译通过,运行时,产生了错误,在控制台打印了一些信息,之后我们的程序就终止了。
  2.就好像,我们一个人,在生活过程中,突然发生了一些疾病,我们可以选择去医院就医,就医之后,我们可以继续健康的生活下去。
  3.我们回想一下,我们的以前的程序,曾经出现的一些状况:
  1.空指针异常:
  2.数组下标越界;
  3.算数运算异常:整数除法,除数为0;
  4.当我们的程序发生上述异常情况时,默认情况下,虚拟机会在控制台打印一些信息,然后程序会终止。
  5.我们由于一些小的失误,导致程序可能会出现一些异常状况,这个时候,程序终止是我们不希望看到的。就好像我们生了一些小病,
    也希望去医院看好,然后继续健康的活下去。
  6.Java为我们提供了一种机制:异常处理机制。
    允许我们去监控我们的可能会出现异常的代码,如果出现了异常情况,Java虚拟机会
    允许我们去处理这样的情况。处理了之后,使得我们的程序可以健康的继续运行下去。
二,异常的分类
  1.对于程序中可能会出现的异常,Java早期进行汇总,并把所有可能会出现的的"异常状况",都封装成了一个"异常类",
    也就是"每一个异常情况"会使用一个"异常类"来描述。
  2.在这个"异常类"中,最重要的,里面有个"异常信息"。
  3.后期Java将这些"异常类"进行汇总,并进行"共同点"的抽取,最终形成了一个"体系结构"--同"集合"一样。
  4.Java中异常类的"体系结构":
  java.lang.Throwable(类):Throwable 类是 Java 语言中所有错误或异常的超类。
  |--错误:Error:代表了虚拟机运行期间遇到的一些不可挽回的一些情况。所以这种错误,我们可以不用捕获。
  |--异常:Exception:代表了异常。我们主要是捕获这种异常。如果发生了这样的异常,我们可以去捕获,虚拟机
                                就不会停掉我们的程序。
                         |--运行时异常:RuntimeException和它的子类的异常;
                         |--非运行时异常:除了RuntimeException,其它的异常都是非运行时异常;
三,JVM默认处理异常的方式
  
  当虚拟机发现了一个异常情况:
  1.要辨识出是什么样的异常;除数为0;
  2.在类库中,找到"描述这个异常的类":ArithmeticException
  3.将这个"异常类"实例化一个对象。
  4.在控制台打印异常信息:
  格式:
  Exception in Exception in thread "main" XXX(异常类型):异常信息(封装在异常类中的)
  at XXXXXX(异常出现的位置)
  5.之后,将我们的程序结束掉。
                                 第二讲 Java中异常处理
一,Java中异常处理的方案:

  1.之前我们说过,可以对某些可能会出现异常的代码进行"监控",如果一旦出现异常情况,虚拟机可以
   去执行我们的"异常处理程序",最重要的是,会使得我们的程序可以继续健康的运行下去;
    
  2.异常处理的基本语法:
  try{
  //可能会出现异常的代码
  }catch(异常类型名称   变量名){
  //可以将catch中的代码称为:异常处理程序
  //如果try中的代码发生异常,那么虚拟机会执行catch中的代码
  }
  3.执行顺序:
  1.执行try中的代码;
  2.如果try中的代码没有异常,不会执行catch中的代码,会继续执行"try...catch"语句的后续代码;
  3.如果try中的代码出现了异常,会立即执行catch中的代码。如果catch中的代码执行完毕,会执行"try...catch"语句的后续代码;
public class Demo {
public static void main(String[] args) {
int a = 10;
int b = 0;
try{
System.out.println("a / b : " + (a / b));
System.out.println("try中的后续代码......");
}catch(ArithmeticException e){
System.out.println("不好,发生异常了,这里是catch中的代码,会被执行!");
}
System.out.println("程序结束");
}
}
二,try...catch的方式处理异常2--多catch格式
  1.我们的一段程序,经常会有可能发生"多种异常";
  2.我们可以对每个异常专门写try...catch进行监控;
  3.但是这样写出来,代码显得有些冗长,我们可以将多条可能出现异常的代码放到一个try中,
    然后可以使用多个catch()去分别处理每种异常;
  4.处理过程:
  1).执行try中代码;
  2).如果发生异常,Java虚拟机会判断时什么类型的异常。然后去类库中封装相应类型的"异常类";
  3).在你的多个catch中找一个""类型匹配"的catch()去执行。
  4).如果某个catch执行完毕,不会回到try中了。会继续执行"try...catch..."的后续语句;
  
  5.多catch语句语法:
  try{
  }catch(异常类型1      变量名){
  }catch(异常类型2      变量名){
  }catch(异常类型3      变量名){
  }
  6.注意:多catch语句中的"异常类型"如果是同级别的,那么没有顺序关系;(*******重点注意事项*******)
       但如果存在"子父类"关系,"父类"级别的一定要放在最下边。
       
  7.什么时候用"多组的try...catch"?什么时候使用"一个try,多个catch"?
    1.如果一个try...多个catch结构,在try中的代码,如果前面的代码出现异常,而后面的代码仍然需要被执行,
      这时就要改成"多组的try...catch"语句。
三,多catch的基本语法:
  try{
  }catch(异常类型1      变量名){
  }catch(异常类型2      变量名){
  }catch(异常类型3      变量名){
  }
  
  JDK7之后,提供了一种新语法:
  try{
  }catch(异常类型1 | 异常类型2  | 异常类型3  e){
  }
  注意:异常类型必须是平级的,用|(或)符号隔开,不能出现"父类级别"的异常类型;
                                       第三讲 运行时异常和非运行时异常
一,运行时异常和非运行时异常;

  Throwable(类):
  |--Error:表示错误。我们不用处理;
  |--Exception:表示异常
  |--RuntimeException:运行时异常:编译时可以不处理,运行时会抛出的异常;
  |--除RuntimeException类型的其它异常:非运行时异常:编译期就要处理的异常,否则编译不通过。尤其是一个方法内,如果
                 产生了一个"非运行时异常",调用方 必须去处理这个异常,否则不能通过编译。
                                                      第四讲 Throwable
一,Throwable的几个常见方法:

  1.Throwable中的方法,也就意味着所有的"异常对象"所应具有的方法;
  2.当虚拟机扑捉到一个异常后,会执行某个catch,当执行catch时,会将这个类型的"异常对象"传入到catch中,
    catch的小括号内的异常类型声明,就是用来接收这个异常对象的。
  3.Throwable中的常用方法:
   String getMessage():获取异常信息,返回字符串。
   String toString():获取异常类名和异常信息,返回字符串。
   void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。(后期会非常频繁的使用)
                                          第五讲 throws
一,throws的方式处理异常

  
  1.我们经常在一个"方法"内编写很多代码,这些代码可能会产生异常;
  2.在一个"方法"中给我们很多的方式去处理异常:
  方式一:使用try...catch:效果跟在main中使用try...catch是一样的。
  方式二:在方法声明时,可以使用throws关键字,表示"我这个方法可能会抛出这样的异常";
  1).throws后面可以跟多个"异常类型"的声明,使用逗号隔开;
  2).如果throws后面声明的是"运行时异常",调用方可以捕获,可以不捕获。不捕获时,如果发生异常,由虚拟机去处理;
                         如果throws后面声明的是"非运行时异常",调用方必须捕获,或抛出(如果在main中调用,就不建议抛出)。
  3.注意:在main中不要再抛出了,再抛就抛给虚拟机了,它来处理,就是打印异常信息,然后终止程序运行;
二,throw:
  1.它用于在方法体内,显示的抛出一个"异常对象";
  2.它的作用同throws一样,当出现这样的异常时,同样抛出给"调用者";
  3.throw一个异常,也就相当于"方法返回",后续代码将不会被执行。
  4.throw一个运行时异常:
  1).方法可以不声明throws;
  2).调用者,可以捕获,也可以不捕获;
    throw一个非运行时异常:
    1).方法声明处,必须显示的使用throws声明抛出这个异常;
    2).调用者,必须捕获。否则不能通过编译;
    
    
   throws和throw的区别:
   1.使用位置:
    throws:用在方法声明时,在方法体上声明,表示我要抛出某种类型的异常;
    throw:用在方法体内。表示抛出某种类型的异常对象;
   2.throws后面跟的是"异常类的类名",可以有多个,用逗号隔开;
     throw后面跟"异常对象",只能有一个。
三,finally关键字的特点及作用
  1.finally关键字,用于"异常处理"的语句中。
  2.它一般用于try后或try...catch后;
  3.特点:在finally语句块中的代码,无论是否出现异常,都会被执行;
  一般操作一个文件包括三个流程:打开文件、读写文件、关闭输入输出流;
  try{
  System.out.println(”打开文件");
  System.out.println(”读取文件");//出现异常
 
  return 一个值;
  }catch{
  System.out.println("异常处理");
  }finally{
  System.out.println(”关闭文件");//此操作将不会被执行;
  }
  4.无论是否发生异常,finally中的语句肯定会被执行:
  执行顺序:
    无异常:try --> finally
    有异常:try --> catch  --> finally
                                                  第六讲 File类
一,1.它不能读写文件的内容;

   2.它代表了硬盘上的一个文件或目录;
   3.一个File对象,可以获取这个文件或目录的一些属性信息:
  1.创建时间;
  2.大小;
  3.是否可读;
  4.是否可写
  ......
  它不能读写文件的内容:
  
  构造方法:
  
  public File(String pathname):使用pathname去构造一个文件或目录;pathname可以是"绝对路径",也可以是相对路径;
  public File(String parent,String child):使用父目录,及子目录/子文件构造一个File
  public File(File parent,String child):使用父级的File目录对象,和子目录/子文件的名称构造一个File
  
  注意:
  1.使用相对目录和绝对目录都可以;
  2.文件或目录是否存在都可以
二, 创建功能
  首先要确定一点:一个File对象,可以代表一个文件,也可以代表一个目录;
  public boolean createNewFile():创建一个文件
  public boolean mkdir():创建单级目录
  public boolean mkdirs():创建多级目录;


三, File类的删除功能: 
  1.public boolean delete():删除文件和单级目录。不能一次性删除多级目录
  注意:此删除,不进Windows的回收站,直接删除。
  public class Demo {
public static void main(String[] args) {
File file = new File("test.txt");

System.out.println("删除文件:" + file.delete());

File file2 = new File("aaa");//目录
System.out.println("删除目录aaa:" + file2.delete());

File file3 = new File("bbb\\ccc\\ddd");//此命令只删除ddd目录。
System.out.println("删除多级目录:" + file3.delete());

//如果想删除多级目录,那么需要一级一级的单独删除;
//后面我们将学到"递归"
}
}
四, 重命名功能
  public boolean renameTo(File dest):将当前的文件或目录 重命名为dest所代表的文件和目录 
  可以重命名在相同目录下,
  也可以重命名到其它目录下,相当于一个剪切操作,并进行重命名;
  public class Demo {
public static void main(String[] args) {
File file1 = new File("D:\\aaa\\hello.txt");

File file2 = new File("D:\\aaa\\hello_rename.txt");

System.out.println("重命名:" + file1.renameTo(file2));

//将file2重命名到项目根目录下,名称为:my_hello.txt
File file3 = new File("my_hello.txt");
System.out.println("重命名file2 : " + file2.renameTo(file3));
}
}
五,File类的判断功能
  public boolean isDirectory():是否是个目录
  public boolean isFile():是否是个文件
public boolean exists():是否存在;
public boolean canRead():是否可读
public boolean canWrite():是否可写
public boolean isHidden():是否隐藏
六,基本获取功能
public String getAbsolutePath():获取绝对路径
public String getPath():获取File所代表的路径
public String getName():获取文件或目录的名称
public long length():文件或目录 的大小(单位:字节)
public long lastModified():最后修改时间(单位:毫秒)
七,File类的高级获取功能
  public String[] list():获取当前目录下的所有文件和目录的名称的String[]数组
  public File[] listFiles():
八,File中的list()和listFiles()两个方法都有两个重载的方法,它们能够接收一个"文件过滤器" 
 public String[] list(FilenameFilter filter):
 public File[] listFiles(FilenameFilter filter):
0 0
原创粉丝点击