- 我们处理异常的方法: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程序来说的。(这两种流是流的一种划分形式:流向)
- 【流的另一种划分形式:类型】字节流和字符流(方便操作文本)。-------->待续
来源:https://www.cnblogs.com/yc74/p/5465714.html