Java 学习(20)--异常 /  IO 流

简介: 异常(Exception)(1)程序出现的不正常的情况。(2)异常的体系Throwable(接口,将异常类对象交给 JVM  来处理)|--Error 严重问题,我们不处理。

异常(Exception)

(1)程序出现的不正常的情况。

(2)异常的体系

Throwable(接口,将异常类对象交给 JVM  来处理)

|--Error 严重问题,我们不处理。(jvm 错误,程序无法处理)

|--Exception  异常     (程序可以处理的异常)

|--RuntimeException   (运行期异常,可以通过逻辑判断进行控制,不需要捕获   处理方法:1.try...catch  2.throws

|-- 其他(受查)异常  (继承自Exception,且不是RuntimeException,必须要捕获)

 

(3)异常的处理:

A:JVM 的默认处理

当系统发生运行异常时,Jvm 会创建一个异常类的对象;查看是否对这个异常进行捕获和处理,若没有,则把异常的名称 ,原因 ,位置等信息输出在控制台,但是程序不能继续执行了。

B:自己处理

a:try...catch...finally

自己编写处理代码 ,后面的程序可以继续执行

b:throws

把自己处理不了的,在方法上声明,告诉调用者,这里有问题

(4)面试题

A:编译期异常和运行期异常的区别 ?

编译期异常必须要处理的,否则编译不通过;运行期异常可以不处理,也可以处理

B:throw 和 throws 的区别

throw:在方法体中 ,后面跟的是异常对象名 ,并且只能是一个   throw  抛出的是一个异常对象,说明这里肯定有一个异常产生了

throws:在方法声明后 ,后面跟的是异常的类名 , 可以是多个  ;throws  是声明方法有异常,是一种可能性,这个异常并不一定会产生,

(5)finally                                                                                  

A:finally 用于释放资源, 它的代码永远会执行。 特殊情况: 在执行到 finally 之前 jvm 退出

B:面试题

a:final,finally,finalize 的 区 别  ?    详解

b: 如果在 catch 里面有 return, 请问 finally 还执行吗 ?如果执行 ,在 return 前还是后    会/ 前(实际上在中间)

C:异常处理的变形    try...catch...finally   /    try...catch...  /  try...catch...catch.../ try...catch...catch...fianlly /  try...finally

(6)自定义异常

继承自 Exception 或者 RuntimeException, 只需要提供无参构造和一个带参构造即可

(7)异常的注意实现

A:父的方法有异常抛出 ,子的重写方法在抛出异常的时候必须要小于等于父的异常

B:父的方法没有异常抛出 ,子的重写方法不能有异常抛出

C:父的方法抛出多个异常 ,子的重写方法必须比父少或者小

 

 IO

File

我们要想实现输入输出操作就必须要知道,java在硬盘上的表现形式,也就是说硬盘上面的文件和文件夹在java中有一个专门的
类来表示:File
;IO 流操作中大部分都是对文件的操作,所以 Java就提供了 File 类供我们来操作文件

(java类: 成员变量,成员方法,构造方法,成员代码块,成员内部类)

构造方法

A:File file = new File("e:\\demo\\a.txt");// 根据一个路径得到 File 对象

B:File file = new File("e:\\demo","a.txt");// 根据一个目录和一个子文件 / 目录得到 File

对象

C:File file = new File("e:\\demo");

File file2 = new File(file,"a.txt");// 根据一个父 File 对象和一个子文件 / 目录得到 File 对象

 

1.File(File parent, String child) : 根据一个File对象和一个文件名创建File对象

2.File(String pathname):根据指定的路径创建File对象
3.File(String parent, String child) : 根据一个路径字符串和一个文件名创建File对象

public class FileDemo1 {
	public static void main(String[] args) throws IOException {
		File file = new File("d:\\test\\a.txt");  //全路径
		
		File file1 = new File("d:\\test", "a.txt"); //真正的路程 , 要创建的文件名 
		
		File file1 = new File("d:\\test");
		File file2 = new File(file1,"a.txt");  //将路径封装到 file 对象里去; 
                                                    //封装好的对象  , 要创建的文件名
		
		//以上三种方式实现的效果是一样的
		
	
		System.out.println(file2);
	}
}
AI 代码解读

 File 类的功能

A:创建功能

    public boolean createNewFile() :根据file对象的路径,创建一个硬盘中的文件或路径, 

                                                        如果没有对应的路径,就会抛出异常 java.io.IOException;

                                                        如果该路径下没有对应文件,则创建成功,返回true;

                                                        如果该文件已经存在则创建失败,返回false

    public boolean mkdir(): 创建一个文件夹,创建成功返回true

                                         如果没有对应的路径,则创建失败,返回false
                                         如果该文件夹已经存在,则创建失败,返回false

    public boolean mkdirs() :创建文件夹,如果路径中的文件夹不存在,就一起创建出来

public class FileDemo2 {
	public static void main(String[] args) throws IOException {
		
		File file = new File("d:\\test\\a.txt");
		System.out.println("createNewFile:" + file.createNewFile());
	
		
		File file = new File("d:\\test\\demo");
		System.out.println("mkdir:" + file.mkdir());
		File file1 = new File("d:\\test\\aaa");
		System.out.println("mkdir:" + file1.mkdir());
		File file2 = new File("d:\\test\\aaa\\bbb");
		System.out.println("mkdir:" + file2.mkdir());
		File file3 = new File("d:\\test\\aaa\\bbb\\ccc");
		System.out.println("mkdir:" + file3.mkdir());
		File file = new File("d:\\test\\aaa\\bbb\\ccc");
		System.out.println("mkdirs:" + file.mkdirs());
		//说明骑白马的不一定是王子
		File file = new File("D:\\test\\a.txt");
		System.out.println("mkdir:" + file.mkdir());
	}
}
AI 代码解读

B:删除功能

     public boolean delete()  :java删除不走回收站,所删除时一定要小心;如果删除时对应的路径名不存在,

则删除失败,返回false;删除此抽象路径名表示的文件或目录。 如果此路径名表示一个目录,则该目录必须为空才能删除。

public class FileDemo3 {
	public static void main(String[] args) throws IOException {
		File file = new File("d:\\test\\aaa\\bbb");
		System.out.println("delete:" + file.delete());
	}
}
AI 代码解读

C:重命名功能

public boolean renameTo(File dest)   :将File对象对应的路径名改为传入的file对象对应路径名

如果重命名前后的两个文件不在同一个文件夹下,则该方法有剪切的效果

    如果路径名相同,就是改名。

    如果路径名不同,就是改名并剪切。

    路径以盘符开始:绝对路径 c:\\a.txt

    路径不以盘符开始:相对路径 a.txt

public class FileDemo4 {
	public static void main(String[] args) throws IOException {
		File file = new File("d:\\test\\lihongxiao.txt");
		File newFileName = new File("d:\\test\\demo\\weiwei.txt");
		System.out.println("renameTo:" + file.renameTo(newFileName));
		File file = new File("aaa.txt");
		file.createNewFile();
		//没有写盘符,叫做相对路径,会在项目的根路径下创建
		File file = new File("aaa\\bbb\\ccc");
		System.out.println("mkdirs:" + file.mkdirs());
            // 相对路径
	
	}
}
AI 代码解读

D:判断功能

public boolean isDirectory() :判断是否是文件夹

public boolean isFile() :判断是否是文件

public boolean exists(): 判 断 是 否 存 在

 public boolean canRead(): 判 断 是 否 可 读

public boolean canWrite() :判断是否可写

public boolean isHidden() :判断是否隐藏

public class FileDemo5 {
	public static void main(String[] args) throws IOException {
		File file = new File("a.txt");
		File file = new File("ccc");
		System.out.println("是否文件夹:" + file.isDirectory());
		File file = new File("aaa");
		System.out.println("canRead:" + file.canRead());
		System.out.println("canWrite:" + file.canWrite());
		
		File file = new File("aaa");
		System.out.println("canRead:" + file.canRead());
		System.out.println("isHidden:" + file.isHidden());
	}
}
AI 代码解读

E:获取功能

public String getAbsolutePath() :获取文件的绝对路径

public String getPath() :获取相对路径

public String getName() :获取名称

public long length() :获取长度。字节数

public long lastModified() :获取最后一次的修改时间,毫秒值

public class FileDemo6 {
	public static void main(String[] args) throws IOException {
		File file1 = new File("aaa\\bbb\\ccc");
		file1.mkdirs();
		File file = new File("aaa\\bbb\\ccc\\weiwei.txt");
		file.createNewFile();
		System.out.println("AbsolutePath:----" + file.getAbsolutePath());
		System.out.println("path:----" + file.getPath());
		System.out.println("fileName:-----" + file.getName());
	
		System.out.println("length:---" + file.length());
		
		Date date = new Date(file.lastModified());
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String format = df.format(date);
		System.out.println(format);
	
	}
}
AI 代码解读

F:高级获取功能

public String[] list() :获取指定目录下的所有文件或者文件夹的名称数组

public File[] listFiles() :获取指定目录下的所有文件或者文件夹的 File数组

public class FileDemo7 {
	public static void main(String[] args) throws IOException {
		
		File file = new File("d:\\");
		for(String name : file.list()) {
			System.out.println(name);
		}
		File file = new File("d:\\");
		for(File file1 : file.listFiles()) {
			System.out.println(file1.getName()+"----"+file1.getAbsolutePath());
		}
	}
}
AI 代码解读

G:过滤器功能

案例:
  判断D盘中是否存在后缀名为.png的文件
  分析:
         1:将D封装到一个File对象中
         2:获取D盘下的所有的文件和文件夹
         3: 从这些文件和文件夹中根据条件遍历查找满足条件的文件

public class FileDemo8 {
	public static void main(String[] args) throws IOException {
		File file = new File("D:\\");
		File[] sonFiles = file.listFiles();
		for(File file2 : sonFiles) {
			String filename = file2.getName();
			if(filename.endsWith(".png") && file2.isFile()) {
				System.out.println(filename);
			}
		}
		
	}
}
AI 代码解读

 方法二:设置条件,查找满足条件的文件

public class FileDemo9 {
	
	public static class MyFilter 
		implements FilenameFilter{
		@Override
		public boolean accept(File dir, String name) {
			if(name.endsWith(".png")){
				return true;
			}
			return false;
		}		
	}
	
	public static void main(String[] args) throws IOException {
		File file = new File("D:\\");
		MyFilter myFilter = new MyFilter();
		String[] list = file.list(new FilenameFilter() {
			
			@Override
			public boolean accept(File dir, String name) {
				// TODO Auto-generated method stub
				return false;
			}
		});
		
		for(String name : list) {
			System.out.println(name);
		}

	}
}
AI 代码解读

总结:输出指定目录下指定后缀名的文件名称

     a:先获取所有的,在遍历的时候判断,再输出

     b: 先判断,再获取,最后直接遍历输出即可

 

 

目录
打赏
0
0
0
0
2
分享
相关文章
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
82 23
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
|
3月前
|
C#
【Azure Function】Function App出现System.IO.FileNotFoundException异常
Exception while executing function: xxxxxxx,The type initializer for 'xxxxxx.Storage.Adls2.StoreDataLakeGen2Reading' threw an exception. Could not load file or assembly 'Microsoft.Extensions.Configuration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the
131 64
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
159 14
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
321 5
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
56 10
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。

热门文章

最新文章