目录
1:异常(理解)
(1)程序出现的不正常的情况。
(2)异常的体系
Throwable
|--Error 严重问题,我们不处理。这种问题一般都是很严重的,比如说内存溢出
|--Exception
|--RuntimeException 运行期异常,我们需要修正代码
|--非RuntimeException 编译期异常,必须处理的,否则程序编译不通过
(3)异常的处理:
A:JVM的默认处理
把异常的名称,原因,位置等信息输出在控制台,同时会结束程序。
B:自己处理
a: try...catch...finally的处理格式:
try{
可能出现问题的代码;
}catch(异常名 变量) {
针对问题的处理;
}finally {
释放资源;
}
finally:
被finally控制的语句体一定会执行
注意:如果在执行到finally之前jvm退出了,就不能执行了。
用于释放资源,在IO流操作和数据库操作中会见到
变形格式:
try {
可能出现问题的代码;
}catch(异常名 变量) {
针对问题的处理;
}
注意:
A:try里面的代码越少越好
B:catch里面必须有内容,哪怕是给出一个简单的提示
JDK7出现了一个新的异常处理方案:
try{
}catch(异常名1 | 异常名2| ... 变量) {
...
}
注意:这个方法虽然简洁,但是也不够好。
A:处理方式是一致的。(实际开发中,好多时候可能就是针对同类型的问题,给出同一个处理)
B:多个异常间必须是平级关系。
C:异常中要了解的几个方法:
public String getMessage():异常的消息字符串
public String toString():返回异常的简单信息描述
此对象的类的 name(全路径名)
": "(冒号和一个空格)
调用此对象
getLocalizedMessage()方法的结果 (默认返回的是getMessage()的内容)
printStackTrace()获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。把信息输出在控制台。
public class ExceptionDemo {
publicstatic void main(String[] args) {
Strings = "2014-11-20";
SimpleDateFormatsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try{
Dated = sdf.parse(s); // 创建了一个ParseException对象,然后抛出去,和catch里面进行匹配
System.out.println(d);
}catch (ParseException e) { // ParseException e = new ParseException();
//ParseException
//e.printStackTrace();
//getMessage()
//System.out.println(e.getMessage());
//Unparseable date: "2014-11-20"
//toString()
//System.out.println(e.toString());
//java.text.ParseException: Unparseable date: "2014-11-20"
e.printStackTrace();
//跳转到某个指定的页面(index.html)
}
System.out.println("over");
}
}
b:throws
把自己处理不了的,在方法上声明,告诉调用者,这里有问题
格式:
throws 异常类名
注意:这个格式必须跟在方法的括号后面。
注意:
尽量不要在main方法上抛出异常。
但是我讲课为了方便我就这样做了。
小结:
编译期异常抛出,将来调用者必须处理。
运行期异常抛出,将来调用可以不用处理
(4)面试题
A:编译期异常和运行期异常的区别?
编译期异常必须要处理的,否则编译不通过
运行期异常可以不处理,也可以处理
B:throw和throws是的区别
throw:
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
throws:
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
(5)finally关键字及其面试题
A:finally用于释放资源,它的代码永远会执行。特殊情况:在执行到finally之前jvm退出了
B:面试题
a:final,finally,finalize的区别?
final: 最终的意思,可以修饰类,成员变量,成员方法
修饰类,类不能被继承
修饰变量,变量是常量
修饰方法,方法不能被重写
finally: 是异常处理的一部分,用于释放资源。
一般来说,代码肯定会执行,特殊情况:在执行到finally之前jvm退出了
finalize: 是Object类的一个方法,用于垃圾回收
b:如果在catch里面有return,请问finally还执行吗?如果执行,在return前还是后
会,前。准确的说,应该是在中间。
C:异常处理的变形
try...catch...finally
try...catch...
try...catch...catch...
try...catch...catch...fianlly
try....finally
(7)自定义异常
java不可能对所有的情况都考虑到,所以,在实际的开发中,我们可能需要自己定义异常。
而我们自己随意的写一个类,是不能作为异常类来看的,要想你的类是一个异常类,就必须继承自Exception或者RuntimeException
两种方式:
A:继承Exception
B:继承RuntimeException
public class MyExceptionextends Exception {
publicMyException() {
}
publicMyException(String message) {
super(message);
}
}
// public class MyExceptionextends RuntimeException {
//
// }
public class Teacher {
publicvoid check(int score) throws MyException {
if(score > 100 || score < 0) {
thrownew MyException("分数必须在0-100之间");
}else {
System.out.println("分数没有问题");
}
}
//针对MyException继承自RuntimeException
//public void check(int score) {
//if (score > 100 || score < 0) {
//throw new MyException();
//} else {
//System.out.println("分数没有问题");
//}
//}
}
* 自定义异常测试类
public class StudentDemo{
publicstatic void main(String[] args) {
Scannersc = new Scanner(System.in);
System.out.println("请输入学生成绩:");
intscore = sc.nextInt();
Teachert = new Teacher();
try{
t.check(score);
}catch (MyException e) {
e.printStackTrace();
}
}
}
(8)异常的注意实现
A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throw
2:File类(掌握)
(1)IO流操作中大部分都是对文件的操作,所以Java就提供了File类供我们来操作文件
(2)File:文件和目录(文件夹)路径名的抽象表示形式
构造方法
File(Stringpathname): 根据一个路径得到File对象
File(String parent, String child): 根据一个目录和一个子文件/目录得到File对象
File(File parent, String child): 根据一个父File对象和一个子文件/目录得到File对象
------------------------------------------------------------------------------------------------------------------------------------------
A:File file = newFile("e:\\demo\\a.txt");
B:File file = newFile("e:\\demo","a.txt");
C:File file = newFile("e:\\demo");
File file2 = new File(file,"a.txt");
注意:以上三种方式其实效果一样
------------------------------------------------------------------------------------------------------------------------------------------
public class FileDemo {
publicstatic void main(String[] args) {
//File(String pathname):根据一个路径得到File对象
//把e:\\demo\\a.txt封装成一个File对象
Filefile = new File("E:\\demo\\a.txt");
//File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
Filefile2 = new File("E:\\demo", "a.txt");
//File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
Filefile3 = new File("e:\\demo");
Filefile4 = new File(file3, "a.txt");
//以上三种方式其实效果一样
}
}
(3)File类的功能
A:创建功能
public boolean createNewFile(): 创建文件 如果存在这样的文件,就不创建了
public boolean mkdir(): 创建文件夹 如果存在这样的文件夹,就不创建了
public boolean mkdirs(): 创建文件夹,如果父文件夹不存在,会帮你创建出来
public class FileDemo {
publicstatic void main(String[] args) throws IOException {
//需求:我要在e盘目录下创建一个文件夹demo
Filefile = new File("e:\\demo");
System.out.println("mkdir:"+ file.mkdir());
//需求:我要在e盘目录demo下创建一个文件a.txt
Filefile2 = new File("e:\\demo\\a.txt");
System.out.println("createNewFile:"+ file2.createNewFile());
//需求:我要在e盘目录test下创建一个文件b.txt
//Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
//注意:要想在某个目录下创建内容,该目录首先必须存在。
//File file3 = new File("e:\\test\\b.txt");
//System.out.println("createNewFile:" + file3.createNewFile());
//需求:我要在e盘目录test下创建aaa目录
//File file4 = new File("e:\\test\\aaa");
//System.out.println("mkdir:" + file4.mkdir());
//File file5 = new File("e:\\test");
//File file6 = new File("e:\\test\\aaa");
//System.out.println("mkdir:" + file5.mkdir());
//System.out.println("mkdir:" + file6.mkdir());
//其实我们有更简单的方法
Filefile7 = new File("e:\\aaa\\bbb\\ccc\\ddd");
System.out.println("mkdirs:"+ file7.mkdirs());
//看下面的这个东西:
Filefile8 = new File("e:\\liuyi\\a.txt");
System.out.println("mkdirs:"+ file8.mkdirs());
}
}
B:删除功能
public boolean delete()
注意:
A:如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。
B:Java中的删除不走回收站。
C:要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹
public class FileDemo {
publicstatic void main(String[] args) throws IOException {
//创建文件
//File file = new File("e:\\a.txt");
//System.out.println("createNewFile:" + file.createNewFile());
//我不小心写成这个样子了
Filefile = new File("a.txt");
System.out.println("createNewFile:"+ file.createNewFile());
//继续玩几个
Filefile2 = new File("aaa\\bbb\\ccc");
System.out.println("mkdirs:"+ file2.mkdirs());
//删除功能:我要删除a.txt这个文件
Filefile3 = new File("a.txt");
System.out.println("delete:"+ file3.delete());
// 删除功能:我要删除ccc这个文件夹
Filefile4 = new File("aaa\\bbb\\ccc");
System.out.println("delete:"+ file4.delete());
// 删除功能:我要删除aaa文件夹
//File file5 = new File("aaa");
//System.out.println("delete:" + file5.delete());
File file6 = new File("aaa\\bbb");
Filefile7 = new File("aaa");
System.out.println("delete:"+ file6.delete());
System.out.println("delete:"+ file7.delete());
}
}
C:重命名功能
public boolean renameTo(Filedest)
如果路径名相同,就是改名。
如果路径名不同,就是改名并剪切。
路径以盘符开始: 绝对路径 c:\\a.txt
路径不以盘符开始: 相对路径 a.txt
public class FileDemo {
publicstatic void main(String[] args) {
//创建一个文件对象
//File file = new File("林青霞.jpg");
需求:我要修改这个文件的名称为"东方不败.jpg"
//File newFile = new File("东方不败.jpg");
//System.out.println("renameTo:" + file.renameTo(newFile));
File file2 = new File("东方不败.jpg");
FilenewFile2 = new File("e:\\林青霞.jpg");
System.out.println("renameTo:"+ file2.renameTo(newFile2));
}
}
D:判断功能
public boolean isDirectory(): 判断是否是目录
public boolean isFile(): 判断是否是文件
public boolean exists(): 判断是否存在
public boolean canRead(): 判断是否可读
public boolean canWrite(): 判断是否可写
public boolean isHidden(): 判断是否隐藏
public class FileDemo {
publicstatic void main(String[] args) {
//创建文件对象
Filefile = new File("a.txt");
System.out.println("isDirectory:"+ file.isDirectory());// false
System.out.println("isFile:"+ file.isFile());// true
System.out.println("exists:"+ file.exists());// true
System.out.println("canRead:"+ file.canRead());// true
System.out.println("canWrite:"+ file.canWrite());// true
System.out.println("isHidden:"+ file.isHidden());// false
}
}
E:获取功能
publicString getAbsolutePath(): 获取绝对路径
publicString getPath(): 获取相对路径
publicString getName(): 获取名称
publiclong length(): 获取长度。字节数
publiclong lastModified(): 获取最后一次的修改时间,毫秒值
public class FileDemo {
publicstatic void main(String[] args) {
//创建文件对象
Filefile = new File("demo\\test.txt");
System.out.println("getAbsolutePath:"+ file.getAbsolutePath());
System.out.println("getPath:"+ file.getPath());
System.out.println("getName:"+ file.getName());
System.out.println("length:"+ file.length());
System.out.println("lastModified:"+ file.lastModified());
//1416471971031
Dated = new Date(1416471971031L);
SimpleDateFormatsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Strings = sdf.format(d);
System.out.println(s);
}
}
F:高级获取功能
public String[]list(): 获取指定目录下的所有文件或者文件夹的名称数组
public File[]listFiles(): 获取指定目录下的所有文件或者文件夹的File数组
public class FileDemo {
publicstatic void main(String[] args) {
//指定一个目录
Filefile = new File("e:\\");
//public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
String[]strArray = file.list();
for(String s : strArray) {
System.out.println(s);
}
System.out.println("------------");
//public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
File[]fileArray = file.listFiles();
for(File f : fileArray) {
System.out.println(f.getName());
}
}
}
案例:
判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称
分析:
A:封装e判断目录
B:获取该目录下所有文件或者文件夹的File数组
C:遍历该File数组,得到每一个File对象,然后判断
D:是否是文件
是:继续判断是否以.jpg结尾
是:就输出该文件名称
否:不搭理它
否:不搭理它
public class FileDemo {
publicstatic void main(String[] args) {
//封装e判断目录
Filefile = new File("e:\\");
//获取该目录下所有文件或者文件夹的File数组
File[]fileArray = file.listFiles();
//遍历该File数组,得到每一个File对象,然后判断
for(File f : fileArray) {
//是否是文件
if(f.isFile()) {
//继续判断是否以.jpg结尾
if(f.getName().endsWith(".jpg")) {
//就输出该文件名称
System.out.println(f.getName());
}
}
}
}
}
G:过滤器功能
判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称
A:先获取所有的,然后遍历的时候,依次判断,如果满足条件就输出。
B:获取的时候就已经是满足条件的了,然后输出即可。
要想实现这个效果,就必须学习一个接口:文件名称过滤器
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
public class FileDemo2 {
publicstatic void main(String[] args) {
//封装e判断目录
Filefile = new File("e:\\");
//获取该目录下所有文件或者文件夹的String数组
//public String[] list(FilenameFilter filter)
String[]strArray = file.list(new FilenameFilter() {
@Override
publicboolean accept(File dir, String name) {
//return false;
// return true;
// 通过这个测试,我们就知道了,到底把这个文件或者文件夹的名称加不加到数组中,取决于这里的返回值是true还是false
//所以,这个的true或者false应该是我们通过某种判断得到的
//System.out.println(dir + "---" + name);
//File file = new File(dir, name);
System.out.println(file);
//boolean flag = file.isFile();
//boolean flag2 = name.endsWith(".jpg");
//return flag && flag2;
returnnew File(dir, name).isFile() && name.endsWith(".jpg");
}
});
//遍历
for(String s : strArray) {
System.out.println(s);
}
}
}
(4)案例:
A:输出指定目录下指定后缀名的文件名称
a:先获取所有的,在遍历的时候判断,再输出
b:先判断,再获取,最后直接遍历输出即可
B:批量修改文件名称
需求:把E:\评书\三国演义下面的视频名称修改为
00?_介绍.avi
思路: A:封装目录
B:获取该目录下所有的文件的File数组
C:遍历该File数组,得到每一个File对象
D:拼接一个新的名称,然后重命名即可。
public class FileDemo {
public static void main(String[] args) {
// 封装目录
File srcFolder = newFile("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 = newFile(srcFolder, newName); // E:\\评书\\三国演义\\001_桃园三结义.avi
// 重命名即可
file.renameTo(newFile);
}
}
}