• 异常 封装错误信息的对象

    • 错误信息
    1. 类型        例如: NullPointerExce 空指针
    2. 提示消息 
    3. 出错的行号
  • 异常的继承结构
    • Throwable
    1. | - Error 系统级错误
    2. | - Exception 可修复的错误
      • | - 其他Exception
      • | - RuntimeException
        • | - NullPointException 空指针
        • | - ArrayIndecOutOfBoundException  1  数组下标1越界
        • | - ArithmeticException 数学异常 
        • | - NumberFprmatException 数字格式异常
        • | - ClassCastException
  • 异常的处理流程

    • 程序错误 , 封装成异常对象 , 抛出异常
    • 如果没有捕获异常的处理
      • 会被JVM 虚拟机接收打印异常信息,并关闭虚拟机
  • 异常的捕获
  • try{
    
    }catch(AException e){// 捕获 A 类型异常
    
    }catch(BException e){// 捕获 B 类型异常
    
    }catch(父类型异常 Exception e){如果有父类型放在最后
    // 放在第一位,只会执行此异常类型,不会执行其异常类型
    }finally{
    // 不管出错不出错,都会被执行
    // 一般用来清理一些资源
    }
  • throws
    • 设置异常的抛出管道
    • 方法中要抛出异常, 必须存在对应类的抛出管道
    • 在任何方法上都有默认的异常管道: RuntimeException 
    • RuntimeException 及其子类异常,都可以从默认管道抛出
    • 不是RuntimeException类型的异常必须写对应的异常抛出管道
    • private static void f() throws ParseException, IOException {
      
      }
  •  RuntimeException 及其子类型都有默认的抛出管道
    • 非检查异常,编译器编译代码时, 不会检查RuntimeException异常
    • 检查异常 (非 RuntimeException )
      • 编辑器编辑代码是, 会检查是否捕获异常或添加了管道
      • 都没有,会编译失败
  • throw
    • 手动抛出异常
    • 执行异常的抛出动作
    •                if (b == 0) {
      // 新建异常对象, 括号里面可以添加错误信息字符串
      ArithmeticException e =
      new ArithmeticException("不能除0");
      // 抛出异常到调用位置
      throw e;
      }
  • 异常包装

    • 捕获的异常,包装成其他有抛出管道类型,再抛出
    • 使用场景
      • 不能抛出的异常,包装成能抛出的异常类型再抛
      • 异常简化,减少异常管道数量
    • 重写方法的异常管道, 不能比父类方法异常管道多,且不能不同于父类的异常管道
    •         Collections.sort(list, new Comparator<String>() {
      
                  @Override
      public int compare(String o1, String o2) { try {
      SimpleDateFormat sdf =
      new SimpleDateFormat("yyy-MM-dd");
      Date d1 = sdf.parse(o1);
      Date d2 = sdf.parse(o2);
      return d1.compareTo(d2);
      } catch (ParseException e) {
      // TODO Auto-generated catch block
      throw new RuntimeException(e);
      } } });
  • 自定义异常
    • 继承RuntimeException 不用写异常管道
    • 继承Exception 需要写异常管道
    • 使用
      • 起一个合适的类名, 见名知意
      • 选择一个合适的父类,一般用Exception,RuntimeException
      • 添加合适的构造方法
    • /*
      * 继承 Exception 需要写异常管道抛出
      */
      public class UserNameNotFoundException extends Exception { public UserNameNotFoundException() {
      super();
      // TODO Auto-generated constructor stub
      } public UserNameNotFoundException(String message, Throwable cause, boolean enableSuppression,
      boolean writableStackTrace) {
      super(message, cause, enableSuppression, writableStackTrace);
      // TODO Auto-generated constructor stub
      } public UserNameNotFoundException(String message, Throwable cause) {
      super(message, cause);
      // TODO Auto-generated constructor stub
      } public UserNameNotFoundException(String message) {
      super(message);
      // TODO Auto-generated constructor stub
      } public UserNameNotFoundException(Throwable cause) {
      super(cause);
      // TODO Auto-generated constructor stub
      } } // 使用
      public class Test1 {
      public static void main(String[] args) { System.out.println("输入用户名和密码");
      String n = new Scanner(System.in).nextLine(); System.out.println("密码");
      String p = new Scanner(System.in).nextLine(); try {
      login(n,p);
      System.out.println("欢迎登陆");
      } catch (UserNameNotFoundException e) {
      System.out.println("用户名不存在");
      }catch (WrongPasswordException e) {
      System.out.println("密码错误");
      }
      } private static void login(String n, String p) throws UserNameNotFoundException, WrongPasswordException { if (!n.equals("abc")) {
      throw new UserNameNotFoundException();
      } if (!p.equals("123")) {
      throw new WrongPasswordException();
      } }
      }
      
      
       


  • IO  input output (输入输出)
  • Java.io 包
    • File
    • RandomAccessFile
    • InputStream/OutputStream
    • FileInputStream/FileOutStream
    • BufferedInputStream/BufferedOutputStream
    • ObjectInputStream/ObjectOutputStream
    • Reader/Writer
    • IputStreamReader/OutputStreamWrite
  • File    封装磁盘路径字符串

    • 文件路径
    • 文件夹路径
    • 不存在的路径
    • 作用
      • 可以获得文件或者文件夹的属性
        • length(); 文件字节量,对文件夹无效
        • lastModified(); 最后修改时间, 毫秒值
        • getName(); 文件名
        • getParent(); 父目录
        • getAbsolutePath();磁盘完整路径
        • isExists(); 是否存在
        • isFile();是否是文件
        • isDirectory();是否是文件夹
        •         //path = "/Users/dingzhijie/Desktop/ceshi.txt"; // 存在的文件
          //path = "/Users/dingzhijie/Desktop/ceshi222"; // 存在的文件夹
          path = "d:dgv"; // 不存在的路径 File file = new File(path);
          System.out.println(path); System.out.println(file.exists());
          System.out.println(file.length());
          System.out.println(file.isFile());
          System.out.println(file.isDirectory());
      • 可以创建删除文件和文件夹
        • creatNewFile();创建文件,

          • 必须保证创建文件的文件夹是存在的
        • mkdirs();创建多层文件夹
        • delete();删除文件,或者空文件夹
        •         // 创建文件夹
          File dir =
          new File("/Users/dingzhijie/Desktop/ccc");
          if (!dir.isDirectory()) {
          dir.mkdirs();
          } // 创建文件
          File file =
          new File("/Users/dingzhijie/Desktop/cc.txt");
          if (!file.isFile()) {
          file.createNewFile();
          } // 删除文件夹
          if (dir.exists()) {
          dir.delete();
          } // 删除文件
          if (file.exists()) {
          file.delete();
          }
        • File.creatTempFile();创建临时文件(静态方法)
          • 系统资源紧张的时候,或者管家也会清理临时文件
          • \Users\wanght\AppData\Local\Temp
        •        /*
          * 参数: 前缀, 至少三个字符
          * 参数: 后缀, 可以不写 null 会自动添加
          */
          File file =
          File.createTempFile("abc", ".txt");
          System.out.println(file);



      • 对文件夹进行列出所有文件
        • list();

          • 文件.文件夹名称字符串数组
        • listFiles();
          • 文件.文件夹封装的 File 数组
      •        /*
        * 如果目录不存在,不能列表
        * 或者目录无权访问,也不能列表
        */
        String[] fileNameArr = dir.list();
        File[] listFiles = dir.listFiles(); System.out.println(Arrays.toString(fileNameArr)); for (File file : listFiles) {
        System.out.println(file.getName());
        }


    • 求目录中文件的总大小
    • public class Test5 {
      public static void main(String[] args) {
      File dir = new File("/Users/dingzhijie/Desktop/未命名文件夹"); if (dir.isDirectory()) {
      long size = dirLength(dir);
      System.out.println(size);
      }
      } private static long dirLength(File dir) { /*
      * [a]
      * | - b
      * | - c
      * | - [d]
      *
      * 对dir 目录列表
      * 吧 列表文件和文件夹大小加一起
      */ File[] listFiles = dir.listFiles(); if (listFiles == null) {
      return 0;
      } // 累加变量
      long sum = 0; for (File file : listFiles) {
      if (file.isDirectory()) {
      sum += dirLength(file);
      // 文件夹递归求子文件夹大小
      }else {
      sum += file.length();
      // 文件直接累加
      }
      } return sum; }
      }
  •  RandomAccessFile
    • control+h  切换文本和数字
    •  有一个下标, 读写下标位置的字节值
    • 每读写一个字节值, 下标会自动向后移动
    • 下标可以任意定位
    • 创建对象
      • new RandomAccessFile(文件,"r"); // 只读
      • new RandomAccessFile(文件,"rw"); // 读写
    • 方法
      • write(int b);

        • int 的 四个字节, 只输出末尾的一个
        • 所以只输入 255 范围内的值
      • write(byte[]);
        • 输出数组中,全部字节值
      • write(byte[], start, length);
        • 输出数组中, 从 start 位置开始的 length 个字节值
    • package day1204;
      
      import java.io.IOException;
      import java.io.RandomAccessFile; public class Test1 {
      public static void main(String[] args) throws IOException { /*
      * 如果文件不存在, 自动新建文件
      * 如果文件夹不存在, 会报异常
      */
      RandomAccessFile raf =
      new RandomAccessFile("/Users/dingzhijie/Desktop/UE_file1", "rw"); raf.write(97);
      raf.write(98);
      raf.write(99);
      raf.write(356); //
      byte[] a = {101,102,103,104,105,106,107,108,110};
      raf.write(a); //
      raf.write(a, 2, 4); // 释放系统资源
      raf.close(); }
      }
      • read();

        • 读取一个字节,再补三个 0 字节,变成 int 类型
        • 读取结束,无数据再读取返回 -1
      • seek(int position);
        • 定位下标到指定的位置
      • // 下标定位到 0  位置
        raf.seek(0); // 单字节读取
        int b; // 保存读取的字节值 while ((b = raf.read()) != -1) {
        System.out.println(b);
        }


      • read(byte[]  buff);
        • 根据数组长度读取一批字节值,并返回这一批数据的数量
        • 因为数据数量可能不够数组长度
        • 读取结束,无数据再读取返回 -1
      •                // 批量读取
        raf.seek(0);// 定位下标到 0 byte[] buff = new byte[4]; int c;
        while ((c = raf.read(buff)) != -1) {
        System.out.println(c+"\t"+Arrays.toString(buff));
        }
      • getFilePointer();        
        • 当前下标所在的位置
    • 文件的加密 . 解密
      • 用一个值, 对每个字节值求异或
    • package day1301;
      
      import java.io.File;
      import java.io.RandomAccessFile;
      import java.util.Scanner; public class Test1 {
      public static void main(String[] args) { System.out.println("输入文件:");
      Scanner scanner = new Scanner(System.in);
      String s = scanner.nextLine(); File file = new File(s); if (!file.isFile()) {
      System.out.println("不是文件");
      return;
      } System.out.println("加密key:"); int key = scanner.nextInt(); try {
      encrypt(file,key);
      System.out.println("加密/解密成功");
      } catch (Exception e) {
      System.out.println("失败");
      e.printStackTrace();
      } } private static void encrypt(File file, int key) throws Exception {
      /*
      * 从文件读取一个字节值
      * 对 key 异或后,再写回到文件
      */ RandomAccessFile raf =
      new RandomAccessFile(file, "rw"); // 单字节读写
      // int b;
      // while ((b = raf.read()) != -1) {
      // b ^= key; // 异或加密, 解密
      // // 下标往前挪一位
      // raf.seek(raf.getFilePointer()-1);
      // // 字节值写回到文件
      // raf.write(b);
      // } // 批量读写
      byte[] buff = new byte[8192]; // 一般用 8192 , 8k
      int n;
      while ((n = raf.read(buff)) != -1) {
      for (int i = 0; i < n; i++) {
      buff[i] ^= key;
      } // 下标前移 n 个位置
      raf.seek(raf.getFilePointer()-n);
      // 写回文件, 从 0 位置开始的 前 n 个写回文件
      raf.write(buff, 0, n);;
      } // 批量读写速度更快, 推荐 raf.close(); }
      }

java - day012 - 异常 , throws, throw , IO ,RandomAccessFile的更多相关文章

  1. Java中异常关键字throw和throws使用方式的理解

    Java中应用程序在非正常的情况下停止运行主要包含两种方式: Error 和 Exception ,像我们熟知的 OutOfMemoryError 和 IndexOutOfBoundsExceptio ...

  2. java:异常机制(try,catch,finally,throw,throws,自定义异常)

    * String类中的格式化字符串的方法: * public static String format(String format, Object... args):使用指定的格式字符串和参数返回一个 ...

  3. java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法

    package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: ...

  4. java中异常的抛出:throw throws

    java中异常的抛出:throw throws Java中的异常抛出 语法: public class ExceptionTest{ public void 方法名(参数列表) throws 异常列表 ...

  5. java异常和throw和throws的区别

    之前在编程中编译完成后,运行时,会遇见一些常见的错误,如NullPointerException,ArrayIndexOutOfBoundsException等等 在今天重新回顾学习了java异常,总 ...

  6. Java异常throws与throw的区别

    throws关键字通常被应用在声明方法时,用来指定可能抛出的异常.多个异常可以使用逗号隔开.当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象.谁调用谁处理: 抛出异常throws: ...

  7. JAVA中的throws和throw的区别

    Java     一直对java中的throws和throw不太理解.最近一直在查这两个方面的资料,算是能明白一点吧.如果我下面的观点哪有不对,希望指出来,我加以改进.         throw:( ...

  8. Java基础知识强化之IO流笔记63:随机访问流RandomAccessFile

    1. 随机访问流RandomAccessFile RandomAccessFile类不属于流,是Object类的子类.但它融合了InputStream和OutputStream的功能.支持对随机访问文 ...

  9. Java 异常处理 try catch finally throws throw 的使用和解读(一)

    //最近的一个内部表决系统开发过程中,//发现对异常处理还存在一些模棱两可的地方,//所以想着整理一下//主要涉及到://1.try catch finally throws throw 的使用和解读 ...

随机推荐

  1. PAT 甲级 1145 Hashing - Average Search Time (25 分)(读不懂题,也没听说过平方探测法解决哈希冲突。。。感觉题目也有点问题)

    1145 Hashing - Average Search Time (25 分)   The task of this problem is simple: insert a sequence of ...

  2. systemctl service

    一.systemctl常用命令 systemctl list-units            ##列出当前系统服务的状态 systemctl list-unit-files       ##列出服务 ...

  3. Swift 4.0 Xib实现Button调整

    1.Xib画的界面按钮,代码中进行调整按钮图片在上,文字在下: 代码中修改按钮的位置比较好: payButton.titleEdgeInsets = UIEdgeInsetsMake((payButt ...

  4. 解决no module named setuptools

    To install setuptools on Debian: sudo apt-get install python-setuptools For Python 3.x: sudo apt-get ...

  5. C#多线程编程实例 线程与窗体交互

    C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = ]; public ...

  6. SpringBoot学习笔记:单元测试

    SpringBoot学习笔记:单元测试 单元测试 单元测试(英语:Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部 ...

  7. node不要使用最新版本,使用LTS版本

    错误现象 const { Math, Object, Reflect } = primordials; 原因 使用了最新的node版本 解决 使用稳定版本,参考官网说明,目前10.x的版本是稳定版本( ...

  8. Input.GetMouseButtonDown 在fixedupdate中会出现丢失问题,在update中则完全没这个问题

    Input.GetMouseButtonDown 在fixedupdate中会出现丢失问题,在update中则完全没这个问题

  9. docker 通过overlay 构建跨主机联网通信

    初始化 swarm meiya@meiya:~$ docker swarm init 将当前节点作为manager节点加入swarm meiya@meiya:~$ docker swarm join- ...

  10. jira7.3.6 windows7下安装、中文及破解

    一.事前准备 1:JDK下载并安装:jdk-6u45-windows-i586.exe 2:MySQL JDBC连接驱动:mysql-connector-java-5.1.25.zip 3:MySQL ...