2023.2.22学习日志

一.异常

一、异常的概念

异常:在程序执行的过程中,出现的非正常情况,最终会导致JVM非正常停止

在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处 理异常的方式是中断处理

异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行.

public void printStackTrace() :打印异常的详细信息。 包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。

public String getMessage() :获取发生异常的原因。 提示给用户的时候,就提示错误原因。

public String toString() :获取异常的类型和异常描述信息(不用)。

二、异常的分类

Error:严重错误Error,无法通过处理的错误,只能事先避免

Exception:分为编译器异常和运行时异常

编译期异常,写代码的时候程序出现问题。可以由程序员写的时候解决

Exception也有子类RuntimeException运行期异常,程序运行时可以抛出的异常。

throws抛出异常,交给虚拟机处理,是中断程序执行的

try catch是会把后续代码执行

三、异常的产生过程解析

四、异常处理

1.抛出异常throw关键字

作用:可以使用ts关键字在指定的方法中抛出指定的异常

格式:throw new xxxException(异常原因)

例如:

throw new NullPointerException("要访问的arr数组不存在");

throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围");

注意:1.throw关键字必须写在方法的内部

2.throw关键字后边new的对象必须是Exception的子类对象

3.throw关键字抛出指定的异常对象,我们就必须处理这个异常对象

throw关键字后边创建的是RuntimeException或RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)

throw关键字后边创建的是编译异常(写代码报错)就必须处理这个,要么throws要么try..catch

ArrayIndexOutOfBoundsException数组越界异常,运行期异常

2.声明异常throws

异常处理的第一种方式

作用:当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象

可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(自己 不处理,给别人处理)最终交给JVM处理->中断处理

使用格式:修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{

throw new xxxException(异常原因)....

}

注意:1.throws必须写在方法声明处

2.throws后面生命的异常必须是Exception或Exception的子类对象

3.方法内部如果抛出多个异常对象,那么throws后面也要声明多个异常

如果抛出的异常有父子类关系,直接声明父类异常就行

4.调用了一个声明抛出异常的方法,我们就必须处理声明的异常,

要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM

要么try catch自己处理

public class ThrowsDemo {

public static void main(String[] args) throws FileNotFoundException {

read("a.txt");

}

//定义一个方法,判断文件路径是不是a.txt

// 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明

public static void read(String path) throws FileNotFoundException {

if (!path.equals("a.txt")) {//如果不是 a.txt这个文件

// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw

throw new FileNotFoundException("文件不存在");

//FileNotFoundException是编译时异常

}

}

public class ThrowsDemo {

public static void main(String[] args) throws FileNotFoundException {

read("a.txt");

}

//定义一个方法,判断文件路径是不是a.txt

// 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明

public static void read(String path) throws FileNotFoundException {

if (!path.equals("a.txt")) {//如果不是 a.txt这个文件

// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw

throw new FileNotFoundException("文件不存在");

//FileNotFoundException是编译时异常

}

}

3.捕获异常try…catch

异常处理的第二种方式

public class TryCatchDemo {

public static void main(String[] args) {

try {// 当产生异常时,必须有处理方式。要么捕获,要么声明。

//try中写可能有异常的语句

read("b.txt");

} catch (FileNotFoundException e) {// 括号中需要定义什么呢?

//try中抛出的是什么异常,在括号中就定义什么异常类型

System.out.println(e);

}

System.out.println("over");

}

/*

*

* 我们 当前的这个方法中 有异常 有编译期异常

*/

public static void read(String path) throws FileNotFoundException {

if (!path.equals("a.txt")) {//如果不是 a.txt这个文件

// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw

throw new FileNotFoundException("文件不存在");

}

}

}

二.File流

File类的构造方法

方法名说明

File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例

File(String parent, String child)从父路径名字符串和子路径名字符串创建新的 File实例

File(File parent, String child)从父抽象路径名和子路径名字符串创建新的 File实例

public class FileDemo01 {

public static void main(String[] args) {

//File(String pathname): 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例

File f1 = new File("E:\\FileText\\java.txt");

System.out.println(f1);

//File(String parent, String child): 从父路径名字符串和子路径名字符串创建新的 File实例

File f2 = new File("E:\\FileText","java.txt");

System.out.println(f2);

//File(File parent, String child): 从父抽象路径名和子路径名字符串创建新的 File实例

File f3 = new File("E:\\FileText");

File f4 = new File(f3,"java.txt");

System.out.println(f4);

}

}

绝对路径和相对路径

  • 绝对路径

是一个完整的路径,从盘符开始

  • 相对路径

是一个简化的路径,相对当前项目下的路径

public class FileDemo02 {

public static void main(String[] args) {

// 是一个完整的路径,从盘符开始

File file1 = new File("D:\\itheima\\a.txt");

// 是一个简化的路径,从当前项目根目录开始

File file2 = new File("a.txt");

File file3 = new File("模块名\\a.txt");

}

}

file的成员方法

file的创建方法

方法名说明

public boolean createNewFile()当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 ,文件存在则创建失败返回false,文件夹必须存在

public boolean mkdir()创建由此抽象路径名命名的目录,只能创建单级文件夹,不管有没有后缀

public boolean mkdirs()可以创建单级文件夹也可以创建多级文件夹,不管有没有后缀 只能创建文件夹

public class MapStream {

public static void main(String[] args) throws IOException {

File file = new File("E:\\a.txt");

File file1 = new File("E:\\aaa\\bbb");

File file2 = new File("E:\\aaa\\bbb\\ccc");

//可以创建多级文件夹,也可以创建单级文件夹。若文件夹存在也是返回flase,不管有没有后缀,都是创建文件夹

boolean mkdirs = file1.mkdirs();

//若要创建的文件存在,则创建失败,返回flase,成功返回true

boolean newFile = file.createNewFile();

//创建成功,是会在原有的文件夹基础下继续创建ccc文件夹

boolean mkdirs1 = file2.mkdirs();

System.out.println(newFile);

System.out.println(mkdirs);

System.out.println(mkdirs1);

}

}

public class MapStream {

public static void main(String[] args) throws IOException {

File file = new File("E:\\a.txt");

File file1 = new File("E:\\aaa\\bbb");

File file2 = new File("E:\\aaa\\bbb\\ccc");

//可以创建多级文件夹,也可以创建单级文件夹。若文件夹存在也是返回flase,不管有没有后缀,都是创建文件夹

boolean mkdirs = file1.mkdirs();

//若要创建的文件存在,则创建失败,返回flase,成功返回true

boolean newFile = file.createNewFile();

//创建成功,是会在原有的文件夹基础下继续创建ccc文件夹

boolean mkdirs1 = file2.mkdirs();

System.out.println(newFile);

System.out.println(mkdirs);

System.out.println(mkdirs1);

}

}

file的删除方法

方法分类

方法名说明

public boolean delete()删除由此抽象路径名表示的文件或目录

delete方法的特点:

删除不会走回收站

如果删除的是文件,直接删除,如果删除文件夹只能删除空文件夹,删除有内容的文件夹,只能进入文件夹,删除文件夹中的内容,才能删除该文件夹

如果删除多级文件夹,只能一层一层的删除

file的判断和获取功能

判断功能

方法名说明

public boolean isDirectory()测试此抽象路径名表示的File是否为文件夹

public boolean isFile()测试此抽象路径名表示的File是否为文件

public boolean exists()测试此抽象路径名表示的File是否存在

获取功能

方法名说明

public String getAbsolutePath()返回此抽象路径名的绝对路径名字符串

public String getPath()将此抽象路径名转换为路径名字符串

public String getName()返回由此抽象路径名表示的文件或目录的名称

public File[] listFiles()返回此抽象路径名表示的目录中的文件和目录的File对象数组

etName():

如果是文件夹,获取的就是文件夹名,如果是文件,获取的是文件名+后缀

  • 代码演示

public class MapStream {

public static void main(String[] args) throws IOException {

File file1 = new File("E:\\aaa\\bbb");

//创建多级文件夹,若文件夹存在也是返回flase,不管有没有后缀,都是创建文件夹

boolean mkdirs = file1.mkdirs();

System.out.println("创建"+mkdirs);//创建失败

boolean file = file1.isFile();

System.out.println("文件"+file);//不是文件

boolean directory = file1.isDirectory();

System.out.println("文件夹"+directory);//是文件夹

String name = file1.getName();

System.out.println(name);//文件夹的名称

System.out.println(file1.getAbsolutePath());//文件夹的绝对路径

System.out.println(file1.getPath());//文件夹的路径

System.out.println("存在"+file1.exists());//文件夹是否存在

}

}

结果:

创建false

文件false

文件夹true

bbb

E:\aaa\bbb

E:\aaa\bbb

存在true

高级获取方法listFiles()

listFiles():

进入文件夹,获取该文件夹中的所有的文件夹和文件(包括所有的隐藏文件和隐藏文件夹)

当调用者为null时

放回null

当调用者是一个文件时

方法会返回一个null

当调用者是一个空文件夹时

返回一个长度为0的数组

当调用者是一个有内容的文件夹时

将里面所有的文件和文件夹的路径返回到数组中

file的练习

1、 案例需求

在当前模块下的aaa文件夹中创建一个a.txt文件

实现步骤

创建File对象,指向aaa文件夹

判断aaa文件夹是否存在,如果不存在则创建

创建File对象,指向aaa文件夹下的a.txt文件

创建这个文件

演示代码:

public class FileT1 {

public static void main(String[] args) throws IOException {

File file = new File("aaa");

File file1 = new File(file,"a.txt");

if(file.exists()==false)

{

file.mkdirs();

}

System.out.println( file1.createNewFile());

}

}

2、案例需求

删除一个多级文件夹

实现步骤

定义一个方法,接收一个File对象

遍历这个File对象,获取它下边的每个文件和文件夹对象

判断当前遍历到的File对象是文件还是文件夹

如果是文件,直接删除

如果是文件夹,递归调用自己,将当前遍历到的File对象当做参数传递

参数传递过来的文件夹File对象已经处理完成,最后直接删除这个空文件夹

演示代码:

public class FileT2 {

public static void main(String[] args) throws IOException {

File file1 = new File("E:\\xxx");

deleFiles(file1);

}

private static void deleFiles(File file) {

File[] files = file.listFiles();

for (File file1 : files) {

if(file1.isDirectory())

deleFiles(file1);

else if(file1.isFile()) {

file1.delete();

}

}

System.out.println(file.delete());

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值