【JavaSE入门系列】第08章_异常处理

第08章异常处理——v512工作室   编辑:玄玉

异常 异常处理机制   我的博客 v512工作室
断言 用户自定义异常 给我发邮件 中科院新科海学校

异常
定义:异常是程序运行过程中发生的事件,该事件可以中断程序指令的正常执行流程
分类错误(Error)是指JVM系统内部错误、资源耗尽等严重情况。发生了错误,程序只能终止执行
             违例(Exception)是指因编程错误或偶然的外在因素导致的一般性问题。发生违例,可以采取适当的手段或方式,让程序得以继续运行
                                           如对负数开平方根空指针访问、试图读取不存在的文件以及网络连接中断
层次:Java中把异常按照继承的关系分了很多的层次。在Java异常中,有一个共同的父类Throwable
             在Throwable中定义的方法是所有Java异常类都具有的方法。Throwable下有两个子类,即ErrorException
             Error代表的是严重的不可恢复的问题,程序一旦发生Error了,就要终止运行
             Exception是指可以采取一定措施,让程序从错误中挽救出来并得以继续运行,所以Exception的使用对程序来说比Error更重要一些
             Exception的处理上就有点像发射火箭的时候,在升空过程中出现了一点点系统故障,但总不能因为这点小故障就让火箭报废吧
             这个时候,通常要通过另外一种方式解决这种小问题,让火箭完成发射。而Exception就很类似这一点
             就是说当发生了不足以导致整个程序完全的终止运行的问题时,可以用另外的适当措施改进或修正这个小问题,让程序得以继续运行
             而在Exception中也分了很多的类型,其中有一类就叫做RuntimeException
             RuntimeException是一种UnCheckException,也就是说在程序中不必专门的捕获RuntimeException及其子类的违例
             比如IndexOutOfBoundsExceptionNullPointerException都是RuntimeException的子类,也就是UnCheckException
             但是其它的违例都是CheckException。即程序中如有可能发生CheckException,就必须通过特殊方式对这种违例进行捕获并加以处理
常见RuntimeException:错误的类型转换,数组下标越界,空指针访问。不需要专门捕获
                         IOException:从一个不存在的文件中读取数据,越过文件结尾继续读取,连接一个不存在的URL。需要专门捕获

 

 

 

异常处理机制
处理宗旨返回到一个安全和已知的状态。能够让用户执行其它的命令
                     如果可能,则保存所有的工作。如有必要,可以退出以避免造成进一步的危害
处理机制:Java程序执行过程中如出现异常,系统会监测到并自动生成一个相应的异常类对象,然后再将它交给运行时系统
                     :运行时系统再寻找相应的代码来处理这一异常。如果Java运行时系统找不到可以处理异常的代码
                              则运行时系统将终止,相应的Java程序也将退出
                     :程序员通常对错误(Error)无能为力,因而一般只处理违例(Exception)
处理形式try{...}catch(ExceptionName1 e){...}catch(ExceptionName2 e){...}[finally{...}]
                     违例的捕获顺序是由小及大,即ExceptionName2的范围一定要大于ExceptionName1的范围。否则编译报错
                     追踪异常信息e.getMessage()。追踪异常信息也仅仅是很简略的得到一个异常结果
                     追踪运行栈信息并将其输出到控制台屏幕上:e.printStackTrace();
                     追踪运行栈信息就会很详细。不仅指明发生哪类异常,还会指明第几行代码存在问题等
                     其中finally语句块中是无条件执行的语句。即无论是否发生异常,该语句均会被执行
异常举例String friends[]={"Lisa","Billy","Kessy"};try{ for(int i=0;i<5;i++) { System.out.println(friends[i]); }
                     }catch(ArrayIndexOutOfBoundsException e){
                               System.out.println("index err");    //若把return替换成System.exit(0),则直接退出整个方法,而不会执行finally和下面的打印语句
                               return;    //return指执行完finally后退出整个方法,而不会执行最后的打印语句,即不会输出this is the end
                     }finally{ System.out.println("in finally block!"); }
                               System.out.println("this is the end");

声明抛弃:是Java中处理违例的第二种方式。可以同时抛弃多种异常,抛弃顺序还是由小及大
                     如果方法中的代码在运行时可能生成某种异常,但在本方法中不必或者不能确定如何处理此类异常时,可以声明抛弃该异常
                     此时方法中将不对此类异常进行处理,而是由该方法的调用者负责处理
                     重写方法不允许抛出比被重写方法范围更大的异常类型
人工抛弃:Java异常类对象除了在程序运行出错时由系统自动生成并抛出之外,也可根据需要人工创建并抛出
                     IOException e=new IOException();  throw e;    //人工主动抛出:使用throw加上对象名。这个对象必须违例类型
                     被抛出的必须是Throwable或其子类类型的对象。此类语句在编译时会产生语法错误:throw new String("want to throw");   //编译时就通不过

 

 

 

用户自定义异常
Java语言针对常见异常状况事先定义了相应的异常类型,并在程序运行出错时由系统自动创建相应异常对象并进行抛出、捕获和处理
当然我们也可以定义自己的新的异常类型并人工抛出异常对象。这是可以的,尽管很多时候都没有这个必要
但是我们定义的异常一定也要继承Exception,表明它也是违例对象

 

 

 

断言Assert
概述:从JDK1.4版本开始,Java语言中引入了断言机制——允许Java开发者在代码中加入一些检查语句,主要用于程序调试目的
特性:断言机制在用户定义的boolean表达式(判定条件)结果为false时抛出一个Error对象,其类型为AssertionError
             当我们需要在约定的条件不成立时中断当前操作的话,可以使用断言
             作为Error的一种,断言失败也不需捕获处理或者声明抛出,一旦出现了则终止程序,不必进行补救和恢复
             断言主要用于调试程序。程序正式运行时就没有必要调试它,所以它默认关闭断言功能的
             Java运行时环境默认设置为关闭断言功能,因此在使用断言以前,需要在运行Java程序时先开启断言功能
开启java -ea MyAppClassjava -enableassertions MyAppClass(也就是在执行时加上参数-ea即可,后面再跟上类名)
关闭java -da MyAppClassjava -disableassertions MyAppClass(或者执行时不加参数,默认为关闭断言)
用法assert <boolean表达式>;      assert <boolean表达式>:<表达式2>
             当启动断言且booleanfalse时,系统会自动将<表达式2>的值传递给新创建的AssertionError对象
             进而被转化为字符串保存起来。实际上就是让我们能获得一个更详细的关于这个位置的断言的信息
例一public class TestAssertion2{public static void main(String[] args){new TestAssertion2().process(-12);}
             public void process(int age){ assert age>=0:"年龄超出合理范围"; System.out.println("您的年龄:" + age); }}
             关闭断言时输出:您的年龄:-12
             启用断言时输出:Exception in thread "main" java.lang.AssertionError:年龄超出合理范围
                                               at TestAssertion2.process(TestAssertion2.java:7)
                                               at TestAssertion2.main(TestAssertion2.java:3)
例二public class TestAssertion{public static void main(String[] args){new TestAssertion().process(-12);}
             public void process(int age){ assert age>=0; System.out.println("您的年龄:" + age); }}
             关闭断言的情况下:无论age>=0是否成立,均跳过assert语句继续往下执行其它语句。输出结果您的年龄:-12
             开启断言的情况下:如果age>=0成立,那么assert语句无伤大雅,程序接着继续执行下面的语句
                                                   如果age>=0不成立,当使用java -ea TestAssertion运行程序时会输出一大堆的栈信息
                                                   栈信息Exception in thread "main" java.lang.AssertionError
                                                                    
at TestAssertion.process(TestAssertion.java:7)
                                                                    
at TestAssertion.main(TestAssertion.java:3)

你可能感兴趣的:(java,java,java,异常,JavaSE,JavaSE,错误,处理)