java - day012 - 异常 , throws, throw , IO ,RandomAccessFile
- 异常 封装错误信息的对象
- 错误信息
- 类型 例如: NullPointerExce 空指针
- 提示消息
- 出错的行号
- 异常的继承结构
- Throwable
- | - Error 系统级错误
- | - 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的更多相关文章
- Java中异常关键字throw和throws使用方式的理解
Java中应用程序在非正常的情况下停止运行主要包含两种方式: Error 和 Exception ,像我们熟知的 OutOfMemoryError 和 IndexOutOfBoundsExceptio ...
- java:异常机制(try,catch,finally,throw,throws,自定义异常)
* String类中的格式化字符串的方法: * public static String format(String format, Object... args):使用指定的格式字符串和参数返回一个 ...
- java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法
package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: ...
- java中异常的抛出:throw throws
java中异常的抛出:throw throws Java中的异常抛出 语法: public class ExceptionTest{ public void 方法名(参数列表) throws 异常列表 ...
- java异常和throw和throws的区别
之前在编程中编译完成后,运行时,会遇见一些常见的错误,如NullPointerException,ArrayIndexOutOfBoundsException等等 在今天重新回顾学习了java异常,总 ...
- Java异常throws与throw的区别
throws关键字通常被应用在声明方法时,用来指定可能抛出的异常.多个异常可以使用逗号隔开.当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象.谁调用谁处理: 抛出异常throws: ...
- JAVA中的throws和throw的区别
Java 一直对java中的throws和throw不太理解.最近一直在查这两个方面的资料,算是能明白一点吧.如果我下面的观点哪有不对,希望指出来,我加以改进. throw:( ...
- Java基础知识强化之IO流笔记63:随机访问流RandomAccessFile
1. 随机访问流RandomAccessFile RandomAccessFile类不属于流,是Object类的子类.但它融合了InputStream和OutputStream的功能.支持对随机访问文 ...
- Java 异常处理 try catch finally throws throw 的使用和解读(一)
//最近的一个内部表决系统开发过程中,//发现对异常处理还存在一些模棱两可的地方,//所以想着整理一下//主要涉及到://1.try catch finally throws throw 的使用和解读 ...
随机推荐
- Meta标签中的http-equiv属性
http-equiv顾名思义,相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变 ...
- jmeter的安装教程
JMETER安装教程 jmeter的安装教程 1:安装jdk并且配置好环境变量,此处就不做赘述(前面的文档中有) 2:下载jmeter文件和jmeter的插件文件 JMeter:http://jmet ...
- [转帖]什么是UWB?UWB有什么用?
什么是UWB?UWB有什么用? https://www.sohu.com/a/224891573_531173 小米碰传 就是 UWB吧? 2018-03-05 17:02 UWB在早期被用来应用在近 ...
- ServiceStack.Redis 连接有密码的Redis问题解决
在ip:port前面加上@用来表示密码,比如password@ip:port <add key="RedisServer" value="123456@127.0. ...
- python基础学习(十四)
28.模块当脚本执行 !!!! 注意 这是分两个文件的 一个是student.py和app3.py student.py name = "Song Ke" name_list ...
- ListView控件的理解——自洽理论
写在前面的话: *标题中已经说明,是自洽理论.因此,有几率会有理解错误.但是,你不可以因此骂我. -我这个人经不起别人的批评,如果你批评我,我就,我就.... ## <第一行代码>读书笔记 ...
- C之typedef应用
1.0关于typedef关键字的基础: https://www.cnblogs.com/anSn/p/8783347.html 1.1 typedef 修饰“函数类型” 的调用方法: 1)我们写一段普 ...
- PHP中的PDO数据对象
PDO: PHP Data Object:php的数据对象.pdo是数据库操作工具类!1,它能操作很多种数据库,比如mysql,oracle,sybase....2,它具有操作数据库的更多的功能,比如 ...
- 2019年6月12日——开始记录并分享学习心得——Python3.7中对列表进行排序
Python中对列表的排序按照是排序是否可以恢复分为:永久性排序和临时排序. Python中对列表的排序可以按照使用函数的不同可以分为:sort( ), sorted( ), reverse( ). ...
- go select 使得一个 goroutine 在多个通讯操作上等待。
select 语句使得一个 goroutine 在多个通讯操作上等待. select 会阻塞,直到条件分支中的某个可以继续执行,这时就会执行那个条件分支.当多个都准备好的时候,会随机选择一个. pac ...