目录
三.异常中常见的方法(定义在最顶级的Throwable类内)
十.案例:遍历文件夹:需要注意无权限访问的文件夹,返回数组时会返回为空
十三.案例:获取文件夹里面的文件大小,需要注意不要对文件夹使用length方法
测试使用的学生类:具有特殊的set方法,会抛出异常
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
if (!(name.length()>=2&&name.length()<=3)){
System.out.println("2.在抛出自定义异常时,可以在new异常时使用有参构造返回错误信息");
throw new NameFormatException(name+"长度有误,长度应该为2-3");
}
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>40||age<18){
throw new RuntimeException(age+"年龄有误,应该为18-40");
}
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
一.程序出错:Error与Exception
Error对象:系统级别的错误,无需关注。 1.异常体系的最上层父类是? 异常体系的最上层父类是Exception 2.异常又分哪两种? RuntimeException(运行异常:如数组越界) 与 其他异常(编译异常:如使用SimpleDateFormat的parse方法时)。 通过异常可以了解错误信息,作为一种特殊的返回值,通知调用着底层的执行情况 3.JVM发生运行异常的时候会做什么事情?
public class Demo271 {
public static void main(String[] args) throws ParseException {
System.out.println("3.在Student类里面,年龄不对时抛出异常(throw new 异常名(描述)),停止运行");
System.out.println("在Java运行过程中出错时,JMV默认的处理也是如此:把异常名称原因位置输出控制台,并且停止程序");
new Student().setAge(17);
}
}
二.try-catch语句
1.区别于区别于JVM默认处理方式,使用try-catch处理可以让代码继续往下走,如果代码遇到错误,错误代码下面的代码还会执行吗? 2.有多种异常需要处理应该如何使用try-catch语句呢? 3.连续catch时,对异常的顺序有什么要求?
public class Demo272 {
public static void main(String[] args) {
try {
System.out.println("1.逮到错误就直接到catch里面处理,try中错误代码后面的代码不会执行");
new Student().setAge(17);
System.out.println(2/0);
int[] a = new int[1];
System.out.println(a[10]);
String str = null;
str.equals("");
} catch (ArithmeticException|NullPointerException e){
e.printStackTrace();
} catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
} catch (RuntimeException e){
System.out.println("2.有多种可能出现的异常或者异常不确定可以连续catch");
System.out.println("3.catch时,父类只能写在最后面");
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
}
}
三.异常中常见的方法(定义在最顶级的Throwable类内)
1.异常对象输出信息(默认报错方式)? 2.如何获取异常的简短信息? 3.如何输出错误信息(红色字体)?
public class Demo273 {
public static void main(String[] args) {
try {
System.out.println(1/0);
}catch (ArithmeticException e){
System.out.println("1.使用printStackTrace方法是控制台输出错误信息,能跟踪报错位置");
e.printStackTrace();
System.out.println("2.返回详细信息与返回简短信息");
System.out.println(e);
System.out.println(e.getMessage());
}
System.err.println("3.打印错误信息(红色字与黑色字所处顺序会变化,与多线程有关)");
}
}
四.throws与throw
1.throws在什么位置使用?作用是什么? 2.throws在可能有运行时异常的时候需要声明吗? 3.throw在什么位置使用?有什么作用?
public class Demo274 {
public static void main(String[] args) throws Exception{
System.out.println("1.throws写在方法定义处表示声明一个异常,告诉调用者这个方法体里面可能会有那些异常");
System.out.println("2.对于运行时期的异常可以省略不写,编译时产生的异常必须要声明");
System.out.println("3.throw写在方法里面,抛出异常对象,交给调用者,并结束方法");
throw new Exception();
}
}
五.自定义异常:让控制台报错信息更加见名知意
1.自定异常类的步骤? 2.在抛出异常时,如何随控制台输出错误自己想输出的信息?
public class Demo275 {
public static void main(String[] args) {
System.out.println("1.定义异常类\n2.写继承关系\n3.空参构造与带参构造");
Student student = new Student();
student.setName("捷克罗姆");
}
}
//编译异常继承Exception,运行异常就继承RuntimeException
public class NameFormatException extends RuntimeException{
public NameFormatException() {
}
public NameFormatException(String message) {
super(message);
}
}
六.File对象与创建
1.File对象能够表示什么?一定需要是存在的吗? 2.有哪些方式能够创建File对象?
public class Demo276 {
public static void main(String[] args) {
System.out.println("1.file对象表示路径,可以是文件路径,也能是文件夹路径,可以不存在");
String str = "JAVA基础\\src\\Day27\\MyTxt";
String s = "a.txt";
System.out.println("2.(1)使用一个String创建File对象");
File file1 = new File(str);
System.out.println(file1);
System.out.println("(2)使用两个String创建File对象,自动补\\");
File file2 = new File(str,s);
//相当于
file2 = new File(str+"\\"+s);
System.out.println(file2);
System.out.println("(3)使用一个file一个string创建对象");
File file3 = new File(file1,s);
System.out.println(file3);
}
}
七.文件信息查看方法
1.判断是否存在,是文件还是文件夹 2.文件大小 3.文件路径 4.文件名 5.最后修改的时间
public class Demo277 {
public static void main(String[] args) {
String file = "JAVA基础\\src\\Day27\\MyTxt\\a.txt";
File f = new File(file);
System.out.println("1.返回文件状态:是否存在,是文件还是文件夹");
System.out.println(f.exists());
System.out.println(f.isFile());
System.out.println(f.isDirectory());
System.out.println("2.返回文件大小(length)(如果是文件夹,则返回不确定)");
System.out.println(f.length());
System.out.println("3.返回文件定义时的路径(getPath)与绝对路径(getAbsolutePath)");
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println("4.返回文件名,也可以是文件夹名(getName)");
f = new File("JAVA基础\\src\\Day27");
System.out.println(f.getName());
System.out.println("5.返回文件最后修改的时间");
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(f.lastModified())));
}
}
八.文件操作方法
1.如如何创建新文件?如果文件已存在会发生什么?如果路径错误会发生什么?
2.如何创建单级目录?
3.如何创建多级目录?
4.如何删除文件?
5.如何删除文件夹?当文件夹里面有文件时能删除文件夹吗?
public class Demo278 {
public static void main(String[] args) throws IOException {
String str = "JAVA基础\\src\\Day27\\MyTxt";
System.out.println("1.创建新文件:1.如果文件已经存在,则创建失败 2.如果找不到路径会报错");
File file1 = new File(str,"b.txt");
System.out.println(file1.createNewFile());
System.out.println("2.创建单级目录");
File file2 = new File(str,"directory1");
System.out.println(file2.mkdir());
System.out.println("3.创建多级目录(创建单级肯定也可以)");
File file3 = new File(str,"directory2\\A");
System.out.println(file3.mkdirs());
System.out.println("4.删除文件");
System.out.println(file1.delete());
System.out.println("5.删除文件夹:有内容就删不掉");
System.out.println(new File(str).delete());
System.out.println(file3.delete());
}
}
九.获取File下的内容并遍历
1.使用什么方法获取指定目录下的file数组? 2.不存在该目录时方法会返回什么? 3.为文件时方法会返回什么? 4.位空文件夹时该方法会返回什么? 5.该方法能够获取隐藏文件夹吗? 6.如何获取可用的系统根? 7.使用什么方法获取指定目录下的文件数组?(String类型) 8.在创建文件时如何过滤内容?
public class Demo279 {
public static void main(String[] args) {
File file = new File("Java基础\\src\\Day27");
System.out.println("1.获取文件与文件夹的数组");
File[] files = file.listFiles();
System.out.println(files);
System.out.println("2.不存在则返回空");
file = new File("Java基础\\src\\Day1");
System.out.println(file.listFiles());
System.out.println("3.为文件时也会返回为空");
file = new File("Java基础\\src\\Day27\\Demo271.java");
System.out.println(file.listFiles());
System.out.println("4.为空文件夹时返回为空数组");
file = new File("Java基础\\src\\Day27\\MyTxt\\directory1");
System.out.println(Arrays.toString(file.listFiles()));
System.out.println("5.除此之外,能够获取到隐藏文件夹,有些文件夹可能权限不足无法访问,返回为空");
System.out.println("6.列出可以用的文件系统根");
System.out.println(Arrays.toString(File.listRoots()));
System.out.println("7.获取目录下的文件名(String类型的)");
file = new File("Java基础\\src\\Day27");
System.out.println(Arrays.toString(file.list()));
System.out.println("8.可以在创建文件时传入接口实现类过滤内容");
file.listFiles((myFile)->myFile.getName().startsWith("D"));
}
}
十.案例:遍历文件夹:需要注意无权限访问的文件夹,返回数组时会返回为空
public class Demo2710 {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\33428\\AppData\\Local\\Microsoft");
myForEach(file);
}
public static void myForEach(File file){
if (file.isFile()){
System.out.println(file);
return;
}
File[] files = file.listFiles();
if (files==null)return;
for (File listFile : files) myForEach(listFile);
}
}
十一.案例:删除多级文件夹
public class Demo2711 {
public static void main(String[] args) {
File file = new File("JAVA基础\\src\\Day27\\MyTxt\\directory1");
myDelete(file);
}
public static void myDelete(File file){
//当前文件可以删除(只留下有内容的文件)
if (file.delete()){return;}
//下面的就是文件了获取文件的数组
File[] files = file.listFiles();
//这里的循环在后面就不需要再删除了,进入子级目录又会在开头判断能不能删除
for (File listFile : files) myDelete(listFile);
//删除当前文件夹
file.delete();
}
}
十二.案例:统计文件夹中有后缀名的文文件的个数
//案例:统计文件夹中有后缀名的文文件的个数
public class Demo2712 {
public static void main(String[] args) {
File file = new File("C:\\Users\\33428\\Desktop");
HashMap<String, Integer> hashMap = new HashMap<>();
myForEach(file, hashMap);
hashMap.forEach((s, integer) -> System.out.println(s+":"+integer+"个"));
}
public static void myForEach(File file, HashMap<String, Integer> hashMap) {
if (file.isFile()) {
String[] strings = file.getName().split("\\.");
if (strings.length==0)return;
String str = strings[strings.length - 1];//后缀名
if (hashMap.containsKey(str)) hashMap.put(str, hashMap.get(str) + 1);
else hashMap.put(str, 1);
return;
}
File[] files = file.listFiles();
if (files == null) return;
for (File listFile : files) myForEach(listFile, hashMap);
}
}
十三.案例:获取文件夹里面的文件大小,需要注意不要对文件夹使用length方法
public class Demo2713 {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\33428\\Videos");
System.out.println(myForEach(file));
}
public static Long myForEach(File file){
if (file.isFile()){
System.out.println(file);
return file.length();
}
File[] files = file.listFiles();
if (files==null)return 0L;
long sum = 0L;
for (File listFile : files) sum += myForEach(listFile);
return sum;
}
}