黑马程序员——Java基础---I/O流(上[异常])

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
引言
讲解IO流之前为什么先讲解异常和File类呢?
因为File表示的是IO流将来要操作的文件,所以我们需要学习File类。
而操作文件无非就是上传文件和下载文件,在这个操作的过程中可能出现问题,
出现问题后,我们需要对对应的代码进行处理。所以我们需要学习异常异常。
I/O流操作之上传下载
I/O流操作之上传下载
异常
异常:异常就是Java程序在运行过程中出现的错误。
异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象。其实就是Java对不正常情况进行描述后的对象体现。
我们见过的异常,角标越界异常,空指针异常等
异常分类图解:
异常分类图解
异常分三类:
骑车去旅行:
Error:走到半路上,发生山路塌陷,或者出现了泥石流,这个问题很严重,不是我们能够立马解决的。
Exception:出门前,我们要看看车轮子以及车链子等是否还在
RuntimeException:在骑车的过程中,有好路不走,偏偏要走石子路
1,编译时异常
除了RuntimeException及其子类,Exception中所有的子类都是,这种异常必须要处理,要不编译通不过
2,运行是异常
RuntimeException及其子类都是,这种异常不用处理,编译会通过,不过这样的程序会有安全隐患,遇到这种异常是需要改代码的
3,严重错误问题
用Error进行描述,这个问题发生后,一般不编写针对代码进行处理,而是要对程序进行修正.通常都是由虚拟机抛出的问题
在代码运行时,可能就会出现一些这样或那样的问题;一旦问题出现,我们的程序将结束执行,这似乎不是我们想要的,
我们可以尽量的避免这种情况出现,但不能保证100%的安全。
有没有什么方式,使程序一旦出现这种情况时,有个解决的措施,使程序不至于崩溃;
Java为我们提供了一种叫:”异常处理机制”:使我们的代码一旦出现问题时,不至于崩溃。
JVM默认处理异常的方式:
1.一旦在代码中产生异常:
1).在类库中找出对应的”异常类”,并实例化;
2).在控制台打印异常信息:格式:
//算数运算异常:
Exception in thread “main” java.lang.ArithmeticException: / by zero
at com.itcast.demo01_异常的概述.Demo.main(Demo.java:17)
//数组下标越界异常:
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
at com.itcast.demo01_异常的概述.Demo.main(Demo.java:25)
格式描述:
Exception in thread “main” 全名限定的异常类名:异常的描述信息
at 包.包.包.类.方法名(Xxx.java:xxx(行号))
3).结束程序的执行;
JVM的默认处理方案
把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
程序停止执行
jvm发现运算是已经违反了数学运算规则,java将这种常见的问题进行描述,并封装成了对象叫做ArithmeticException
当除0运算发生后,jvm将该问题打包成了一个异常对象.
并将对象抛给调用者main函数,new ArithmeticException(“/by zero”);
main函数收到这个问题时,有两种处理方式:
1,自己将该问题处理,然后继续运行
2,自己没有针对的处理方式,只有交给调用main的jvm来处理
jvm有一个默认的异常处理机制,就将该异常进行处理.并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上
同时将程序停止运行
异常处理方案
异常处理的基本格式:
try{
//可能会出现异常的代码
}catch(异常类名 变量名){
//如果try中的代码出现异常,将会执行这里的代码;
//一般做什么?向用户提示。写日志;
}
执行顺序:
1.从上至下执行try中的代码;
2.如果try中的代码出现异常:
进入到catch中,执行catch中的代码;
执行完catch中的代码,将执行try…catch语句的后续代码;
3.如果try中的代码没有出现异常:
try中执行完毕,将执行try…catch语句的后续代码;
基本格式:try是检测异常,catch是用来捕获异常的,finally是用来结束资源的
世界上最真情的相依,是你在try我在catch,无论你发神马脾气,我都默默接受,静静处理
多catch的情况:
1.当try中可能会产生多个异常时,可以分开使用几个catch去分别捕获相应的异常;
格式:
try{
//可能会出现异常的代码;
}catch(异常类型1 变量名){
//如果try中的异常是”异常类型1”时,将执行此catch中的代码;
}catch(异常类型2 变量名){
//如果try中的异常是”异常类型2”时,将执行此catch中的代码;
}….
2.注意:
1).多catch时,每个catch中声明的异常类型可以是”平级关系”,也可以是子父关系;
2).如果是子父类型,”父类型异常”一定要放在多catch的最后;
多catch时,JDK7时,支持了一种新的格式:
try{
}catch(异常类型1 | 异常类型2 | 异常类型3 变量名){
}
注意:多个异常类型不能是”子父”关系,只能是平级关系;
编译时异常和运行时异常的区别
Java中的异常被分为两大类:编译时异常和运行时异常。所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常
编译时异常
Java程序必须显示处理,否则程序就会发生错误,无法通过编译
运行时异常
无需显示处理,也可以和编译时异常一样处理
Throwable
Throwable中的常用方法:
getMessage():获取异常信息,返回字符串。
toString():获取异常类名和异常信息,返回字符串。
printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以便查阅。
throws关键字:
1.用于方法声明;
2.格式:
public void show () throws 异常类型名1,异常类型名2{
}
3.它表示此方法可能会抛出上述两种异常;
4.注意:
如果方法抛出的是”运行时异常”:
调用方,可以捕获,也可以不捕获;
如果方法抛出的是”非运行时异常”:
调用方,必须捕获!!否则不能通过编译;
5.如果方法内部的代码可能会出现异常,我们可以在内部使用try…catch…去处理,但不建议。
一般都是抛给调用者自己处理;
在方法内部处理异常_throw
关键字:throw:用在方法内,表示”抛出(动词)一个异常”
1.当方法内抛出一个”运行时异常”时,方法可以不声明throws,调用者可以不捕获;
2.当方法内抛出一个”非运行时异常”时,方法必须声明throws,调用方必须捕获;
3.throw后面是一个对象(引用);
throw和throws的区别:
1.throw:抛出一个异常;用在方法内部;
throws:用在方法声明,表示此方法可能会抛出一个异常;
2.throw:后边跟的是”异常对象”;
throws:后边跟的是”异常类名”;
3.throw:只能抛出一个异常;
throws:是一个声明,可以同时声明抛出多个异常;
我们到底该如何处理异常呢
原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
区别:
后续程序需要继续运行就try
后续程序不需要继续运行就throws
举例:
感冒了就自己吃点药就好了,try
吃了好几天药都没好结果得了H7N9,那就的得throws到医院
如果医院没有特效药就变成Error了
finally
当我们try中的代码包含了一系列的动作,后期我们需要对已使用的资源进行回收。
例如:
try{
//打开文件/网络连接
//读写文件/数据;//出异常了,直接跳到catch中
//关闭连接,释放资源;
}catch(Exception e){
//
}
有些时候,有些事情我们希望在正常情况下要做,在出现异常情况时也要做。
这样的代码我们可以放在finally代码中;
格式:
try{
//可能会产生异常的代码
}catch(异常类型 变量名){

}finally{
//不论是否出异常,都会被执行的代码;
//一般用来做些释放资源等一些操作;
}
try…catch…finally可以使用
try…catch也可以使用
try…finally也可以使用
但是,catch,finally不能单独使用
final,finally和finalize的区别
1.final表示最终的,可以修饰类,成员属性、成员方法、局部变量;
类:最终类。不能被继承;
方法:最终的方法。此方法不能被子类重写;
成员属性,局部变量:表示常量。其值不能被修改;
2.finally:它是异常处理的一部分;
语法:
try…finally:
try…catch…finally:
finally中的代码,不论try中是否出现异常,都会被执行;
3.finalize:Object中的方法。当垃圾回收器回收此对象空间时,会先调用一下此方法。
当catch中有return语句时,先执行return语句,并不立即返回;
它会将返回值先缓存起来,然后再转向finally语句继续执行;将finally语句执行完毕
再回来执行完return语句;
如果finally中有return时,finally中的return会被最终执行;
自定义异常
有些时候,我们可以根据我们自己的业务需求,自定义一些异常类。
方式:
1.自定义一个类,继承自Exception或它的某个子类就可以;
2.设置异常信息;
3.注意: 如果我们的类直接继承自Exception,那么就属于:非运行时异常;
如果我们的类直接继承自Exception,那么就属于:非运行时异常;
子类重写父类方法时的异常处理
当子类重写父类方法时,子类方法的异常声明:

1.当父类方法没有声明抛出异常:
1).子类可以不声明抛出异常;
2).子类可以声明抛出”运行时异常”;
3).子类不能抛出”非运行时异常”;
2.当父类方法声明抛出”运行时异常”:
1).子类可以不声明抛出异常;
2).子类可以声明抛出任何的”运行时异常”;
3).子类不能抛出”非运行时异常”;
3.当父类方法声明抛出”非运行时异常”:
1).子类可以不声明抛出异常;
2).子类可以声明抛出任何的”运行时异常”;
3).子类可以抛出”非运行时异常”,但不能比父类声明抛出的更多;

总结:
不论父类是否抛出异常,子类重写时:
1).子类可以不声明抛出异常;
2).子类可以声明抛出任何的”运行时异常”;
当父类抛出”非运行时异常”,子类重写时:
子类可以抛出”非运行时异常”,但不能比父类声明抛出的更多;
Flie类
我们的程序经常要进行文件的读写,在Java中提供了一个类:File类。
它代表一个文件或目录的信息;
它封装了一些方法,能获取一个文件或目录的相关信息:文件大小、文件是否可读、是否可写、是否隐藏;
它不能对文件的内容进行读写操作;
构造方法:
java.io.File:
public File(String pathname):使用一个路径构造一个File
public File(String parent,String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
public File(File parent,String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
通过创建对象后,我们再来理解文件和目录路径名的抽象表示形式这句话的意思:
仅仅是一个路径的表示,不代码具体的事物一定是存在的。
File类的成员方法
创建功能
当我们创建了File对象后,此文件或目录可能不存在,可以使用一些创建相关的方法进行创建:
public boolean createNewFile():创建一个文件
public boolean mkdir():创建一个目录
public boolean mkdirs():创建多级目录
删除功能
public boolean delete():用于删除文件和目录
注意:此删除功能不走Window回收站;
重命名功能
public boolean renameTo(File dest)
注意:
1.参数是一个File类型
2.在相同目录下:是重命名操作
在不同目录下:相当于先剪切,然后重命名;原文件不存在了。
File的判断功能:
public boolean isDirectory():是否是一个目录
public boolean isFile():是否是一个文件
public boolean exists():文件或目录是否存在;
public boolean canRead():是否可读
public boolean canWrite():是否可写
public boolean isHidden():是否隐藏
File类的获取功能:
public String getAbsolutePath():获取绝对路径
public String getPath():将此抽象路径名转换为一个路径名字符串。获取的是封装时的路径;
public String getName():获取文件或目录的名;
public long length():获取文件的长度.此抽象路径名表示的文件的长度,以字节为单位;如果文件不存在,则返回 0L。
public long lastModified():获取最后修改时间;单位:毫秒
File类的高级获取功能:
public String[] list():返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
如果此抽象路径名不表示一个目录,那么此方法将返回 null。否则返回一个字符串数组,每个数组元素对应目录中的每个文件或目录。
public File[] listFiles():返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
将目录下的所有文件和目录的封装为一个File对象,最后将这些对象封装到一个File[]数组中;
使用list()还是listFiles():
1.如果我们仅仅需要字符串表示的文件名,使用list()方法;
2.如果我们获取此目录下所有的文件及目录之后,还要对每个文件或目录进行后续操作,那么可以使用listFiles()方法;
练习:
输出指定目录下指定后缀名的文件名称案例
输出D盘下,所有的.java文件
思路:
1.使用listFiles()获取D盘下的所有的文件及目录;
2.遍历File数组,获取每个File对象
3.判断每个File对象是否是文件:
是:获取文件名,判断是否是以.java结尾,是:输出。
否:下一次循环
答:
eg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值