IO流
- IO流:输入输出流,用于设备之间的一个数据传输。
Throwable 问题
-
Error 错误,属于严重性问题
-
Exception 异常,属于一般性问题
-
运行期异常:RuntimeException及其子类
对于运行期异常,我们自己没有处理,就交由JVM去处理,JVM的默认处理方式是打印详细的异常信息,然后退出虚拟机。
如果觉得JVM的处理异常方式不够友好,可以使用try catch 来进行异常的捕获处理。
try里放的是有可能会出现异常的代码
catch(){}小括号中放的是将要捕获的那种异常
catch(){}大括号中放的是一旦发生捕获的这种异常,处理方式是什么。
int a = 10; int b = 0; try { System.out.println(a / 0); }catch (ArithmeticException e) { System.out.println("除数为0了"); }
能明确的异常尽量明确,不要拿一个最大的异常一捕了之。
捕获多个异常时,大的异常放在最后面,平级关系的异常,谁前谁后无所谓。
- 注意:
-
try中尽可能放的是有可能出现问题的代码
-
一旦发生异常,异常的处理不能空处理,即便打印一句话提示一下都可以
int[] arr = {2, 3}; int a = 1; int b = 0; arr = null; try { System.out.println(arr.length); System.out.println(a / b); System.out.println(arr[3]); } catch (ArrayIndexOutOfBoundsException| ArithmeticException | NullPointerException e) { if(e instanceof ArrayIndexOutOfBoundsException ){ }else if(e instanceof ArithmeticException){ }else if(e instanceof NullPointerException){ }else{ } }
-
编译期异常
发生在编译期,非RuntimeException 及其子类,编译期异常,必须处理,不处理的程序无法运行。
对于编译期异常,我们有两种处理方式:
- 使用 throws 抛出异常,抛给调用者,谁调用谁处理。
- 使用try catch 自己捕获处理。
-
throw和throws的区别:
throws:
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常throw:
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
这个异常对象可以是编译期异常对象, 可以是运行期异常对象
表示抛出异常,由方法体内的语句处理
throw是抛出了异常,执行throw则一定抛出了某种异常 -
finally
不管有没有遇到异常,finally里面的代码都会执行。一般来说,在这个finally里面做一些善后收尾工作
-
final,finally和finalize的区别
final: 是一个状态修饰符, 可以用来修饰类 , 变量 , 成员方法.
被修饰的类不能被子类继承, 修饰的变量其实是一个常量不能被再次赋值 修饰的方法不能被子类重写
finally:用在try…catch…语句中 , 作用: 释放资源 . 特点: 始终被执行(JVM不能退出)
finalize: Obejct类中的一个方法,用来回收垃圾
-
如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。
答:会执行, 在return前public static void main(String[] args) { try { System.out.println(23 / 0); } catch (Exception e) { System.out.println("哦,catch了..............."); return ; }finally { System.out.println("哦,被执行了.............."); } }/*哦,catch了............... 哦,被执行了..............*/
-
-
自定义异常
为什么要有自定义异常?
java给我们提供了很多异常类,来描述我们在开发中所遇到的一些常见问题,但这样还不足以描述我们遇到的所有异常。
例:余额不足异常
public class MyTest { private static double money; public static void main(String[] args) { money = 100; Scanner scanner = new Scanner(System.in); System.out.println("请输入你的取款金额"); double num = scanner.nextDouble(); quKuan(num); } private static void quKuan(double num) { if(num<=money){ money-=num; System.out.println("取款成功"); }else{ throw new NoMoneyException("余额不足异常"); } } }
- 子类在重写父类方法时,父类方法没有抛出过异常,子类在重写时,不能抛出异常。
- 父类方法如我有抛出异常,那么子类在重写父类方法时,可以抛出和父类一样的异常,或者说比父类的异常小,或者说不抛异常也可以。
- 子类不能抛出父类没有抛出的异常。
- 处理异常的快捷键ctrl+alt+T
文件
File 文件和目录路径名的抽象表示形式。
File(String pathname);
-
实例化
public static void main(String[] args) { /* File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。*/ File file = new File("C:\\Users\\Administrator\\Desktop","a.txt"); System.out.println(file);//C:\Users\Administrator\Desktop\a.txt /*File(File parent, String child)*/ File file1 = new File("C:\\Users\\Administrator\\Desktop"); File file2 = new File(file1, "a.txt"); System.out.println(file2);//C:\Users\Administrator\Desktop\a.txt }
-
绝对路径:包含盘符号的一个详细路径
相对路径:不包含有盘符号的路径
-
创建一个新文件,第一次创建返回true,重复创建返回false。
public static void main(String[] args) throws IOException { File file = new File("C:\\Users\\Administrator\\Desktop\\b.txt"); //创建一个新的文件,第一次创建成功返回true,重复创建会返回false boolean b = file.createNewFile(); System.out.println(b);//true File file2 = new File("C:\\Users\\Administrator\\Desktop\\b.txt"); boolean newFile = file2.createNewFile(); System.out.println(newFile);//false
-
创建文件夹
public static void main(String[] args) { File file = new File("aa"); //创建单级文件夹,重复创建返回false file.mkdir(); File file3= new File("bb/cc/dd/ee"); //mkdirs() 创建单级或多级文件夹 file3.mkdirs(); }
-
删除文件
public static void main(String[] args) { File file = new File("src/b.txt"); //删除文件,注意不走回收站 boolean b = file.delete(); //delete(); 删除文件夹时,只能删掉空文件夹,非空目录不能删除 System.out.println(b); }
-
重命名
public static void main(String[] args) { File file = new File("C:\\Users\\Administrator\\Desktop\\a.txt"); //renameTo(file1); 有两层作用 //1.如果原来的文件和你传入的这个文件,用的是同一路径,是重命名 //2.如果原来的文件和你传入的这个文件,不是同一路径,就会发生重命名并剪切,把源文件,剪切到你传入的这个文件路径下。 File file1 = new File("C:\\Users\\Administrator\\Desktop\\d.txt"); file.renameTo(file1); }
-
判断功能
public static void main(String[] args) { File file = new File("a.txt"); //判断是否是文件 System.out.println(file.isFile()); //判断是否是目录 System.out.println(file.isDirectory()); File file1 = new File("C:\Users\Administrator\Desktop\aa.txt"); //判断是否可读 System.out.println(file1.canRead()); //判断是否可写 System.out.println(file1.canWrite()); //判断文件是否隐藏 System.out.println(file1.isHidden()); //判断文件是否存在 System.out.println(file1.exists()); //判断是否使用的是绝对路径 System.out.println(file1.isAbsolute()); System.out.println(file.isAbsolute()); }
-
获取功能
public static void main(String[] args) { File file = new File("a.txt"); File file1 = new File("C:\\Users\\Administrator\\Desktop\\aa.txt"); //getName(); 获取文件名 String name = file1.getName(); System.out.println(name);//aa.txt //获取文件的大小 单位是字节 long length = file1.length(); System.out.println(length);//0 //获取文件的绝路径路径,返回的是字符串形式 String absolutePath = file1.getAbsolutePath(); System.out.println(absolutePath);//C:\Users\Administrator\Desktop\aa.txt //获取文件的绝路径路径,返回的是File类型,比较灵活 File absoluteFile = file1.getAbsoluteFile(); System.out.println(absoluteFile.toString()); //C:\Users\Administrator\Desktop\aa.txt //获取相对路径 String path = file.getPath(); System.out.println(path);//a.txt //获取父路径getParent(); 返回的是 字符串的形式 String parent = file1.getParent(); System.out.println(parent);//C:\Users\Administrator\Desktop //getParentFile();获取父路,返回的是File类型 File parentFile = file1.getParentFile(); System.out.println(parentFile);//C:\Users\Administrator\Desktop }
-
获取磁盘空间
public static void main(String[] args) { File file = new File("D:\\"); //获取磁盘的总空间大小,单位字节 long totalSpace = file.getTotalSpace(); System.out.println(totalSpace/1024/1024/1024.0+" GB"); //获取磁盘的剩余空间 long freeSpace = file.getFreeSpace(); System.out.println(freeSpace / 1024 / 1024 / 1024.0 + " GB"); }
-
获取文件更改时间
public static void main(String[] args) { // public long lastModified ():获取最后一次的修改时间,毫秒值 File file1 = new File("C:\\Users\\Administrator\\Desktop\\b.txt"); long l = file1.lastModified(); //把毫秒值,转换成年月日 时分秒 System.out.println(l); Date date = new Date(l); String str = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); System.out.println(str); }
-
获取文件或文件夹的数组
public static void main(String[] args) { /* public String[] list ():获取指定目录下的所有文件或者文件夹的名称数组 public File[] listFiles ():获取指定目录下的所有文件或者文件夹的File数组*/ //需求:判断Desktop目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称 File file = new File("C:\\Users\\Administrator\\Desktop"); String[] list = file.list(); for (String s : list) { File f = new File(file, s); //System.out.println(f); if(f.isFile()&&f.getName().endsWith(".jpg")){ System.out.println(s); } } }
-
将文件夹中的.png文件改为.jpg文件
public static void main(String[] args) { File file = new File("C:\\Users\\Administrator\\Desktop\\test"); File[] file1 = file.listFiles(); for (File s : file1) { if (s.isFile() && s.getName().endsWith(".png")) { String oldpath = s.getAbsolutePath(); String SubString = oldpath.substring(0, oldpath.lastIndexOf(".")); File NewName = new File(SubString + ".jpg"); boolean a=s.renameTo(NewName); System.out.println(a); } } } }