Java 异常与IO流

一、异常

  想想一下代码会发生什么?

1public static void main(String[] args) { 2 3 int a = 10; 4 int b = 0; 5 System.out.println(a/b); 6 System.out.println("程序结束"); 7 }

我们都知道,当分母不能为0,所以程序会报错,这是非编译错误。

1、异常的概念:

程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。

异常是程序中的一些错误,比如说,你的代码少了一个分号,那么运行出来的结果是提示是错误:Java lang Error ;如果你用System.out.println(11/0),那么你是因为你用了0做了除数,会抛出java.lang.Arithmetic Exception 的异常。

异常发生时,是任程序自生自灭,立刻退出终止,还是输入错误给用户?

Java提供了优秀的解决办法:异常处理机制。

2、异常体系结构

  异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性的处理异常,让程序最大可能恢复正常并继续执行,且保持代码的清晰。

3、异常的分类

  throwable类

Error 表示JVM异常,通常很少出现,也不需要程序员去处理

Exception

RuntimeException 运行时异常,(非检查异常)

IOException (检查异常,除了Error和RuntimeException之外的都是检查异常)

4、异常的使用

对于异常,我们有三种处理方法

1、捕获异常

try{

//可能出现异常的代码段

}catch(ExceptionName e){

//对异常进行处理的代码段

}finally{

//不管发不发生异常,都执行该模块下的内容

}

示例:

1public static void main(String[] args) { 2 3 int i = 10; 4 int j = 0; 5 6 try{ //首先程序进入try中,如果try中的代码没有出现异常,就执行try中的代码,然后打印程序结束 7 System.out.println(i/j); 8 }catch(ArithmeticException e){ //当try中带代码出现异常,就会执行catch中的代码,然后打印程序结束 9 System.out.println("分母不能为0"); 10 } 11 System.out.println("程序结束"); 12 13 }

控制台打印结果:分母不能为0

程序结束

  2、声明异常

在方法中使用throws关键字声明异常

示例:

1/** 2 * 在方法上声声明一个异常 3 * @param args 4 * @throws ArithmeticException 5 */ 6 public static void main(String[] args) throws ArithmeticException { 7 8 System.out.println(11/0); 9 }

  3、抛出异常

    try{

//可能出现异常的代码段

}catch(ExceptionName e){

throw new Exception();

}

示例:

1/** 2 * fun方法在main方法中调用,可以选择捕获异常,也可以选择继续往外抛异常 3 * @param args 4 * @throws Exception 5 */ 6 public static void main(String[] args) throws Exception { //在这里继续把异常往外抛 7 fun(11,0); 8 } 9 10 /** 11 * 在方法中声明创建一个异常,并往外抛异常 12 * @param i 13 * @param j 14 * @throws Exception 15 */ 16 public static void fun(int i ,int j) throws Exception{ 17 try{ 18 System.out.println(i/j); 19 }catch(ArithmeticException e){ 20 throw new Exception("分母不能为0"); 21 } 22 23 }

5、多重catch块

示例:

1public static void main(String[] args) { 2 3 try { 4 String[] arr = null; 5 System.out.println(arr[0]); 6 FileInputStream io = new FileInputStream(""); 7 }catch (FileNotFoundException e){ 8 System.out.println(" 文件没找到 "); 9 }catch(NullPointerException e){ 10 System.out.println(" 对象为空 "); 11 System. out.println(" 对象为空 "); 12 } 13 }

在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,即先子类后父类。

6、常见的异常类型

二、IO流

1、File类

  File类没有指定信息怎么从文件读取或向文件存储;它描述了文件本身的属性。

File对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径。

(1)、File类访问文件

File f1 = new File(文件路径(是一个字符串));

//在指向物理文件或目录时,我们路径的 \ 要换成 / 或者 \\

创建文件对象————>指向物理文件或目录

2、File类常用的方法

1public static void main(String[] args) { 2 3 //创建一个文件对象 4 File f1 = new File("D:/abc.txt"); 5 6 //判断文件是否存在 结果是boolean类型 7 System.out.println(f1.exists()); 8 9 //判断文件是否只读 结果是boolean类型 10 System.out.println(f1.canWrite()); 11 12 //删除文件 f1.delete(); 13 14 // 获取绝对路径下的文件 15 System.out.println(f1.getAbsolutePath()); 16 17 // 获取绝对路径 18 System.out.println(f1.getAbsolutePath()); 19 20 // 获取文件名 21 System.out.println(f1.getName()); 22 23 // 获取目录路径 24 System.out.println(f1.getParent()); 25 26 // 获取路径 27 System.out.println(f1.getPath()); 28 29 // 判断该文件是否是目录 30 System.out.println(f1.isDirectory()); 31 32 //判断该文件是否是文件 33 System.out.println(f1.isFile()); 34 35 // 判断是否为隐藏文件 36 System.out.println(f1.isHidden()); 37 38 // 获取该文件的字节数 /大小 39 System.out.println(f1.length()); 40 41 //获取路径下的所有文件名 42 String [] str = f1.list(); 43 //使用for each 打印文件名 44 for(String s : str){ 45 System.out.println(s); 46 } 47 48 }

3、  IO流

流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或者网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。

在整个java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Write、Reader;一个接口指的是Serializable。掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了。

  

4、IO流体系与分类

  在JAVA中,所有流相关的内容全部在java.io包下。

按功能分,IO流可分为:输入流和输出流

Java程序读取数据  <——(输入流)———文件

Java程序输出数据————( 输出流 )———>文件

按类型分,IO流可分为:字节流和字符流

字符输入流 Reader        字符输出流  Write

字节输入流  IuputStream          字节输出流  OutputStrean

5、IO流划分

这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来

BufferedReader

Reader   InputStreamReader       FileReader

BufferedWriter

字符流

BufferedWriter

Writer

OutStreamWriter         FileWriter

FileInputStream

InputStream          BufferedINputStream

字节流

FlieOutputStream

OutputStream        BufferOutputStream

6、字节流与字符流

程序中输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。

字符流处理的单元为2个字节的Unicode字节,分别操作字符、字符数组或字符串

字节流处理单元为1个字节,操作字节和字节数组

如何选择字节流和字符流?

字符流是Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲、就用字节流好点,如果是关系到中文(文本)的,用字符流好点

7、文件读写步骤

文本文件的读写

1.使用File类打开一个文件

2.通过字节流或字符流的子类,指定文件的位置

3.进行读/写操作

4.关闭输入/输出

常用流有  FileInputStream  和  FileOutputStream ,Bufferedreader  和 BufferedWriter

二进制文件的读写

步骤与文本文件的读写相同,区别在于二进制文件通常使用的是DataInputStream 和 DataOutputStream读写二进制文件

示例:

1public static void main(String[] args) throws IOException { 2 3 //创建一个文件对象 4 File f = new File("D:/abc.txt"); 5 6 // 输入流 7 FileInputStream in = new FileInputStream(f); 8 9 //输出流 10 FileOutputStream out = new FileOutputStream("D:/123.txt"); 11 12 byte [] b = new byte[(int) f.length()]; 13 14 //输入 15 in.read(b); 16 17 //输出 18 out.write(b); 19 20 //先关闭out 21 out.close(); 22 23 //在关闭in 24 in.close(); 25 26 }

首先,我们D盘中有一个abc.txt文件,内容是123456

程序运行结束后,D盘会多出一个123.txt的文件,内容也是123456

8、使用字节流读写文件

FileInputStream : 单字节读写,字节数组读写

FileOutputStream

BufueredInputStream : 使用缓冲区读取,速度比FileInputStream快

BufferedOutputStream

示例:

1public static void main(String[] args) throws IOException { 2 3 4 //创建一个输入对象 5 File fin = new File("D:/jdk api 1.8.CHM"); 6 7 //字节流缓冲区输入 8 BufferedInputStream in = new BufferedInputStream( new FileInputStream(fin)); 9 10 //创建一个输出的对象 11 File fout = new File("D:/jdk api 1.80.CHM"); 12 //输出 13 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fout)); 14 15 byte [] b = new byte[1024]; 16 17 while(in.read(b) !=-1){ 18 out.write(b); 19 } 20 21 //关闭流 22 out.close(); 23 in.close(); 24 }

程序执行结束,我们会发现,D盘中多了一个我们创建的 jdk api 1.80.CHM 文件

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )