JAVA 异常+File
异常
编译阶段:
java不会运行代码,只会检查语法是否错误,或者做一些性能的优化
提醒程序员检查本地信息
运行阶段:
代码出错而导致程序出现的问题
异常的作用
package myexcepyion;public class ExceptionDemo1 {public static void main(String[] args) {//1。创建学生对象Student s1=new Student();//年龄:18~40岁s1.setAge(50);}
}
package myexcepyion;public class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public Student() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {if(age<18||age>40){//System.out.println("年龄超出范围");throw new RuntimeException();}else{this.age = age;}}
}
异常的处理方式
package myexcepyion;public class ExceptionDemo2 {public static void main(String[] args) {int[] arr={1,2,3,4,5,6};try {//可能出现异常的代码System.out.println(arr[10]);//此处出现了异常,程序就会在这里创建一个ArrayIndexoutofBoundsException对象//new ArrayIndexOutOfBoundsException();//拿着这个对象到catch的小括号中对比,看括号中的变量是否可以接收这个对象//如果能被接收,就表示该异常就被捕获(抓住),执行catch里面对应的代码//当catch里面所有的代码执行完毕,继续执行try...catch体系下面的其他代码}catch (ArrayIndexOutOfBoundsException e){//如果出现了ArrayIndexOutOfBoundsException异常,我该如何处理System.out.println("索引越界了");}System.out.println("看看我执行了吗");}
}
捕获异常灵魂四问
异常中的常见方法
printStackTrace()仅仅知识打印信息,不会停止程序运行
package myexcepyion;import java.util.Set;public class ExceptionDemo3 {public static void main(String[] args) {/*public string getMessage()public string tostring()public void printstackTrace()返回此 throwable 的详细消息字符串返回此可抛出的简短描述在底层是利用system.err.println进行输出把异常的错误信息以红色字体输出在控制台细节:仅仅是打印信息,不会停止程序运行*/int[] arr={1,2,3,4,5,6};try {System.out.println(arr[10]);}catch (ArrayIndexOutOfBoundsException e){//String message=e.getMessage();//System.out.println(message);//Index 10 out of bounds for length 6//String str=e.toString();//System.out.println(str);//java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 6e.printStackTrace();}//System.out.println("看看我执行了吗");//正常的输出语句System.out.println(123);//错误的输出语句(用来打印错误信息)System.err.println(123);}
}
抛出异常
练习
package myexcepyion;public class GirlFriend {private String name;private int age;public GirlFriend() {}public GirlFriend(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name)throws RuntimeException {int len=name.length();if(len<3||len>10){throw new RuntimeException();}this.name = name;}public int getAge() {return age;}public void setAge(int age) throws RuntimeException{if(age<18||age>40){throw new RuntimeException();}this.age = age;}@Overridepublic String toString() {return "GirlFriend{" +"name='" + name + '\'' +", age=" + age +'}';}
}
package myexcepyion;import java.util.Scanner;public class Test1 {public static void main(String[] args) {//1.创建键盘录入的对象Scanner sc=new Scanner(System.in);//2.创建女朋友的对象GirlFriend gf=new GirlFriend();//3.接收女朋友的姓名while(true){try{System.out.println("请输入你心仪的女朋友的名字");String name=sc.nextLine();gf.setName(name);//4.接收女朋友的年龄System.out.println("请输入你心仪的女朋友的年龄");String ageStr=sc.nextLine();int age=Integer.parseInt(ageStr);gf.setAge(age);//如果所以的数据都是正确的,那么跳出循环break;}catch (NumberFormatException e){System.out.println("年龄的格式有误,请输入数字");}catch (RuntimeException e){System.out.println("姓名的长度或者年龄的范围有误");}}System.out.println(gf);}
}
自定义异常
File
package myfile;import java.io.File;public class FileDemo1 {public static void main(String[] args) {//1.根据字符串表示的路径,变成File对象String str="C:\\Users\\谢永琪\\Desktop\\a.txt";File f1=new File(str);System.out.println(f1);//C:\Users\谢永琪\Desktop\a.txt//2.父级路径:C:\Users\谢永琪\Desktop//子级路径:a.txtString parent="C:\\Users\\谢永琪\\Desktop";String child="a.txt";File f2=new File(parent,child);System.out.println(f2);//C:\Users\谢永琪\Desktop\a.txt//3.把一个File表示的路径和String表示路径进行拼接File parent2=new File("C:\\Users\\谢永琪\\Desktop");String child2="a.txt";File f4=new File(parent2,child2);System.out.println(f4);//C:\Users\谢永琪\Desktop\a.txt}
}
File的常见成员方法
1.判断,获取
package myfile;import java.io.File;public class FileDemo3 {public static void main(String[] args) {/*public long length()返回文件的大小(字节数量)public string getAbsolutePath()返回文件的绝对路径public string getPath()返回定义文件时使用的路径public string getName()返回文件的名称,带后缀public long lastModified()返回文件的最后修改时间(时间毫值)*///1.length 返回文件的大小(字节数量)//细节:这个方法只能获取文件的大小,单位是字节//如果单位我们要是M,G,可以不断的除以1024//len /1024 KB///1024 / 1024 MB//细节2:这个方法无法获取文件夹的大小//如果我们要获取一个文件夹的大小,需要把这个文件夹里面所有的文件大小都累加在一起File f1=new File("D:\\cd");long len=f1.length();System.out.println(len);System.out.println("-----------------------");//2.getAbsolutePath()返回文件的绝对路径File f3=new File("D:\\cd");String path1=f3.getAbsolutePath();System.out.println(path1);File f4=new File("myfile\\cd");String path2=f4.getAbsolutePath();System.out.println(path2);System.out.println("-----------------------");//3.getPath返回定义文件时使用的路径File f5=new File("D:\\cd");String path3=f3.getPath();System.out.println(path3);File f6=new File("myfile\\cd");String path4=f6.getPath();System.out.println(path4);System.out.println("-----------------------");//4.getName 返回文件的名称,带后缀File f7=new File("D:\\cd");String name1=f7.getName();System.out.println(name1);System.out.println("----------------------");//5.lastModified返回文件的最后修改时间(时间毫值)File f9=new File("D:\\cd");long time=f9.lastModified();System.out.println(time);}
}
2.创建、删除
前三个方法
package myfile;import java.io.File;
import java.io.IOException;public class FileDemo4 {public static void main(String[] args) throws IOException {/*public boolean createNewFile()创建一个新的空的文件public boolean mkdir()创建单级文件夹public boolean mkdirs()创建多级文件夹public boolean delete() 删除文件、空文件夹*///1.createNewFile 创建一个新的空的文件//细节1:如果当前路径表示的文件是不存在的,则创建成功,方法返回true//如果当前路径表示的文件是存在的,则创建失败,方法返回false//细节2:如果父级路径是不存在的,那么方法会有异常I0Exception//细节3:createNewFile方法创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件/*File f1=new File("D:\\aaa\\b.txt");boolean b=f1.createNewFile();System.out.println(b);*///2.mkdir make Directory,文件夹(目录)//细节1:windows当中路径是唯一的,如果当前路径已经存在,则创建失败,返回false//细节2:mkdir方法只能创建单级文件夹,无法创建多级文件夹。/*File f2=new File("D:\\aaa\\aaa\\bbb\\ccc");boolean b=f2.mkdir();System.out.println(b);*///3.mkdirs 创建多级文件夹//细节:即可以创建单击文件夹,又可以创建多级文件夹File f3=new File("D:\\aaa\\aaa\\bbb\\ccc");boolean b=f3.mkdirs();System.out.println(b);}
}
删除方法
package myfile;import java.io.File;public class FileDemo5 {public static void main(String[] args) {/*public boolean delete() 删除文件、空文件夹细节:如果删除的是文件,则直接删除,不走回收站。如果删除的是空文件夹,则直接删除,不走回收站如果删除的是有内容的文件夹,则删除失败*///1.创建File对象File f1=new File("D:\\aaa\\bbb");//2.删除boolean b=f1.delete();System.out.println(b);}}
3.获取并遍历
package myfile;import java.io.File;public class FileDem6 {public static void main(String[] args) {//public File[] listFiles() 获取当前该路径下所有内容//1.创建File对象File f=new File("D:\\aaa");//2.listFiles方法//作用:获取aaa文件夹里面的所有内容,把所有的内容放到数组中返回File[] files=f.listFiles();for(File file:files){//file依次表示aaa文件夹里面的每一个文件或者文件夹System.out.println(file);}}
}
练习
package Test;import java.io.File;
import java.io.IOException;public class Test1 {public static void main(String[] args) throws IOException {//需求:在当前模块下的aaa文件夹中创建一个a.txt文件//1.创建a.txt的父级路径File f1=new File("..\\myfile\\aaa");//2.创建父级路径//如果aaa是存在的,那么此时创建失败的,//如果aaa是不存在的,那么此时创建成功的f1.mkdirs();File f2=new File(f1,"a.txt");boolean b=f2.createNewFile();if(b){System.out.println("创建成功");}else{System.out.println("创建失败");}}
}
package Test;import java.io.File;public class Test2 {public static void main(String[] args) {/*需求:定义一个方法找某一个文件夹中,是否有以avi结尾的电影。(暂时不需要考虑子文件夹)*/File file=new File("D:\\aaa");boolean b=haveAVI(file);System.out.println(b);}/*作用:用来找某一个文件夹中,是否有以avi结尾的电影形参:要查找的文件夹返回值:查找的结果存在true不存在false*/public static boolean haveAVI(File file){//1.进入aaa文件夹,而且要获取里面的所有内容File[] f=file.listFiles();//2.遍历数组获取里面的每一个元素for(File f1:f){//f:依次表示aaa文件夹里面每一个文件或者文件夹的路径if(f1.isFile()&&f1.getName().endsWith(".avi"));return true;}//3.如果循环结束以后还没有找到,返回falsereturn false;}
}
package Test;import java.io.File;public class Test3 {public static void main(String[] args) {/*需求:定义一个方法找某一个文件夹中,是否有以avi结尾的电影。(需要考虑子文件夹)*/File file=new File("C:\\");findAVI(file);}/*作用:用来找某一个文件夹中,是否有以avi结尾的电影形参:要查找的文件夹返回值:查找的结果存在true不存在false*/public static void findAVI(File file){//1.进入src文件夹,而且要获取里面的所有内容File[] f=file.listFiles();//2.遍历数组获取里面的每一个文件或者文件夹if(f!=null){for(File f1:f){//3.判断。如果是文件,执行业务逻辑if(f1.isFile()){String name=f1.getName();if(name.endsWith(".avi")){System.out.println(f1);}}else{//是文件夹,递归findAVI(f1);}}}}
}
package Test;import java.io.File;public class Test4 {public static void main(String[] args) {/*删除一个多级文件夹如果我们要删除一个有内容的文件夹1.先删除文件夹里面所有的内容2.再删除自己*/File file=new File("D:\\aaa");delete(file);}public static void delete(File src){File[] files=src.listFiles();//遍历for(File file:files){if(file.isFile()){file.delete();}else{delete(file);}}src.delete();}
}
package Test;import java.io.File;public class Test5 {public static void main(String[] args) {/*需求:统计一个文件夹的总大小*/File file=new File("D:\\应用");long len=getlen(file);System.out.println(len);}public static long getlen(File src){long len=0;File[] files=src.listFiles();for(File file:files){if(file.isFile()) {len += file.length();}else {len+=getlen(file);}}return len;}
}