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 )