Day 8
1. 异常
-
即非正常情况,即程序出现的错误
-
-
异常(Exception):合理的应用程序可能需要捕获的问题,可被解决,举例:
NullPointerException
(空指针引用,当一个空引用调用对应方法时)- 运行时异常:异常子类继承的直接父类是RunTimeException,发生概率较小,可处可不处
- 编译时异常:异常子类继承的直接父类不是RunTimeException,发生概率较大,开发人员必须处理
-
错误(Error):JVM系统内部错误、资源耗尽等严重问题,不可解决,合理的应用程序不应该试图捕获的问题,举例:
StackOverFlowError
-
JVM默认处理异常的方式:在控制台打印错误信息,并终止程序
-
开发中异常的处理方式
-
try···catch(finally)
:捕获,自己处理- 处理完异常之后,程序会继续执行
- finally
- 以后开发中,如果想关闭一些消耗系统资源的变量,就把关闭代码写在finally中
-
throws
:抛出,交给调用者处理
-
public class Test {
public static void main(String[] args) {
try{
int a=10/0; //被除数不能为0的异常,ArithmeticException
System.out.println("a:"+a);
}catch(Exception e){ //catch后的括号里是被检测代码可能出现的异常名称,Exception是最大的异常类总名称,这里也可写成(ArithmeticException ae)
e.printStackTrace(); //打印异常信息
System.out.println("异常!被除数不能为0,具体异常为:"+e.getMessage());
return;
}finally {
System.out.println("程序执行完成"); //finally中的代码一定会被执行
}
System.out.println("后续程序执行代码");
}
}
/**
异常!被除数不能为0
程序执行完成
*/
public class Test {
public static void main(String[] args) throws Exception{
//抛出异常解决方案
//方案一,接着抛出异常给JVM
show();
}
public static void show() throws Exception{
int a=10/0;
System.out.println("a:"+a);
}
}
/**
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.zj.Day10.note.Test.show(Test.java:12)
at com.zj.Day10.note.Test.main(Test.java:9)
*/
public class Test {
public static void main(String[] args) {
//抛出异常解决方案
//方案二,捕获异常
try {
show();
} catch (Exception e) { //可写多个catch
System.out.println("代码出问题了");
}
}
public static void show() throws Exception{
int a=10/0;
System.out.println("a:"+a);
}
}
/**
代码出问题了
*/
-
自定义异常
需求:学生年龄小于0时抛出异常
/*
自定义异常类
*/
public class AgeException extends Exception{
public AgeException(String message) {
super(message);
}
}
/*
测试类
*/
public class Test {
public static void main(String[] args)throws AgeException{
Student s1=new Student();
s1.setAge(-2);
if(s1.getAge()<0){
throw new AgeException("年龄不合法");
}
}
}
/*
Exception in thread "main" com.zj.Day12.AgeException: 年龄不合法
at com.zj.Day12.test.main(test.java:8)
*/
2. IO流
-
按数据流分向:
- 输入流
- 输出流
-
按操作方式分:
-
字节流
-
InputStream
FileInputStream
BufferedInputStream
-
OutputStream
FileOutputStream
BufferedOutputStream
-
-
字符流
-
Reader
FileReader
BufferedReader
-
Writer
FileWriter
BufferedWriter
-
-
2.1 File类
-
文件,文件夹,一个File对象代表磁盘上的某个文件或文件夹
-
构造方法
File(String pathname)
File(String parent,String child)
File(File parent,String child)
-
成员方法
createNewFile()
:创建文件mkdir()
和mkdirs()
:创建目录isDirectory()
:判断File对象是否为目录isFile()
:判断File对象是否为文件exists()
:判断File对象是否存在
public class Test {
public static void main(String[] args) throws IOException {
//创建File对象
//方式一
File file1=new File("D:\\ProgramFile\\IO\\file1.txt");
boolean flag0=file1.createNewFile(); //防止路径异常,所以这边需要抛出异常
System.out.println(flag0);
//方式二
File file2=new File("D:\\ProgramFile\\IO\\","file2.txt");
boolean flag4=file2.createNewFile(); //防止路径异常,所以这边需要抛出异常
System.out.println(flag4);
//方式三
File file3=new File("D:\\ProgramFile\\IO\\file3");
File file4=new File(file3,"file3.txt");
boolean flag5=file3.mkdir(); //防止路径异常,所以这边需要抛出异常
boolean flag6= file4.createNewFile(); //防止路径异常,所以这边需要抛出异常
System.out.println(flag5+" "+flag6);
//创建file4.txt
File file5=new File("D:\\ProgramFile\\IO\\file4.txt");
boolean flag1=file5.createNewFile(); //防止路径异常,所以这边需要抛出异常
System.out.println(flag1);
//创建文件夹
File file6=new File("D:\\ProgramFile\\IO\\dir1");
boolean flag2=file6.mkdir();
System.out.println(flag2);
//创建多层文件夹
File file7 =new File("D:\\ProgramFile\\IO\\dir1\\dir2");
boolean flag3=file7.mkdirs();
System.out.println(flag3);
System.out.println("测试file6文件是不是文件夹:"+file6.isDirectory());
System.out.println("测试file2文件是不是文件:"+file2.isFile());
System.out.println("测试文本file1(file1.txt)是否存在:"+file1.exists());
System.out.println("测试文本file2(file2.txt)是否存在:"+file2.exists());
System.out.println("测试文件file3是否存在:"+file3.exists());
System.out.println("测试文本file4(file3.txt)是否存在:"+file4.exists());
System.out.println("测试文本file5(file4.txt)是否存在:"+file5.exists());
}
}
/**
true
true
true true
true
true
true
测试file6文件是不是文件夹:true
测试file2文件是不是文件:true
测试文本file1(file1.txt)是否存在:true
测试文本file2(file2.txt)是否存在:true
测试文件file3是否存在:true
测试文本file4(file3.txt)是否存在:true
测试文本file5(file4.txt)是否存在:true
*/
- 成员方法
-
getAbsolutePath()
:获取绝对路径,绝对路径:以盘符开头的路径- 例如:D:/1.txt
-
getPath()
:获取文件的相对路径,相对路径:一般是相对于当前项目路径来讲的- 例如:1.txt
-
getName()
:获取文件名 -
list()
:获取指定目录下所有文件(夹)名称数组 -
listFiles()
:获取指定目录下所有文件(夹)File数组
-
public class Test {
public static void main(String[] args) throws IOException {
File file1 = new File("D:\\ProgramFile\\IO\\file4.txt");
// boolean flag1 = file1.createNewFile(); //防止路径异常,所以这边需要抛出异常
// System.out.println(flag1); //文件创建成功之后会返回一个true
//获取file1的绝对路径
String ap = file1.getAbsolutePath();
System.out.println(ap);
//获取file6的相对路径
String pa = file1.getPath();
System.out.println(pa); //从项目的路径开始
//获取文件名
String filename = file1.getName();
System.out.println(filename);
//获取指定目录下所有文件(夹)名称数组
File file2 = new File("D:\\ProgramFile");
String[] filelist = file2.list();
for (String s : filelist) {
System.out.println(s+" ");
}
System.out.println();
//获取指定目录下所有文件(夹) File数组
File[] files = file2.listFiles();
for (File file : files) {
System.out.println(file.getAbsolutePath());
}
}
}
/**
D:\ProgramFile\IO\file4.txt
D:\ProgramFile\IO\file4.txt
file4.txt
09.IO流.pdf
debug.log
demo1
demo1改
idea
IO
jdk8
notepad
projectidea
shop_demo
student_demo.rar
typora
video2021
video2022
参考集合1
毕设
集合案例(1).doc
集合案例(2).docx
D:\ProgramFile\09.IO流.pdf
D:\ProgramFile\debug.log
D:\ProgramFile\demo1
D:\ProgramFile\demo1改
D:\ProgramFile\idea
D:\ProgramFile\IO
D:\ProgramFile\jdk8
D:\ProgramFile\notepad
D:\ProgramFile\projectidea
D:\ProgramFile\shop_demo
D:\ProgramFile\student_demo.rar
D:\ProgramFile\typora
D:\ProgramFile\video2021
D:\ProgramFile\video2022
D:\ProgramFile\参考集合1
D:\ProgramFile\毕设
D:\ProgramFile\集合案例(1).doc
D:\ProgramFile\集合案例(2).docx
*/
2.2 字符流
- 字符流读取,按字符读取
- 字符流读取,按字符数组读取
- 字符流读取,按字符数组读取,用while循环优化
- 字符流写数据
- IO流拷贝文件
- 字符缓冲流拷贝文件的标准代码
- 字符缓冲流一次读写一行的方式
2.3 字节流
- 一次读取一个字节的字节流
- 一次读取一个字节数组的字节流
- 字节缓冲流拷贝文件的标准代码