01异常
1异常的体系

2throw和throws的区别
1.作用不同
1.throw用于方法中主动抛出一个异常对象
2.throws用于在方法声明处生命该方法可能是抛出的异常类型,他把异常交给调用方法的那个人。
2.语法位置不同
1.thow在方法内部
2.thows出现在方法声明处
3.数量不同
1.throw每次只能抛出一个异常对象
2.throws一次可以抛出多个异常类型
4.处理方式不同
1.使用throw抛出异常后,后续代码通常不会继续执行除非在try-catch中
2.声明throws知识告知调用者方法可能出现异常,但是方法本身不负责处理异常。
注意点
编译时异常必须在方法体上thrwos抛出,运行时一场不需要。
02自定义异常实现方式

创建girl类,生成的setAge和setName方法中进行了判断以满足题中条件
public class Girl {
private String name;
private int age;
public Girl() {
}
public Girl(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
if (name.length() <3 || name.length() >10){
throw new NameFormatterException(name+"长度不在18-40之间");
}
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
if (age <18 || age >40){
throw new AgeOutOfBoundsException(age+"年龄范围不合法");
}
this.age = age;
}
public String toString() {
return "Girl{name = " + name + ", age = " + age + "}";
}
}
创建自定义异常类AgeOutOfBoundsException和NameFormatterException
public class AgeOutOfBoundsException extends RuntimeException {
public AgeOutOfBoundsException(String message) {
super(message);
}
public AgeOutOfBoundsException() {
super();
}
}
public class NameFormatterException extends RuntimeException{
public NameFormatterException() {
super();
}
public NameFormatterException(String message) {
super(message);
}
}
说明:创建异常类的命名方式一般是异常类型+Exception,里面使用ctrl+O,重载第二个方法即可完成自定义异常。
创建测试类
public class Test2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String name;
int age = 0;
Girl girl = new Girl();
while (true) try {
System.out.println("请输入你的姓名");
name = sc.next();
girl.setName(name);
System.out.println("请输入你的年龄");
age = sc.nextInt();
girl.setAge(age);
break;
} catch (AgeOutOfBoundsException | NameFormatterException e) {
03File概述、构造方法和成员变量方法
1file概述
file对象表示路径,可以是文件和文件夹,该路径能存在也可以不存在
2.file构造方法
三种构造方法

简单使用
public class FileDemo1 {
public static void main(String[] args) {
String str = "C:\\Users\\30116\\Desktop\\my\\color.md";
//尝试三种构造方法
File f1 = new File(str);
System.out.println(f1);
String parent = "C:\\Users\\30116\\Desktop\\my";
String child = "color.md";
//这里使用java自己生成,因为会在不同的操作系统使用
File f2 = new File(parent , child);
System.out.println(f2);
//第三种
File f3 = new File(parent);
File f5 = new File(f3,child);
System.out.println(f5);
}}
3.file常见的成员方法
常见的成员方法

常见的遍历方法

简单应用部分:
public class FileDemo3 {
public static void main(String[] args) {
File f1 = new File("C:\\Users\\30116\\Desktop\\my\\Xmind\\a.txt");
//细节1:只能返回字节单位,对于M,G,需要除以1024
//细节2:
System.out.println(f1.length());
System.out.println(f1.getAbsolutePath());
File f2 = new File("..\\b.txt");
System.out.println(f2.getAbsolutePath());
//返回定义文件时使用的路径
System.out.println(f2.getPath());
System.out.println(f2.getName());
System.out.println(f1.lastModified()); //返回文件最后修改时间,毫秒
}
}
遍历的简单应用:
public class FileDemo6 {
public static void main(String[] args) {
//1.遍历文件夹下的所有内容
File f1 = new File("C:\\Users\\30116\\Desktop\\my\\Xmind");
File[] files = f1.listFiles();
if (files != null) {
for (File f : files) {
System.out.println(f);
}
}
}
}
重点掌握listFiles()方法
课后练习:如何使用获取的最近更改事件把时间转换为yyyy-MM-dd HH:mm:ss类型(提示使用jdk7的SimpleDateFormatter)
04File的综合练习(重点)
写在前面的话:file的练习需要自己创建文件夹,代码中是我自己的文件夹创建的,读者在实现代码时,需要先创建好自己的文件夹
综合练习1

public class TestDemo1 {
public static void main(String[] args) throws IOException {
//1.在文件夹下创建一个文件
File f1 = new File("aaa");
//创建了一个day27//aaa文件夹,创建了两个
f1.mkdir();
File f2 = new File(f1,"a.txt");
boolean flag = f2.createNewFile();
if (flag){
System.out.println("success");
}else {
System.out.println("defeat");
}
}
}
综合练习2

public class TestDemo2 {
public static void main(String[] args) {
//定义一个方法查找里面是否有以avi结束的电影
System.out.println(method());
}
/*查看是否有以.avi结尾的电影*/
private static boolean method() {
File f1 = new File("C:\\Users\\30116\\Desktop\\my\\Xmind\\aaa");
String[] list = f1.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File src = new File(dir, name);
return src.isFile() && name.endsWith(".avi");
}
});
System.out.println(Arrays.toString(list));
if (list != null && list.length == 0) {
return false;
}
return true;
}
}
综合练习3
解说:主要思想是递归思想,使用listFIles方法找到文件夹下所有目录,找到后,对是文件的进行操作,,不是文件的递归继续查找直至找到所有的.avi文件,递归时包含递归出口。

public class TestDemo4 {
public static void main(String[] args) {
/*思路
* 1.先找到四个盘符 //找到一个盘符里面的就可以
* 2.找到盘符下的文件夹
* 3.创建File对象,使用list过滤方法找.avi文件
* 4.找到文件夹下的所有文件夹,循环遍历文件夹,盘符+文件夹创建对象
* 5循环调用方法*/
File src = new File("C:\\");
//禁止调用该方法
//禁止调用该方法
//禁止调用该方法
//禁止调用该方法
//禁止调用该方法
//禁止调用该方法
//alls();
}
/*电脑上所有的盘符的文件*/
public static void all(){
File file = new File("C:\\");
File[] files = file.listRoots();
for (File file1 : files) {
findAVI(file1);
}
}
/*找到c盘符下面的.avi文件结尾的文件*/
public static void findAVI(File src){
//1.找到盘符下的所有文件
File[] files = src.listFiles();
if(files != null){
for (File file : files) {
if (file.isFile()){
if (file.getName().endsWith(".avi")){
System.out.println(file);
}
}else {
findAVI(file);
}
}
}
}
}
综合练习4

删除一个多级文件夹同样是递归思想,文件夹下的文件和文件夹删除,递归到最高级文件夹进行删除。
public class TestDemo5 {
public static void main(String[] args) {
//删除一个多级文件夹
File src = new File("C:\\Users\\30116\\Desktop\\my\\Xmind\\bbb");
del(src);
}
/*删除一个多级文件夹,需要删除里面的所有文件和文件夹
* 参数 file
* 返回值 void*/
public static void del(File src){
//1.找到该文件夹下的所有目录和文件
File[] files = src.listFiles();
//2.递归
//如果为null的情况,比如没有权限访问就会为null,切记删除不在回收站不可删除重要内容
for (File file : files) {
if (file.isFile()){
if (file.getName().endsWith(".txt")){
//删除
System.out.println(file.delete());
}
}else {
del(file);
}
}
src.delete();
}
}
综合练习5

有一种情况需要考虑,就是如果我们访问的文件夹需要权限,就会返回null和文件夹没有内容,使用一个if判避免报错。
public class TestDemo6 {
public static void main(String[] args) {
//统计文件夹的大小就是统计所有文件的大小
File file = new File("C:\\Users\\30116\\Desktop\\my\\Xmind\\ggg");
getCount(file);
System.out.println(count);
}
static long count =0;
//utf-8中一个汉字3个字节
public static void getCount(File src){
File[] files = src.listFiles();
if (files != null){
for (File file : files) {
if (file.isFile()){
count+=file.length();
}else {
getCount(file);
}
}
}
}
}
综合练习6

使用HashMap和递归思想以及双列集合的遍历方法。
public class TestDemo7 {
public static void main(String[] args) {
File src = new File("C:\\Users\\30116\\Desktop\\my\\Xmind\\ggg");
Set<String> strings = getCount(src).keySet();
for (String string : strings) {
System.out.println(string+":"+hm.get(string));
}
}
/*统计文件家中每种文件的个数并打印
* 参数 开始文件夹
* 可能遇到的情况
* 有后缀和无后缀
* 我写的也性的通
* 返回值 Map*/
static HashMap<String,Integer> hm = new HashMap();
public static HashMap<String,Integer> getCount(File src){
File[] files = src.listFiles();
if (files != null){
for (File file : files) {
if (file.isFile()){
//这个逻辑没有阿伟的好,因为我这个还要判断
//哪个只需要判断用.分割后,是否长度为2,长度不为2说明,文件没有后缀不统计
//这就是没有全面的考虑问题
if (file.getName().endsWith(".txt") ||file.getName().endsWith(".doc")||file.getName().endsWith(".jpg")){
//切割找后缀
String sub = file.getName().substring(file.getName().lastIndexOf(".") + 1);
if (hm.containsKey(sub)){
//hm中包含这个后缀
int count = hm.get(sub);
hm.put(sub,++count);
}else {
//改后缀第一次出现
hm.put(sub,1);
}
}
}else {
getCount(file);
}
}
}
return hm;
}
}
161

被折叠的 条评论
为什么被折叠?



