JAVA 笔记(十一)
- 我们处理异常的方法:1.try……catch……finally 2.throws
- Try…catch….finally的格式try{可能出现问题的代码}catch(异常名 变量){针对问题的处理}finally{释放资源}【finally部分可以不要】注意try里面的代码越少越好,因为占用资源B:cath里面最好有内容,没有内容就是讲异常隐藏了。给出一个提示也行。
- 当有一个try多个catch的时候【格式try{}catch(){}catch(){}…】,一旦try里面出现了问题,就会把这里的问题给抛出去,然后和catch里面的问题进行匹配,一旦有匹配的,就执行catch里面的处理,就结束了try…catch,继续执行后面的语句。
- 如果不知道异常名就用exception,它可以接收所有的异常。【但是需要注意的是:1.能明确的尽量明确,不要用大的来处理,因为这样效率高。2.平级关系的异常谁在前谁在后无所谓,但是出现了父子关系的异常,父类必须要放在后面】。
- Jdk7的新特性(处理多个异常):try{}catch(异常名1 |异常名2|…..变量){处理}。这种方式虽然很简单,但是处理方式是一样的,没有给出具体哪一个,同时异常之间必须是平级关系。
- 除了运行时期异常和其子类,其余异常都是编译时期异常。
- 编译时期异常:java程序必须显示处理,否则程序就会发生错误,无法通过编译。运行时期异常:无需显示处理,也可以和编译时异常一样处理。【printStackTrace()】
- 在try里面发现问题后,jvm会帮我们生成一个异常对象,然后把这个对象抛出,和catch里面的类进行匹配。如果该对象是某个类型的,就会执行catch里面的处理信息。
- Throws 异常类名 注意:这个格式必须跟在方法的括号后面。【尽量不要在main方法上抛出异常,这样没有太大意义】
- 编译期抛出异常,将来调用者必须处理。运行期抛出异常,将来调用者可以不处理。
- Throws后面可以跟多个异常名,用逗号隔开。
- 在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出【注意不是throws】。
- Throw:如果出现了异常情况,我们就可以把该异常抛出,这个时候抛出的应该是异常的对象。
- Throws和throw的区别
throws
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
后续程序需要继续运行就try
后续程序不需要继续运行就throws
- Finally:被其控制的语句体一定会被执行,但是如果在执行到finally之前jvm退出了【例如System.exit(0)】,就不能执行了。Finally还可以释放资源。
- 如果catch里面有return语句,finally里面的代码依然会执行,是在return之前,准确的说是在return中间。只能有一条语句可以返回。
- Try…..finally:这种写法是为了释放资源,并不是处理异常。
- Java不可能对所有的异常都能考虑到,所以在实际的开发中,我们需要自己去定义异常。我们随意写的一个类,是不能作为异常类来看待的,要想你的类是一个异常类,就必须继承Exception(编译时期)或者RuntimeException(运行时期)。
- 编译时的异常在throw后依然要抛出异常【需要throws一下货这try…catch】运行时的异常在throw后就不需要了。
- 自定义异常就是有构造方法就行了,无参数不好显示异常信息,带参数就是为了显示异常信息,输出到控制台。
- 异常的注意事项
子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
最后的结果是30
最后的结果是30 public class FinallyDemo2 { public static void main(String[] args) { System.out.println(getInt()); } public static int getInt() { int a = 10; try { System.out.println(a / 0); a = 20; } catch (ArithmeticException e) { a = 30; return a; /* * return a在程序执行到这一步的时候,这里不是return a而是return 30;这个返回路径就形成了。 * 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40 * 再次回到以前的返回路径,继续走return 30; */ } finally { a = 40; return a;//如果这样结果就是40了。 } // return a; } } 432. 自定义异常代码 package hhxu.edu; public class MyException extends Exception{ public MyException() { } public MyException(String str) { super(str); } } public class Teacher { public static void check(int score)throws MyException{ if(score>100||score<0){ throw new MyException("你输入的数据有问题"); } else{ System.out.println("数据合法!!!"); } } } import java.util.Scanner; public class TestDemo { public static void main(String[] args){ Scanner sc=new Scanner(System.in); System.out.println("亲输入成绩:"); Teacher t=new Teacher(); int num=sc.nextInt(); try{ t.check(num); }catch(MyException e){ e.printStackTrace(); } } } 433. 获取指定的文件代码 package meishigan; import java.io.File; public class HuoQu { public static void main(String[] args) { File file=new File("e:\\"); File[] fl=file.listFiles(); for(File f:fl){ if(f.isFile()){ String str=f.getName(); if(str.endsWith(".txt")){ System.out.println(f.getName()); } } } } } 另一种方式:package meishigan; import java.io.File; import java.io.FilenameFilter; public class HuoQu { public static void main(String[] args) { File file = new File("e:\\"); String[] str = file.list(new FilenameFilter(){ public boolean accept(File dir, String name) { return new File(dir, name).isFile() && name.endsWith(".txt"); } }); for (String s : str) { System.out.println(s); } } } 434. 同一个文件重命名 package cn.itcast_09; import java.io.File; /* * 需求:把E:\评书\三国演义下面的视频名称修改为 * 00?_介绍.avi * 思路: * A:封装目录 * B:获取该目录下所有的文件的File数组 * C:遍历该File数组,得到每一个File对象 * D:拼接一个新的名称,然后重命名即可。 */ public class FileDemo { public static void main(String[] args) { // 封装目录 File srcFolder = new File("E:\\评书\\三国演义"); // 获取该目录下所有的文件的File数组 File[] fileArray = srcFolder.listFiles(); // 遍历该File数组,得到每一个File对象 for (File file : fileArray) { // System.out.println(file); // E:\评书\三国演义\三国演义_001_[评书网-今天很高兴,明天就IO了]_桃园三结义.avi // 改后:E:\评书\三国演义\001_桃园三结义.avi String name = file.getName(); // 三国演义_001_[评书网-今天很高兴,明天就IO了]_桃园三结义.avi int index = name.indexOf("_"); String numberString = name.substring(index + 1, index + 4); // System.out.println(numberString); // int startIndex = name.lastIndexOf('_'); // int endIndex = name.lastIndexOf('.'); // String nameString = name.substring(startIndex + 1, endIndex); // System.out.println(nameString); int endIndex = name.lastIndexOf('_'); String nameString = name.substring(endIndex); String newName = numberString.concat(nameString); // 001_桃园三结义.avi // System.out.println(newName); File newFile = new File(srcFolder, newName); // E:\\评书\\三国演义\\001_桃园三结义.avi // 重命名即可 file.renameTo(newFile); } } } package cn.itcast_03; import java.io.File; /* * 需求:请大家把E:\JavaSE目录下所有的java结尾的文件的绝对路径给输出在控制台。 * * 分析: * A:封装目录 * B:获取该目录下所有的文件或者文件夹的File数组 * C:遍历该File数组,得到每一个File对象 * D:判断该File对象是否是文件夹 * 是:回到B * 否:继续判断是否以.java结尾 * 是:就输出该文件的绝对路径 * 否:不搭理它 */ public class FilePathDemo { public static void main(String[] args) { // 封装目录 File srcFolder = new File("E:\\JavaSE"); // 递归功能实现 getAllJavaFilePaths(srcFolder); } private static void getAllJavaFilePaths(File srcFolder) { // 获取该目录下所有的文件或者文件夹的File数组 File[] fileArray = srcFolder.listFiles(); // 遍历该File数组,得到每一个File对象 for (File file : fileArray) { // 判断该File对象是否是文件夹 if (file.isDirectory()) { getAllJavaFilePaths(file); } else { // 继续判断是否以.java结尾 if (file.getName().endsWith(".java")) { // 就输出该文件的绝对路径 System.out.println(file.getAbsolutePath()); } } } } }
File:文件或者目录(文件夹)路径名的抽象表现形式。【未必是真实存在的】。
- Mkdir():创建文件夹,如果这个文件夹已存在,就不创建了。Midirs()也是创建文件夹,如果父类文件夹不存在,会帮你创建出来。
- 创建文件的方法也是一样的【指的是通429】。
- 要想在某个目录下创建内容,该目录首先的存在。创建内容有异常抛出,创建文件夹没有异常抛出。
- 如果你创建文件或者目录的时候,忘记了写盘符路径,那么默认路径就是当前项目路径。
- Java中的删除不走回收站,删除文件夹,必须文件夹是空的。【就是里面没有文件或者文件夹】。
- RenameTo()改名:如果路径相同就直接改名了,如果路径不相同,就是剪切并改名。
- 文件的length()方法:获取的长度是字节数。LastModified(),刚方法是获取文件最后一次修改的时间,返回的是毫秒数。
- Yyyy—MM—dd HH:mm:ss
- 自定义异常代码
package hhxu.edu; public class MyException extends Exception{ public MyException() { } public MyException(String str) { super(str); } } public class Teacher { public static void check(int score)throws MyException{ if(score>100||score<0){ throw new MyException("你输入的数据有问题"); } else{ System.out.println("数据合法!!!"); } } } import java.util.Scanner; public class TestDemo { public static void main(String[] args){ Scanner sc=new Scanner(System.in); System.out.println("亲输入成绩:"); Teacher t=new Teacher(); int num=sc.nextInt(); try{ t.check(num); }catch(MyException e){ e.printStackTrace(); } } }
- 获取指定的文件代码
package meishigan; import java.io.File; public class HuoQu { public static void main(String[] args) { File file=new File("e:\\"); File[] fl=file.listFiles(); for(File f:fl){ if(f.isFile()){ String str=f.getName(); if(str.endsWith(".txt")){ System.out.println(f.getName()); } } } } } 另一种方式:package meishigan; import java.io.File; import java.io.FilenameFilter; public class HuoQu { public static void main(String[] args) { File file = new File("e:\\"); String[] str = file.list(new FilenameFilter(){ public boolean accept(File dir, String name) { return new File(dir, name).isFile() && name.endsWith(".txt"); } }); for (String s : str) { System.out.println(s); } } }
- 同一个文件重命名
-
package cn.itcast_09; import java.io.File; /* * 需求:把E:\评书\三国演义下面的视频名称修改为 * 00?_介绍.avi * 思路: * A:封装目录 * B:获取该目录下所有的文件的File数组 * C:遍历该File数组,得到每一个File对象 * D:拼接一个新的名称,然后重命名即可。 */ public class FileDemo { public static void main(String[] args) { // 封装目录 File srcFolder = new File("E:\\评书\\三国演义"); // 获取该目录下所有的文件的File数组 File[] fileArray = srcFolder.listFiles(); // 遍历该File数组,得到每一个File对象 for (File file : fileArray) { // System.out.println(file); // E:\评书\三国演义\三国演义_001_[评书网-今天很高兴,明天就IO了]_桃园三结义.avi // 改后:E:\评书\三国演义\001_桃园三结义.avi String name = file.getName(); // 三国演义_001_[评书网-今天很高兴,明天就IO了]_桃园三结义.avi int index = name.indexOf("_"); String numberString = name.substring(index + 1, index + 4); // System.out.println(numberString); // int startIndex = name.lastIndexOf('_'); // int endIndex = name.lastIndexOf('.'); // String nameString = name.substring(startIndex + 1, endIndex); // System.out.println(nameString); int endIndex = name.lastIndexOf('_'); String nameString = name.substring(endIndex); String newName = numberString.concat(nameString); // 001_桃园三结义.avi // System.out.println(newName); File newFile = new File(srcFolder, newName); // E:\\评书\\三国演义\\001_桃园三结义.avi // 重命名即可 file.renameTo(newFile); } } }
- 递归就是方法中调用方法本身,所以要想实现递归就得有方法。
- 递归实现找到指定目录下所有的java文件。
package cn.itcast_03; import java.io.File; /* * 需求:请大家把E:\JavaSE目录下所有的java结尾的文件的绝对路径给输出在控制台。 * * 分析: * A:封装目录 * B:获取该目录下所有的文件或者文件夹的File数组 * C:遍历该File数组,得到每一个File对象 * D:判断该File对象是否是文件夹 * 是:回到B * 否:继续判断是否以.java结尾 * 是:就输出该文件的绝对路径 * 否:不搭理它 */ public class FilePathDemo { public static void main(String[] args) { // 封装目录 File srcFolder = new File("E:\\JavaSE"); // 递归功能实现 getAllJavaFilePaths(srcFolder); } private static void getAllJavaFilePaths(File srcFolder) { // 获取该目录下所有的文件或者文件夹的File数组 File[] fileArray = srcFolder.listFiles(); // 遍历该File数组,得到每一个File对象 for (File file : fileArray) { // 判断该File对象是否是文件夹 if (file.isDirectory()) { getAllJavaFilePaths(file); } else { // 继续判断是否以.java结尾 if (file.getName().endsWith(".java")) { // 就输出该文件的绝对路径 System.out.println(file.getAbsolutePath()); } } } } }
- 增强for的目标不能是null,所以可以先判断一下。
- 输出流【java程序到硬盘】(写入数据)输入流【硬盘到Java程序】(读取数据)这里的出和入都是相对于java程序来说的。(这两种流是流的一种划分形式:流向)
- 【流的另一种划分形式:类型】字节流和字符流(方便操作文本)。-------->待续