您的位置:首页 > 职场人生

黑马程序员---IO异常

2015-06-21 18:46 337 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

第一讲 异常概述

一,异常概述:


1.我们以前在开发中,遇到一些情况:代码编译通过,运行时,产生了错误,在控制台打印了一些信息,之后我们的程序就终止了。

2.就好像,我们一个人,在生活过程中,突然发生了一些疾病,我们可以选择去医院就医,就医之后,我们可以继续健康的生活下去。

3.我们回想一下,我们的以前的程序,曾经出现的一些状况:

1.空指针异常:

2.数组下标越界;

3.算数运算异常:整数除法,除数为0;

4.当我们的程序发生上述异常情况时,默认情况下,虚拟机会在控制台打印一些信息,然后程序会终止。

5.我们由于一些小的失误,导致程序可能会出现一些异常状况,这个时候,程序终止是我们不希望看到的。就好像我们生了一些小病,

也希望去医院看好,然后继续健康的活下去。

6.Java为我们提供了一种机制:异常处理机制。

允许我们去监控我们的可能会出现异常的代码,如果出现了异常情况,Java虚拟机会

允许我们去处理这样的情况。处理了之后,使得我们的程序可以健康的继续运行下去。

二,异常的分类

1.对于程序中可能会出现的异常,Java早期进行汇总,并把所有可能会出现的的"异常状况",都封装成了一个"异常类",

也就是"每一个异常情况"会使用一个"异常类"来描述。

2.在这个"异常类"中,最重要的,里面有个"异常信息"。

3.后期Java将这些"异常类"进行汇总,并进行"共同点"的抽取,最终形成了一个"体系结构"--同"集合"一样。

4.Java中异常类的"体系结构":

java.lang.Throwable(类):Throwable 类是 Java 语言中所有错误或异常的超类。

|--错误:Error:代表了虚拟机运行期间遇到的一些不可挽回的一些情况。所以这种错误,我们可以不用捕获。

|--异常:Exception:代表了异常。我们主要是捕获这种异常。如果发生了这样的异常,我们可以去捕获,虚拟机

就不会停掉我们的程序。

|--运行时异常:RuntimeException和它的子类的异常;

|--非运行时异常:除了RuntimeException,其它的异常都是非运行时异常;

三,JVM默认处理异常的方式

当虚拟机发现了一个异常情况:

1.要辨识出是什么样的异常;除数为0;

2.在类库中,找到"描述这个异常的类":ArithmeticException

3.将这个"异常类"实例化一个对象。

4.在控制台打印异常信息:

格式:

Exception in Exception in thread "main" XXX(异常类型):异常信息(封装在异常类中的)

at XXXXXX(异常出现的位置)

5.之后,将我们的程序结束掉。

第二讲 Java中异常处理

一,Java中异常处理的方案:


1.之前我们说过,可以对某些可能会出现异常的代码进行"监控",如果一旦出现异常情况,虚拟机可以

去执行我们的"异常处理程序",最重要的是,会使得我们的程序可以继续健康的运行下去;

2.异常处理的基本语法:

try{

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

}catch(异常类型名称 变量名){

//可以将catch中的代码称为:异常处理程序

//如果try中的代码发生异常,那么虚拟机会执行catch中的代码

}

3.执行顺序:

1.执行try中的代码;

2.如果try中的代码没有异常,不会执行catch中的代码,会继续执行"try...catch"语句的后续代码;

3.如果try中的代码出现了异常,会立即执行catch中的代码。如果catch中的代码执行完毕,会执行"try...catch"语句的后续代码;

public class Demo {

public static void main(String[] args) {

int a = 10;

int b = 0;

try{

System.out.println("a / b : " + (a / b));

System.out.println("try中的后续代码......");

}catch(ArithmeticException e){

System.out.println("不好,发生异常了,这里是catch中的代码,会被执行!");

}

System.out.println("程序结束");

}

}

二,try...catch的方式处理异常2--多catch格式

1.我们的一段程序,经常会有可能发生"多种异常";

2.我们可以对每个异常专门写try...catch进行监控;

3.但是这样写出来,代码显得有些冗长,我们可以将多条可能出现异常的代码放到一个try中,

然后可以使用多个catch()去分别处理每种异常;

4.处理过程:

1).执行try中代码;

2).如果发生异常,Java虚拟机会判断时什么类型的异常。然后去类库中封装相应类型的"异常类";

3).在你的多个catch中找一个""类型匹配"的catch()去执行。

4).如果某个catch执行完毕,不会回到try中了。会继续执行"try...catch..."的后续语句;

5.多catch语句语法:

try{

}catch(异常类型1 变量名){

}catch(异常类型2 变量名){

}catch(异常类型3 变量名){

}

6.注意:多catch语句中的"异常类型"如果是同级别的,那么没有顺序关系;(*******重点注意事项*******)

但如果存在"子父类"关系,"父类"级别的一定要放在最下边。

7.什么时候用"多组的try...catch"?什么时候使用"一个try,多个catch"?

1.如果一个try...多个catch结构,在try中的代码,如果前面的代码出现异常,而后面的代码仍然需要被执行,

这时就要改成"多组的try...catch"语句。

三,多catch的基本语法:

try{

}catch(异常类型1 变量名){

}catch(异常类型2 变量名){

}catch(异常类型3 变量名){

}

JDK7之后,提供了一种新语法:

try{

}catch(异常类型1 | 异常类型2 | 异常类型3 e){

}

注意:异常类型必须是平级的,用|(或)符号隔开,不能出现"父类级别"的异常类型;

第三讲 运行时异常和非运行时异常

一,运行时异常和非运行时异常;


Throwable(类):

|--Error:表示错误。我们不用处理;

|--Exception:表示异常

|--RuntimeException:运行时异常:编译时可以不处理,运行时会抛出的异常;

|--除RuntimeException类型的其它异常:非运行时异常:编译期就要处理的异常,否则编译不通过。尤其是一个方法内,如果

产生了一个"非运行时异常",调用方 必须去处理这个异常,否则不能通过编译。

第四讲 Throwable

一,Throwable的几个常见方法:


1.Throwable中的方法,也就意味着所有的"异常对象"所应具有的方法;

2.当虚拟机扑捉到一个异常后,会执行某个catch,当执行catch时,会将这个类型的"异常对象"传入到catch中,

catch的小括号内的异常类型声明,就是用来接收这个异常对象的。

3.Throwable中的常用方法:

String getMessage():获取异常信息,返回字符串。

String toString():获取异常类名和异常信息,返回字符串。

void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。(后期会非常频繁的使用)

第五讲 throws

一,throws的方式处理异常


1.我们经常在一个"方法"内编写很多代码,这些代码可能会产生异常;

2.在一个"方法"中给我们很多的方式去处理异常:

方式一:使用try...catch:效果跟在main中使用try...catch是一样的。

方式二:在方法声明时,可以使用throws关键字,表示"我这个方法可能会抛出这样的异常";

1).throws后面可以跟多个"异常类型"的声明,使用逗号隔开;

2).如果throws后面声明的是"运行时异常",调用方可以捕获,可以不捕获。不捕获时,如果发生异常,由虚拟机去处理;

如果throws后面声明的是"非运行时异常",调用方必须捕获,或抛出(如果在main中调用,就不建议抛出)。

3.注意:在main中不要再抛出了,再抛就抛给虚拟机了,它来处理,就是打印异常信息,然后终止程序运行;

二,throw:

1.它用于在方法体内,显示的抛出一个"异常对象";

2.它的作用同throws一样,当出现这样的异常时,同样抛出给"调用者";

3.throw一个异常,也就相当于"方法返回",后续代码将不会被执行。

4.throw一个运行时异常:

1).方法可以不声明throws;

2).调用者,可以捕获,也可以不捕获;

throw一个非运行时异常:

1).方法声明处,必须显示的使用throws声明抛出这个异常;

2).调用者,必须捕获。否则不能通过编译;

throws和throw的区别:

1.使用位置:

throws:用在方法声明时,在方法体上声明,表示我要抛出某种类型的异常;

throw:用在方法体内。表示抛出某种类型的异常对象;

2.throws后面跟的是"异常类的类名",可以有多个,用逗号隔开;

throw后面跟"异常对象",只能有一个。

三,finally关键字的特点及作用

1.finally关键字,用于"异常处理"的语句中。

2.它一般用于try后或try...catch后;

3.特点:在finally语句块中的代码,无论是否出现异常,都会被执行;

一般操作一个文件包括三个流程:打开文件、读写文件、关闭输入输出流;

try{

System.out.println(”打开文件");

System.out.println(”读取文件");//出现异常

return 一个值;

}catch{

System.out.println("异常处理");

}finally{

System.out.println(”关闭文件");//此操作将不会被执行;

}

4.无论是否发生异常,finally中的语句肯定会被执行:

执行顺序:

无异常:try --> finally

有异常:try --> catch --> finally

第六讲 File类

一,1.它不能读写文件的内容;


2.它代表了硬盘上的一个文件或目录;

3.一个File对象,可以获取这个文件或目录的一些属性信息:

1.创建时间;

2.大小;

3.是否可读;

4.是否可写

......

它不能读写文件的内容:

构造方法:

public File(String pathname):使用pathname去构造一个文件或目录;pathname可以是"绝对路径",也可以是相对路径;

public File(String parent,String child):使用父目录,及子目录/子文件构造一个File

public File(File parent,String child):使用父级的File目录对象,和子目录/子文件的名称构造一个File

注意:

1.使用相对目录和绝对目录都可以;

2.文件或目录是否存在都可以

二, 创建功能

首先要确定一点:一个File对象,可以代表一个文件,也可以代表一个目录;

public boolean createNewFile():创建一个文件

public boolean mkdir():创建单级目录

public boolean mkdirs():创建多级目录;

三, File类的删除功能

1.public boolean delete():删除文件和单级目录。不能一次性删除多级目录

注意:此删除,不进Windows的回收站,直接删除。

public class Demo {

public static void main(String[] args) {

File file = new File("test.txt");

System.out.println("删除文件:" + file.delete());

File file2 = new File("aaa");//目录

System.out.println("删除目录aaa:" + file2.delete());

File file3 = new File("bbb\\ccc\\ddd");//此命令只删除ddd目录。

System.out.println("删除多级目录:" + file3.delete());

//如果想删除多级目录,那么需要一级一级的单独删除;

//后面我们将学到"递归"

}

}

四, 重命名功能

public boolean renameTo(File dest):将当前的文件或目录 重命名为dest所代表的文件和目录

可以重命名在相同目录下,

也可以重命名到其它目录下,相当于一个剪切操作,并进行重命名;

public class Demo {

public static void main(String[] args) {

File file1 = new File("D:\\aaa\\hello.txt");

File file2 = new File("D:\\aaa\\hello_rename.txt");

System.out.println("重命名:" + file1.renameTo(file2));

//将file2重命名到项目根目录下,名称为:my_hello.txt

File file3 = new File("my_hello.txt");

System.out.println("重命名file2 : " + file2.renameTo(file3));

}

}

五,File类的判断功能

public boolean isDirectory():是否是个目录

public boolean isFile():是否是个文件

public boolean exists():是否存在;

public boolean canRead():是否可读

public boolean canWrite():是否可写

public boolean isHidden():是否隐藏

六,基本获取功能

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

public String getPath():获取File所代表的路径

public String getName():获取文件或目录的名称

public long length():文件或目录 的大小(单位:字节)

public long lastModified():最后修改时间(单位:毫秒)

七,File类的高级获取功能

public String[] list():获取当前目录下的所有文件和目录的名称的String[]数组

public File[] listFiles():

八,File中的list()和listFiles()两个方法都有两个重载的方法,它们能够接收一个"文件过滤器"

public String[] list(FilenameFilter filter):

public File[] listFiles(FilenameFilter filter):
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: