对于Java编程语言,异常处理对程序运行和异常都是很重要的手段。 一、异常的概念、原理机制 1.什么是异常? 通俗理解:异于平常,本来一件事情正常执行,可能中途会有特殊情况,导致当前事情无法正常执行而影响执行结果,这个中途特殊情况即异常。 例如:a/b这个操作,正常情况是没有任何问题,但是隐藏了一个问题,如果b为0,则这个除法操作将无法执行,则b为0的情况属于a/b这件事情的异常情况 2.Java异常及特点 1)java异常是java程序运行过程中出现的非正常情况 2)异常在程序中如果不做处理,会导致程序中途瘫痪,不能正常完成特定功能 3)异常一般情况是需要通过java异常处理机制给屏蔽或者处理掉 4)特点: i. Java异常处理是面向对象处理方式 ii. 一旦代码出现异常问题,JVM底层则会创建一个异常类相关的对象 iii. 异常对象产生后,会根据代码对异常的处理机制进行操作,其中异常处理机制包括捕获异常和抛出异常两种,如果没有异常操作,则java程序会中断执行 5)异常体系结构: 异常的祖宗类:Throwable->Exception、error 异常分类:检测异常(受检异常、非运行时异常):IOException等 非检测异常(非受检异常、运行时异常):NullPointException等 6) 如何对异常进行处理: (1)捕获异常:try…catch方式:ArithmeticException数学运算异常 a)异常处理之后,程序不会中断 b)异常捕获是可以多层捕获的(支持多个catch语句) c)捕获异常一定要精确 d)如果说无法确定异常类型,则可以直接捕获Exception异常来处理 e)Catch语句从上到下捕获多个异常,必须从小到大定义或者同级别 f)Catch中如果捕获了检测性异常,则try必须要有这种异常抛出的代码 (2)finally:最终-异常捕获的统一出口 a)finally的语句块一旦定义了,就一定要执行,要么你就不定义 b)try、catch、finally必须要至少两个存在,而且try必须要有 c)问题:如何让已经定了finally代码块的代码不执行? 答案:try{………..;System.exit();}finally{…….;}或者守护线程被终止时 d)return语句:finally之前执行 (3)throws:把异常问题抛出 a)抛出给上一级调用此方法的代码,任凭调用此方法的代码处理 b)抛出问题后,此方法会瘫痪,但是程序会继续 (4)throw:指在catch中抛出指定异常 3.异常处理原理图: 二、异常处理机制之捕获异常 try和catch: try{ //可能出现异常的代码部分 }catch(异常类型 异常变量){ //执行异常操作 }catch(异常类型 异常变量){ //执行异常操作 }… finally{ //处理完try与catch操作后的收尾操作,异常统一出口 } 异常捕获注意事项: 1)catch定义,由上到下,异常类的范围必须由小到大或者同级别的 2)运行时异常,catch中可以随意定义类型,程序运行时,会根据catch参数自动匹配 3)非运行时异常,则catch中定义的异常,在try代码块中必须存在,如果没有类似异常存在,则不允许被定义。 4)finally关键字,在进行异常处理之后,在异常的处理格式中还有一个finally语句,此语句将作为异常的统一出口,不管是否产生异常, 最终都要执行此段代码 5)如果try中有return语句,则会先执行return语句,后执行finally,最后返回整个方法 三、捕获异常之抛出异常 throws和throw: public void test() throws 异常类型{ //存在异常的代码块 } 抛出异常处理案例: public class Test{ public static void main(String[] args){ Test t=new Test(); try{ t.b();
}catch(ArithmeticException e){ e.printStackTrace(); } System.out.println("main方法执行完毕"); } public void b() throws ArithmeticException{ this.a(); System.out.println("方法b执行完毕"); } public void a() throws ArithmeticException{ int a=10; int b=0; int result=a/b; System.out.println("方法a执行完毕"); }} 运行结果: java.lang.ArithmeticException:/by zero at Test.a(Test.java:19) at Test.b(Test.java:13) at Test.main(Test.java:6) main方法执行完毕 原理分析: 1)main方法调用了b方法,b方法调用a方法 2)a方法a/b存在异常抛出后,a方法中断 3)b方法调用a方法获取到了a方法的异常,抛出后中断执行 4)main方法获取到b方法抛出的异常捕捉后,继续往后执行,不中断
抛出异常处理机制:throw抛出异常对象 此操作主要是对当前产生的异常对象进行抛出操作,常用的处理格式是结合try…catch和throws一起使用 例如: public void test() throws 异常对象类型{ try{ //存在异常的代码块 }catch(异常类型 变量名){ throw 异常对象; } }
throw异常对象注意: 1)throw一般存在于catch语句当中,用于出现异常后的一种操作方式 2)捕捉的异常和抛出的异常不一定相同,可以不一样 3)throw抛出的异常对象如果是检测异常,则所在的方法必须要通过throws显性抛出 4)throw抛出的异常对象如果是非检测异常,则方法上可以选择性定义throws 自定义异常: 1.自定义异常一般是自己定义一个类来扩展Exception类 2.格式:public class 自定义异常类名 extends Exception{} 例如:public int b(int a,int b) throws Exception{ int r = 0; try{ r = a/b; }catch(ArithmeticException e){ System.out.println(“我自己解决了问题”); throw new Exception(“这是个大问题”); } System.out.println(“b方法计算了出了结果”); return r; } 3.自定义异常一般适用于throw代码块抛出 四、文件操作(File) A)什么是计算机文件? 计算机文件(或称文件、电脑档案、档案),是存储在某种长期储存设备上的一段数据流。所谓“长期储存设备”一般指硬盘、U盘、光盘等。其特点是所存信息可以长期、多次使用,不会因为断电而消失。 B)计算机存储介质 硬盘:容量非常的大,速度一般,而且可以实现永久存储,电脑程序就存在那里 内存:容量比较小,速度快,是CPU工作的地方,对系统性能影响很大,CPU工作的时候就会把硬盘中要运行的程序先调到内存中才能处理 缓存:容量最小,但速度最快,为了协调CPU的高速度和内存的相对低速度的缓冲区域,一般在CUP上 C) File类:关联计算机中的文件和目录(文件夹) D) API:读取文件的文件信息(不包括文件的数据):文件大小、类型、文件名、路径… 1)createNewFile:创建一个新的文件,但是一定要注意,文件可以不存在,路径一定要存在 2)mkdir:创建一个新的文件夹 3)//创建一个文件:createNewFile\mkdir 4)//删除一个文件:delete 5)//查找文件:exit、listFiles
方 法 原 型 说 明 boolean exists() 判断文件是否存在,存在返回true,否则返回false boolean isFile() 判断是否为文件,是文件返回true,否则返回false boolean isDirectory() 判断是否为目录,是目录返回true,否则返回false String getName() 获得文件的名称 String getAbsolutePath() 获得文件的绝对路径 long length() 获得文件的长度(字节数) boolean createNewFile() throws IOException 创建新文件,创建成功返回true,否则返回false,有可能抛出IOException异常,必须捕捉 boolean delete() 删除文件,删除成功返回true,否则返回false File[] listFiles() 返回文件夹内的子文件与子文件夹的数组
