学习java第十七天
异常:编译运行时发生的错误。
异常的对象是 Throwable
异常的分类
编译时异常: 也就是在运行之前就报错
运行时异常 :编译没有错但运行时报错
Throwable 类是 Java 语言中所有错误或异常的超类
Error 很严重的错误,一般是jvm报的错。(要改源码)
Exception 这个不是很严重的异常,但必须解决。
RuntimeException 运行时异常,开发人员不需要去处理,是由jvm来给其处理
jvm 自带处理异常:
- 位置,时间,异常的信息 打印出来
- 把程序进行终止
异常处理:
jvm处理异常:如果程序发生了异常,方法或者是类只是声明了异常而并没有来处理这个异常,最后由 jvm来处理
手动处理异常:抛出异常,让调用者处理 (捕获异常)
关键字:
try catch finally throw throws
//第一种
try {
可能异常的代码
}catch (异常的类型 声明,比如控制针异常,算术异常等等){
发生异常之后执行 这里面的代码
}
//执行try,没有异常跳过catch,有异常执行catch{}的内容
//也有多个catch形式
try{
可能异常的代码
}catch (异常类型声明1){
发生异常类型1后执行的代码
}catch (异常类型声明2){
发生异常类型2后执行的代码
}
//多个catch时,先写小的异常,在写大的异常
//第二种形式(常用)
try {
有可能发生异常代码
}catch (异常的类型申明){
发生异常类型之后执行的代码
}finally {
不管发生不发生异常都会执行这里面代码
//finally的作用一般是关闭和释放资源
}
//除非在try中已经终止了jvm,
//比如语句:System.exit(0);
//第三种方式: (不常用)
try {
可能异常的代码
}finally {
不管发生不发生异常都会执行这里面代码
//finally的作用一般是关闭和释放资源
}
//这里面并没有catch捕获异常
常见的异常:
ArithmeticException 算术异常:
ParseException 格式转化异常错误
java.lang.NullPointerException 空指针异常
编译时异常:Exception
运行时异常:RuntimeException
throw和throws:
throw:
声明异常的格式: throw new 具体的异常; 这样可以在方法里声明自己想声明的异常
注意点:
- 声明的异常必须写在方法里
- 声明的异常必须是Exception 是子类或者是自己
- 声明的异常如果是运行时异常可以不做处理,其它的都要做处理
throws: 抛出异常
自己不处理,让调用者去处理
语法: throws 具体的异常;
注意点:
- 必须写在方法的小括号后面
- 声明的异常必须是Exception 是子类或者是自己
访问修饰符 返回值类型 方法名() throws 异常类型1,异常类型2{
方法体;
throw new 异常类型1;
}
throw 是异常声明 throws用于异常抛出
throw 确实会发生异常 throws异常不一定会出现
throw后面只能跟一个 throws可以跟多个
throw与throws搭配使用
Throwable:
子类没有什么特别的方法
常规的方法:
public StackTraceElement[] getStackTrace() 打印其堆栈信息,(也就异常信息)
public String getMessage() 返回此 throwable 的详细消息字符串。
public String toString() 返回此 throwable 的简短描述
自定义异常:
继承父类一般分为两种情况
第一个是继承 RuntimeException
第二种是 Exception(常用)
一般是重写父类的构造方法。
//重写父类异常构造方法
//一般自定义异常的名字是:xxxException 以Exception 进行结尾
// 栗子:
public class MyException extends Exception{
public MyException() {
}
public MyException(String s) {
super(s);
}
}
File:文件和目录路径名的抽象表示形式。
导包是java.io.File;
路径:
- 绝对路径 也就是根路劲(也就是到具体的盘符)
- 相对路径 (也就是有参照物)
Windows: 根路径也就是其盘符 UNIX: 表示一个斜杠
注意点:File 类的实例是不可变的;一旦创建File 对象表示的抽象路径名将永不改变
构造方法:
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例
public File(String parent,String child) parent 表示父级目录路径(字符串), child 表示子目录(字符串)
public File(File parent,String child) 表示父级目录路径(文件对象),child 表示子目录(字符串)
创建 :
创建文件的方法:createNewFile()
创建一个文件夹
public boolean mkdir() 创建一个文件夹
public boolean mkdirs() 创建一个文件夹, 如果父目录不存在,一同创建父目录
删除:
public boolean delete() 删除一个文件为空的文件夹,非空文件夹删除不了。
注意点: 不会进电脑垃圾回收站
重命名文件:
public boolean renameTo(File dest)
注意点:如果在同一个目录下,是修改其名字,如果不在同一个的目录下是剪切+修改名字
判断类型:
public boolean exists() 判断这个文件是否存在
public boolean isDirectory() 判断是否是文件夹
public boolean isFile() 是否是一个文件
获取:获取路径 public String getAbsolutePath() 获取文件的其绝对路径
public String getPath() 获取构造方法传递的那个参数的路径 new File(“d:\1.txt”)
public String getName() 获取文件的名称
public String getParent() 返回上一级目录
public long length() 文件内容的的长度(字节数)
public String[] list() 返回的是改目录下的第一级的所有文件包括文件夹
递归:理解的是思想。
方法自己调用自己,而且调用规模越来越小。
效率不高,使用时可能会使栈内存溢出。
总结:学习这个异常的抛出,我了解到Exception是Throwable的子类,抛出时也可以抛出Throwable,那为什么不抛出Throwable呢?