------Java培训、Android培训、iOS培训、.Net培训、期待与您交流------
1. 异常的概述:
异常: 在程序的运行过程中出现的错误就是异常
异常的分类:
问题: Throwable
严重问题 Error
非严重问题 Exception
编译期异常: 非RuntimeException
运行期异常: RuntimeException
main方法中的问题:
第一种我们可以对其做处理
第二种情况我们没有对其做处理,没有对其做处理,那么就交给JVM处理了.
jvm处理异常的方式:
打印出异常信息以后,并结束程序
异常的处理方式:
第一种: 使用try...catch语句
第二种: throws
try...catch语句的格式:
完整版:
try{
可能会出现异常的代码
}catch(异常名 变量名){
对异常的处理方式 ;
}finally {
释放资源的代码 ;
}
简化版:
try{
可能会出现异常的代码
}catch(异常名 变量名){
对异常的处理方式 ;
}
注意事项:
(1)try语句中的代码越少越好
(2): 需要在catch语句中做处理,哪怕是一条输出语句也是可以的
try...catch处理异常的第二种格式:
try{
可能会出现问题的代码 ;
}catch(异常名 变量名){
对异常的处理方式 ;
}catch(异常名 变量名){
对异常的处理方式 ;
}
...
注意事项:
1.如果是多个catch,多个异常是平级的关系,那么不存在先后顺序.如果多个catch中出现了子父类的继承关系,那么父类需要放在最后
2.异常信息如果明确了,那么尽量使用明确的异常信息处理
jdk1.7以后对多个异常的处理方式:
格式:
try {
可能出现异常的代码;
}catch(异常名1| 异常名2 | 异常名3... e){
处理方式
}
好处: 简化了代码的书写
弊端: 对多个异常的处理方式是一致的
注意事项:
要求多个异常是平级关系,不能存在子父类的继承关系
编译期异常和运行期异常的区别:
编译期异常必须对其处理,如果不处理,程序无法正常运行.
运行期异常可以对其处理,也可以不处理
运行期异常的父类是: RuntimeException
编译期异常的异常是: Exception
运用try...catch进行捕获异常举例
public class ExceptionTest {
public static void main(String[] args){
// 定义一个日期字符串
String dateStr = "2015-08-10";
// 创建日期格式化类的对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;
// 调用方法
Date date = null ;
try{
date = sdf.parse(dateStr) ;
}catch(ParseException e){
System.out.println("解析日期字符串出问题了...");
}
// 输出
System.out.println(date);
}
}
2.异常的第二种处理方式:直接抛出
异常的第二种处理方式: 使用throws
throws是用在方法上,作用是用来声明对应的异常.就是我这个方法可能会出现异常, 如果你调用我这个方法
就需要对这个异常进行处理,如果你不处理,那么你可以继续往外抛
throw的概述: 在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
throw和throws的区别:
throws: 用在方法上,用来声明这个方法可能存在的异常信息, 也就是说throws后面可能跟多个异常信息,多个异常信息之间使用
","隔开
throw: 使用在方法中,后面给一个异常对象,通过throw抛出一个异常对象.而这个异常对象可以是运行期异常对象,也可是编译期异常对象(如果
是编译期异常对象,那么就需要对其处理,而处理方式有两种第一种使用try...catch语句,第二种通过throws给方法添加声明)
finally的特点:被finally控制的语句体始终被执行
特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
final,finally和finalize的区别
final是一个修饰符: 可以用来修饰类,变量 , 方法
被final修饰的类,不能被子类继承, 被final修饰的变量是一个常量 , 被final修饰的方法不能被子类重写
finally: 用在try...catch语句中, 被finally控制的语句一定会执行
finalize: 是Object类中的一个方法, 当调用System.gc()方法的时候,会调用该方法完成垃圾的回收
如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。
会执行,在return前
异常的注意事项:
a: 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
b: 如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
c: 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
异常到底如何处理:
如果这个异常可以自己处理,那么就尽量不要抛出去,如果自己处理不了,就抛出
3.File类的描述
File类: 是文件或者目录的抽象表示形式
构造方法:
public File(String pathname): 把文件或者路径封装成一个文件对象
public File(String parent, String child): 通过父文件路径和子文件/文件夹来创建一个File对象
public File(File parent, String child): 通过父文件对象和子文件/文件夹来创建一个File对象
File文件类中和创建功能相关的方法:
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
相对路径和绝对路径:
绝对路径: 从盘符开始的路径就是绝对路径
相对路径: 不是从盘符开始的路径就是相对路径
File类中和删除功能相关的方法:
public boolean delete():删除文件或者文件夹
delete在删除的时候不走回收站
在删除的时候不能删除带内容的文件夹,只能删除空文件夹
File类中和重命名相关的方法:
public boolean renameTo(File dest):把文件重命名为指定的文件路径
renameTo特点:
如果目标文件和原文件的路径相同,那么就是重命名
如果目标文件和原文件的路径不相同 , 就剪切并且重命名
File类中和判断功能相关的方法:
public boolean isDirectory(): 判断是否是目录
public boolean isFile(): 判断是否是文件
public boolean exists(): 判断是否存在
public boolean canRead(): 判断是否可读
public boolean canWrite(): 判断是否可写
public boolean isHidden(): 判断是否隐藏
File类中和获取功能相关的方法:
public String getAbsolutePath(): 获取绝对路径
public String getPath(): 获取相对路径
public String getName(): 获取名称
public long length(): 获取长度。字节数
public long lastModified(): 获取最后一次的修改时间,毫秒值
public String[] list(): 获取指定目录下的所有文件或者文件夹的名称数组
public File[] listFiles(): 获取指定目录下的所有文件或者文件夹的File数组
4.File类的举例:
import java.io.File;
import java.io.FilenameFilter;
/*
* 求:判断E:\IO\file目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
* 分析:
* a: 把E:\IO\file封装成一个File对象
* b: 获取以.jpg结尾的文件数组
* c: 遍历数组,直接输出名称
* 成员方法:
* public File[] listFiles(FilenameFilter filter)
* public String[] list(FilenameFilter filter)
*/
public class FileTest {
public static void main(String[] args) {
// 创建File对象
File file = new File("E:\\IO\\file") ;
// 获取以.jpg结尾的文件数组
File[] files = file.listFiles(new FilenameFilter(){
@Override
public boolean accept(File dir, String name) {
// System.out.println(dir + "---" + name);
// File f = new File(dir , name) ;
// boolean flag = f.isFile() && name.endsWith(".jpg") ;
// return flag;
return new File(dir , name).isFile() && name.endsWith(".jpg") ;
}
}) ;
System.out.println("-----------------------------------");
// 遍历数组
for(File f : files){
System.out.println(f.getName());
}
}
}