16 异常机制和File类

325 阅读5分钟

1 异常机制

  • 异常是指java程序执行过程中发生的不正常情况
  • Java.lang.Throwable类是java语言中错误(Error)和异常(Exception)的超类
  • Error类主要是描述java虚拟机无法解决的严重错误,这是无法通过编程解决的错误
  • Exception类主要是描述编程错误或偶然外部因素导致的轻微错误,可以通过编程解决

Java.lang.Exception是所有异常的超类,可以分为两大类:

  1. RuntimeException运行时异常(非检测性异常)
  2. IOException和其他异常统称为其他异常,也可以称为检测性异常,这类异常通常在编译阶段就会被检测出异常

RumtimeException类的主要子类有:

  • ArithmeticException类 算术异常
  • ArrayIndexOutOfBoundsException类 数组下标越界异常
  • NullPointException类 空指针异常
  • ClassCastException类 类型转换异常
  • NumberFormatException类 数字格式异常

注意:当程序执行过程中发生异常,但又没有进行手动处理异常,异常就会交给jvm虚拟机处理,jvm虚拟机处理异常的默认方式是打印异常名称、异常发生的原因、异常发生的位置以及终止程序

异常避免的方式:使用if条件判断来避免异常,这样做也带来了另一个问题,那就是当异常很多的时候,就会有过多的if判断语句,这样会使代码显得冗余,且代码可读性很差

2 异常的捕获

异常捕获的语法格式是: try{

​ 可能发生异常的代码;

​ }

​ catch(异常类型 引用变量名){

​ 处理异常的代码;

​ }

​ finally{

​ 无论是否发生异常都会执行的代码;

​ }

针对异常的捕获,需要注意以下几点:

  • 编写多个catch分支时,小类型异常应该放在大类型异常的前面
  • finally一般用于进行善后处理,如:关闭已打开的文件

观察下面代码,给出代码执行流程:

try{
    a;
    b;//可能发生异常的语句
    c;
}catch(Exception ex ){
    d;
}finally{
    e;
}

当未发生异常时,代码执行流程是:abce

当发生异常时,代码执行流程是:abde

异常捕获中finally的笔试考点:分析下面代码的返回值是多少

try{
    a;
    b;//可能发生异常的语句
    return 0;
}catch(Exception ex ){
  d;
  return 1;
}finally{
  return 2;
}

最后的返回结果是:2

3 异常的抛出

异常除了上面异常捕获这种处理方式外,还可以通过异常抛出处理异常,所谓异常抛出就是在无法处理异常或不方便处理异常时,可以选择将异常转移给该方法的调用者处理,这种方式就被称为异常的抛出。当方法执行时出现异常,底层会生成一个异常类对象抛出,此时异常代码的后续代码就不再执行。

异常的抛出的语法格式:访问权限 返回值类型 方法名称(形参列表)throws 异常类型1,异常类型2,.........{方法体;} 实例 public void run() throws Exception{ }

方法重写的原则:

  • 要求方法名、参数列表以及返回值类型都相同,从jdk1,5开始支持返回子类型
  • 要求方法的访问权限不能变小,可以变大或者相同
  • 方法重写后不能抛出比之前还大的异常或抛出平级不一样的异常,可以抛出更小的异常或不抛出异常

关于异常的处理有以下几点建议:

  • 当父类中被重写的方法没有抛出异常时,则子类重写的方法只能进行异常的捕获处理
  • 当一个方法内部又以递进方式分别调用了好几个其他方法,则建议这些方法内可以使用抛出的方法处理到最后一层进行捕获方式处理。

4 自定义异常

当在程序中出现想抛出的异常,java官方并未给出此类异常时,就需要我们自己自定义异常,来对这特殊的异常进行描述。

自定义异常的步骤:

  1. 自定义xxxException异常类继承Exception类或者其子类。
  2. 提供一个无参构造方法和一个字符串作为参数的构造方法
  3. 在需要抛出异常的地方写上 throw new 自定义异常类型(实参);如 throw new AgeException("年龄不合理!")

java中采用的异常处理机制是异常处理的程序代码集中起来,与正常的代码分开,使得程序简洁,便于维护

5 File类

Java.util.File类主要负责获取文件或目录路径相关信息,比如文件名、文件大小

File类的常用方法:

方法声明功能介绍
File(String pathname)根据参数路径名构造对象
boolean exists()判断文件或者目录是否存在
String getName()获取文件的名称
long longth()获取文件的大小
long lastModified()获取文件最后一次修改时间
String getAbsolutePath()获取文件的绝对路径
boolean delete()删除文件,当删除目录时要求是空目录
boolean createNewFile()创建新的空文件
boolean mkdir()创建目录
boolean mkdirs()创建多级目录
File[] listFiles()获取该目录下所有内容
boolean isFile()判断是否为文件
Boolean isDirectory()判断是否为目录
File[] listFiles(FileFilter filter)获取满足筛选器的所有内容

实例代码如下:

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FileTest {
    public static void main(String[] args) throws IOException {
        File file=new File("./java.txt");
        System.out.println(file.exists());
        file.createNewFile();
        System.out.println(file.exists());
        System.out.println("文件大小是:"+file.length());
        System.out.println("文件名称是:"+file.getName());
        long time=file.lastModified();
        Date date=new Date(time);
        SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
        System.out.println("文件修改时间是是:"+sf.format(date));
        System.out.println("文件的绝对路径是:"+file.getAbsolutePath());
        System.out.println(file.delete()?"文件删除成功":"文件删除失败");


    }
}