1、异常(Exception)
程序执行过程中发生中断,我们叫做异常,如果异常。
异常思维导图
1.1、异常的分类
异常分为检查性异常、运行时异常、和错误。
检查性异常:在编译时发生的异常。
运行时异常:编译完成之后触发的异常。
错误:不是异常,系统抛出的错误,程序员无法处理。
所有的异常类都继承于Exception类,Exception是Throwable的子类,Throwable还有一个子类Error。
1.2、异常处理的方式
1.2.1、try-catch处理
语法
try{
可能发生异常的代码;
}catch(Exception e){
e.printStackTrace();
}
try----捕捉
catch—处理
Exception --是处理的异常类型
e --异常变量
e.printStackTrace(); --打印异常信息
如下图代码发生了异常,程序终止了运行,我们需要对其进行处理。
当我们对异常进行处理了,后面的代码也能运行了。
1.2.2、多重处理异常
当一次性可能会发生多种异常,我们需要多重处理,多重处理异常的时候异常类型要按照大小来排序。
语法
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
处理方式
package com.Ex;
import java.util.InputMismatchException;
import java.util.Scanner;
import com.sc.sc;
public class exception2 {
public static void main(String[] args) {
try {
int is = 10/0;
int arr [] = {
1,3};
System.out.println(arr[2]);
} catch (ArithmeticException e) {
System.out.println("被除数不能为0!");
}catch (ArrayIndexOutOfBoundsException e1) {
System.out.println("下标越界!!");
}
}
}
1.2.3、throws/throw抛出异常
throws/throw抛出异常交给上级处理,直到被处理为止。
throws 出现在方法声明上,而throw通常都出现在方法体内。
throws 表示出现异常的一种可能性,并不一定会发生这些异常;
throw则是抛出了异常,执行throw则一定抛出了某个异常对象。
1.3、finally块
finally快,无论发生什么异常,块里的代码都会执行!
除非在try或者catch里面加System.exit(0);直接退出虚拟机。
1.4、异常分为处理可不处理
编译时异常
编译时异常一定要处理,要么try catch住,要么往外抛,谁调用,谁处理,不处理编译器不会让你通过,就无法执行。
运行时异常
不是必须进行try catch的异常,运行时异常一般是由程序员造成的异常,jvm会一直把异常往上抛,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出,最后要么就是线程终止,要么就是主程序终止。
常见运行时异常
除数不能为0异常:ArithmeticException
下标越界异常:ArrayIndexOutOfBoundsException
空指针异常:NullPointerException
错误
指的是系统级别的异常,程序员无法处理。
1.5、自定义异常
自定义异常要继承Exception异常,通过throws/throw进行抛出。
package com.Ex;
public class myException extends Exception {
public myException() {
}
public myException(String msg) {
super(msg);
}
public static void main(String[] args) {
try {
new myException().show(11);
} catch (myException e) {
System.out.println(e.getMessage());
}
}
public void show(int age) throws myException {
if (age < 18) {
throw new myException("未成年!!!");
}
}
}
运行结果
未成年
2、IO流
2.1、file类
file代表目录和文件,主要适用于对目录和文件的操作。
创建一个文件对象
//创建一个文件对象
File file = new File("F:\\");
创建文件
package com.files;
import java.io.File;
import java.io.IOException;
public class file1 {
public static void main(String[] args) throws IOException {
//创建一个文件对象
File file = new File("F:\\zhou.txt");
//判断文件是否存在
if(!file.exists()) {
//不存在就创建一个新文件
file.createNewFile();
}
System.out.println("文件创建成功!");
}
}
文件创建成功!
创建文件夹
package com.files;
import java.io.File;
import java.io.IOException;
public class file1 {
public static void main(String[] args) throws IOException {
//创建一个文件对象
File file = new File("F:\\ss");
//判断文件是否存在
if(!file.exists()) {
//不存在就创建一个新文件夹
file.mkdir();
}
System.out.println("文件夹创建成功!");
}
}
文件夹创建成功!
创建多级目录
package com.files;
import java.io.File;
import java.io.IOException;
public class file1 {
public static void main(String[] args) throws IOException {
//创建一个文件对象
File file = new File("F:\\ss\\dd\\cc\\gg");
//判断文件是否存在
if(!file.exists()) {
//不存在就创建一个新文件夹
file.mkdirs();
}
System.out.println("多级文件夹创建成功!");
}
}
多级文件夹创建成功!
2.1.1、file类常用方法
package com.files;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class file2 {
public static void main(String[] args) {
File file = new File("F:\\zhou.txt");
//判断是否文件是否存在
System.out.println(file.exists());
//判断是否是文件夹
System.out.println(file.isDirectory());
//判断是否是文件
System.out.println(file.isFile());
//获取文件的长度
System.out.println(file.length());
//获取文件的最后一修改时间
long time = file.lastModified();
Date date = new Date(time);
SimpleDateFormat sim = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
System.out.println("文件的最后修改时间为:"+sim.format(date));
//设置文件的修改时间
file.setLastModified(0);
//文件重命名
File file1 = new File("F:\\zbb.txt");
file.renameTo(file1);
System.out.println("文件名字修改成功!");
}
}
运行结果
true
false
true
30
文件的最后修改时间为:2020年08月27日 23时44分39秒
文件名字修改成功!
2.1.2、使用file类递归读取磁盘下所有文件
package com.files;
import java.io.File;
public class file3 {
public static void main(String[] args) {
File file = new File("F:\\");
new file3().search(file);
}
public void search(File file) {
//得到文件夹内的子文件下面的子文件夹
File[] files = file.listFiles();
//如果时目录就进去循环
if (file.isDirectory()) {
//遍历文件夹
for (File file2 : files) {
//遍历所有不是隐藏文件夹
if (!file2.isHidden()) {
System.out.println(file2.getPath() + file2.length() + "字节");
//反复调用方法
search(file2);
}
}
}
}
}
运行结果
F:\附加作业-秒表0字节
F:\附加作业-秒表\.project977字节
F:\附加作业-秒表\css0字节
F:\附加作业-秒表\img0字节
F:\附加作业-秒表\js0字节
F:\附加作业-秒表\计时器已完成.html1768字节
F:\附加作业-秒表\计时器未完成.html2475字节
2.2、流(Stream)的介绍
流是一连串流动的数据,不同介质之间有数据交互的时候可以使用流,数据源可以是文件,还可以是数据库,网络甚至是其他的程序,以先进先出的方式发送和接收数据的通道。
举个例子:站在文件的角度来说,读取文件叫做输入流,向文件写入东西叫做输出流。
2.3、流的分类
流分为输出流和输入流,由于传输的格式不同分为字节流和字符流。
输出流:读取文件信息。
输入流:向文件写入信息。
字节流:指8位的通用字节流,以字节为基本单位,在java.io包中,对于字节流进行操作的类大部分继承于InputStream(输入字节流)类和OutputStream(输出字节流)类;
字符流:指16位的Unicode字符流,以字符(两个字节)为基本单位,非常适合处理字符串和文本,对于字符流进行操作的类大部分继承于Reader(读取流)类和Writer(写入流)类。
2.4、字节流
2.4.1、FileInputStream类读取文件
FileInputStream是字节输入流继承于InputStream。
它的作用是将文件中的数据输入到内存中,我们可以利用它来读文件;
由于它属于字节流,因此在读取Unicode字符(如中文)的文件时可能会出现问题。
package com.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class fileinput {
public static void main(String[] args) throws IOException {
//创建文件对象
File file = new File("f:\\zbb.txt");
//创建文件输入流对象
FileInputStream fis = new FileInputStream(file);
//创建字节数组
byte [] by = new byte[(int) file.length()];
//将读取的数据放到字节数组中
fis.read(by);
//将数组中的数据转换成字符串
System.out.println(new String(by));
//使用完流记得关闭
fis.close();
}
}
运行结果
sdfsdfsdfsdf
sdfsdfsd
sdfsdf
2.4.2、使用FileOutputStream写文件
FileOutputStream类称为文件输出流,继承于OutputStream类,是进行文件写操作的最基本类;
它的作用是将内存中的数据输出到文件中,我们可以利用它来写文件。
package com.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class fileOutPutS {
public static void main(String[] args) throws IOException {
//创建文件对象
File file = new File("f:\\zbb.txt");
//创建文件输出流对象 ,附加第二个参数true,指定进行文件追加,默认为不追加
FileOutputStream fos = new FileOutputStream(file,true);
//创建数据源
String str = "helloword";
//将字符串转换成byte数组
char[] charArray = str.toCharArray();
//遍历byte数组,将数据写入到输出流
for (int i = 0; i < charArray.length; i++) {
fos.write(charArray[i]);
}
fos.close();
System.out.println("写入数据成功!");
}
}
运行结果
写入数据成功!
2.4.3、使用文件输出流输入流复制文件
package com.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class cope {
public static void main(String[] args) throws IOException {
//创建源文件对象
File file = new File("f:\\zbb.txt");
//创建目标文件对象
File file2 = new File("f:\\zhou.txt");
if(!file2.exists()) {
file2.createNewFile();
}
//使用源文件创造输入流对象
FileInputStream fis = new FileInputStream(file);
//使用目标文件创建输出流对象
FileOutputStream fos = new FileOutputStream(file2);
//创建字节数组用于缓冲
byte [] by = new byte[1024];
//循环从输入流中读取数据,如果读到-1说明没有数据可读取
while (fis.read(by)!=-1) {
//写入到文件输出流中
fos.write(by);
}
System.out.println("复制成功!");
fis.close();
fos.close();
}
}
输出结果
复制成功!
2.5、字符流
字节输入输出流可以高效的读写文件,对于Unicode编码的文件可能出现乱码,所以我们使用字符流来解决这个问题。
字符流主要涉及到以下四个类
FileReader类和FileWriter类;
BufferedReader类和BufferedWriter类。
2.5.1、FileReader读取文件
FileReader 是Reader子类,称为文件读取流,允许以字符流的形式对文件进行读操作。
package com.io;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class fileReaders {
public static void main(String[] args) throws IOException {
//创建文件对象
File file = new File("f:\\zhou.txt");
//创建文件读取流对象
FileReader fr = new FileReader(file);
//创建字符数组,长度是文件的长度
char [] c = new char[(int) file.length()];
//将读取的数据存到字符数组中
fr.read(c);
//将字符数组以字符串的形式输出
System.out.println(new String(c));
}
}
2.5.2FileWrite写文件
FileWriter类称为文件写入流,以字符流的形式对文件进行写操作。
package com.io;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class write {
public static void main(String[] args) throws Exception {
//创建文件对象
File file = new File("F:\\zz.txt");
//文件不存在就创建
if(!file.exists()) {
file.createNewFile();
}
//创建文件写入流对象
FileWriter fWriter = new FileWriter(file);
//以字符流的形式把数据写入到文件中
String str = "asdasdasdfasfa";
char[] chars = str.toCharArray();
fWriter.write(chars);
fWriter.close();
}
}
2.5.3、字符流复制文件
package com.io;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class cope1 {
public static void main(String[] args) throws Exception {
// 创建源文件对象
File file = new File("f:\\zbb.txt");
// 创建目标文件对象
File file2 = new File("f:\\z1.txt");
if (!file2.exists()) {
file2.createNewFile();
}
FileReader fReader = new FileReader(file);
FileWriter fWriter = new FileWriter(file2);
//创建一个字符数组
char [] c= new char[1024];
while(fReader.read(c)!=-1) {
fWriter.write(c);
}
System.out.println("复制成功!");
fWriter.close();
fReader.close