异常类(Throwable)
异常:程序在运行的过程中出现了不正常的情况。
异常的分类:
Throwable:
Error:严重的问题,比如内存异常。一般不需要处理。
Exception:
RuntimeException:运行时期异常,一定是我们的代码出问题了。
非RuntimeException:编译时期异常,必须要处理的,否则编译不能通过,报错。
JVM对于异常的默认处理方案
A:把异常的名称,原因以及错误的位置信息等输出在控制台
B:程序从这里停止。
编写处理方案:
try...catch...finally
try...catch...
try...catch...catch...
try...catch...finally...
try...catch...catch...finally...
try...finally...
a:如果是一个异常,可以try...catch.../try...catch...finally...
b:如果是多个异常,可以try...catch...catch.../try...catch...catch...finally...
c:JDk7的新特性:多个异常必须是平级关系
try...catch(Exception1 | Exception2 | Exception3 ... e) {...}
编译时期异常和运行时期异常的区别
A:编译时期异常是必须要进行处理的,否则编译不能通过。
B:运行时期异常可以处理,也可以不处理。
如果不处理,那么,程序还是不能继续执行。
throw和throws的区别
A:throw 用在方法体中,后面跟的是异常对象
如何后面跟的对象属于RuntimeException,那么,在方法上,可以没有throws
如果后面跟的对象属于非RuntimeException,那么,在方法上,必须有throws
B:throws 用在方法声明上,后面跟的是异常类名
我们是如何选择异常处理的呢?
一般来说,异常处理,都是针对编译时期异常做的。
建议:能自己处理的,就自己处理,如果实在处理不了的就抛出。
自定义异常:
A:如果我们出现的问题,是API没有提供对应的异常,那么我们需要自定义异常。
B:怎么着让类才算是一个异常类呢?
a:继承自Exception
b:继承自RuntimeException
C:如何实现异常类的代码呢?
a:如果不想给出任何信息,什么都不用写。
b:如果要给出信息,那么,建议写一个无参构造和一个带参数构造
super(message);
异常细节
A:父类的方法有异常,子类重写父类的方法的异常不能比父类异常更大。
B:父类的方法有多个异常,子类重写父类的方法异常也不能比父类的多或者大。
C:父类的方法如果没有异常,子类重写父类的方法是不能抛出异常的,有异常,也只能try进行处理。
自我体会:
以后看到调用方法的时候,有问题出现,点击鼠标,看到throws或者try...catch任选一种即可。
我的代码
public class Test {public static void main(String[] args) {Teacher t = new Teacher();try {t.checkScore(-20);} catch (MyException e) {e.printStackTrace();}}
}
public class Teacher {public void checkScore(int score) throws MyException {if (score < 0 || score > 100) {throw new MyException("分数越界");} else {System.out.println("分数正常");}}
}
public class MyException extends Exception {public MyException() {}public MyException(String message) {super(message);}
}
文件类(File)
因为IO流操作大部分都是针对文件或者目录的操作,所以,为了方便表示文件或者目录,java就提供了File类供我们使用。
构造方法:
A:File file = new File("D:\\a.txt");
B:File file = new File("D:\\","a.txt");
C:File file = new File("D:\\");
File file2 = new File(file,"a.txt");
成员方法
A:创建功能
public boolean creatNewFile() throws IOException
B:删除功能
public boolean delete()
C:重命名功能
public boolean renameTo(File dest)需要传递的是一个重命名后的路径名称
D:判断功能
public boolean isDirectory():判断该File对象是否是目录
public boolean isFile():判断该File对象是否是文件
public boolean exists():判断该File对象是否存在
public boolean canRead():判断该File对象是否可读
public boolean canWrite():判断该File对象是否可写
public boolean isHidden():判断该File对象是否隐藏
E:基本获取功能
public String getAbsolutePath():获取绝对路径
public String getPath():获取相对路径
public String getName():获取名称
public long length():获取大小,以字节为单位
public long lastModified():获取最后一次修改时间的毫秒值
F:高级获取功能
public String[] list():返回指定目录下的所有文件或者目录的名称(String)数组。
public File[] listFiles():返回指定目录下的所有文件或者目录的File对象数组。
G:带过滤器的获取功能
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
案例:
获取指定目录下的指定后缀名的文件名称。
以d盘目录下的jpg文件为例
我的代码:
import java.io.File;
import java.io.FilenameFilter;
public class FilenameFilterDemo {public static void main(String[] args) {// 封装目录。File srcFolder = new File("D:");// 获取该目录下所有文件和目录的File数组。String[] strArray = srcFolder.list(new FilenameFilter() {public boolean accept(File dir, String name) {return new File(dir, name).isFile() && name.endsWith("jpg");}}// 遍历for (String str : strArray) {System.out.println(str);}}
}
递归
方法定义中调用方法本身的现象
注意事项:
A:递归一定要有出口,否则就是死递归
B:递归次数不能过多,否则内存溢出
C:构造方法不能递归调用
我的代码:
public static void main(String[] args) {// show();show();}public static void show() {show();}
}
案例:
A:递归求阶乘
public class DiGuiDemo {public static void main(String[] args) {System.out.println(jc(5));}public static int jc(int n) {if (n == 1) {return 1;} else {return n * jc(n - 1);}}
}
B:递归删除带内容的目录
import java.io.File;
public class DeleteFolderDemo {public static void main(String[] args) {// 封装目录File srcFolder = new File("test");deleteFolder(srcFolder);}private static void deleteFolder(File srcFolder) {// 获取该目录下所有文件或者目录的File数组File[] fileArray = srcFolder.listFiles(); // [],nullif (fileArray != null) {// 遍历该File数组,得到每一个File对象for (File file : fileArray) {// 判断该File是文件还是目录if (file.isDirectory()) {deleteFolder(file);} else {// 就直接删除。System.out.println(file.getName() + "---" + file.delete());}}System.out.println(srcFolder.getName() + "---" + srcFolder.delete());}}
}