0821总结
异常
1、在程序运行的的时候发生的错误
2、异常其实是一个对象 Throwable
异常的体系结构
Throwable 类 是 Java 语言中所有错误或异常的超类
Error:很严重的错误,一般是jvm报的错, 需要修改源代码(类似于艾滋病,癌症,不做处理)
Exception:这个不是很严重的异常,这种异常必须解决 (类似于感冒,胃疼)
RuntimeException:运行是异常,开发人员不需要去处理,是由jvm来给其处理
jvm 自带处理异常:
1、(位置,时间,异常的信息)打印出来
2、把程序进行终止
jvm 处理异常:如果程序发生了异常,没有任何方法或者是类来处理这个异常,最后就有jvm来处理(踢皮球)
手动处理异常:
1、抛出异常,让调用值去处理(捕获异常)
2、自己处理;处理的五个关键字:try、catch、finally、throw、throws
自己处理异常的几种方法
第一种
try{
有可能发生异常代码
}catch(异常的类型的申明,如:控制针异常,算术异常等){
发生异常之后执行的代码
}
常见的异常:算术异常(ArithmeticException);格式转化异常(ParseException);空指针异常(java.lang.NullPointerException)
执行的流程:
没发生异常的情况:执行try里的代码,不执行catch里的。
发生异常的情况:
catch 申明的异常,满足发生的异常,就会正常执行catch {} 里的代码;如果不满足就不执行
处理多个异常:
try{
有可能发生异常代码
}catch(异常的类型 1 的申明){
发生异常类型 1 之后执行的代码
}catch(异常的类型 2 的申明){
发生异常类型 2 之后执行的代码
}
注意点:
1、catch 里的代码必须与进行匹配,才能满足条件,走 catch 代码块
2、多个 catch 异常的时候,必须先写小的异常,再写大异常
第二种(最常用)
try{
有可能发生异常代码
}catch(异常的类型 1 的申明){
发生异常类型 1 之后执行的代码
}catch(异常的类型 2 的申明){
发生异常类型 2 之后执行的代码
}finally{
不管发生不发生异常都会执行这里面代码
}
注意点:
1、如果遇到 return 关键字,先执行完 finally 里的代码,然后再走 return ,(只有这种方式杀死jvm),其作用是关闭与释放资源(一般是对流资源)
2、在 jdk 1.7 之后 catch 申明可以存在多个异常,用 | 连接
3、在开发中,如果有多个异常:最后都会捕获一个最大是异常即 Exception
4、捕获异常,如果具体到某一种类型的异常,应尽量具体一点,这样方便解决问题
第三种(不常用)
try{
有可能发生异常代码
}finally{
不管发生不发生异常都会执行这里面代码
}
好处:让代码进行分离,结构更加清晰
异常的分类
编译时异常:
1、父类是 Exception
2、必须处理
运行时异常:
1、父类是 RuntimeException
2、可以暂时不处理 (jvm)
异常对象的一些方法
Throwable:是子类,没特别的方法
打印其堆栈信息:
public StackTraceElement[] getStackTrace()
返回此 throwable 的详细消息字符串:public String getMessage()
返回此 throwable 的简短描述: public String toString()
继承中的异常
父类是什么异常,子类跟着写什么异常(这样子不会产生一些不必要的错误)
throw:异常的申明或定义
声明的格式:
throw new NullPointerException(); throw(关键字)+ 具体的异常
好处:可以在方法里声明自己想声明的异常
注意点:
1、 声明的异常必须写在方法里
2、声明的异常必须是Exception 是子类或者是自己
3、声明的异常如果是运行时异常可以不做处理,其它的都要做处理
throws: 抛出异常
好处和是居民 jvm 自己不处理,让调用这去处理h
语法:
throws Exception 也就是 throws 加上具体的异常
注意点:
1、必须写在方法的小括号后面
2、 声明的异常必须是 Exception 其子类或者是自己
处理异常的方式:1、抛出异常 2、捕获
throw 与 throws的区别
1、throw 是异常的申明;而 throws 用于异常抛出
2、throw 确实会发生异常,throws 常定会出现
3、hrow 后面只能够跟 一个 throws 可以跟多个
4、throw 与 throw 搭配使用
自定义异常
自定义异常:继承父类一般分为两种情况 第一个是继承 RuntimeException 第二种是 Exception(常用)
一般自定义异常的名字是:xxxException 以Exception 进行结尾
一般重写其构造
File
是一个文件对象,文件和目录路径名的抽象表示形式,导包是java.io.File
路径:
1、绝对路径,即为根路径(也就是到具体的盘符)
2、相对路径 (也就是有参照物)
Windows根路径也就是其盘符,而NIX: 表示一个斜杠
注意:File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变
File对象的构造方法
public File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例
public File(String parent,String child) parent:表示父级目录路径(字符串), child 表示子目录(字符串)
public File(File parent,String child):表示父级目录路径(文件对象),child 表示子目录(字符串)
注意点:只要有父子关系,必须父目录存在
File的方法
创建:
创建文件: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()
获取文件的名称:public String getName()
返回上一级目录:public String getParent()
文件内容的的长度(字节数):public long length()
返回的是改目录下的第一级的所有文件包括文件夹:public String[] list()
递归
思想就是重复调用自己
若要用递归去计数时,不可以在递归体里面定义初始值,这样每次递归都会将它重新赋予初始值,应该定义成全局的变量
public static long getSum(File file){
if (file!=null){
File []name=file.listFiles();
for (File f:name){
if (f.isDirectory()){
getSum(f);
}else {
sum+=f.length();
}
}
}else {
sum=0;
}
return sum;
}