异常和错误
异常是指在程序运行中由代码产生的一种错误。 当程序不能正常运行时,就说明了程序中出现了错误,错误按照其性质可以分为三种:语法错(编译错误)、语义错(运行错)和逻辑错。 程序运行时出的错可以分为两类:错误和异常 错误是指程序在执行过程中所遇到的硬件或操作系统的错误,如内存溢出、 虚拟机错等。而异常则是指在硬件和操作系统正常时,程序遇到的运行错。 异常对于程序而言是非致命性的,但错误对于程序而言则是致命性的。 java语言中所有异常都是以类的形式存在的,除了内置的异常类之外,java语言也允许用户自定义异常类。 每当程序发生了异常事件,即代表产生了异常的一个"异常对象"。 生成异常对象并把它交给运行系统的过程称为抛出异常。这个对象可能由应用程序本身产生,也可能由java虚拟机产生,这取决于产生异常的类型。 在java语言中定义了许多异常类,每一种异常类都代表了一种运行错误,类中也包含了该运行错误的信息和处理错误的方法等内容。 每当java运行过程中发生一个可识别的运行错误时,即该错误由一个异常类与之对应时,系统都会产生一个相应的该异常类的对象。一旦一个异常对象产生了,系统中就一定有相信的机制来处理它。如果异常处理程序捕获到的异常类型和这个程序能够处理异常的类型相同,那么这个程序就叫作合适的异常处理程序,然后异常处理机制将控制权从发生异常的程序交给能处理该异常的异常处理程序;如果没有找到合适的异常处理程序,运行时环境将终止程序执行。
异常处理类
在异常类层次的最上层有一个单独的类叫作Throwable,它是java.lang包中的一个类。这个类可以处理所有的异常情况,该类派生了两个子java.lang.Error和java.lang.Exception。其中,Error子类由系统保留,因为该类定义了那些应用程序通常无法捕捉到的错误。Error及其子类的对象,代表了程序运行时java系统内部的错误。 Exception类对象时java程序抛出和处理的对象。由于应用程序不处理Error类,所以一般所说的异常都是指Error及其子类。 Exception类的两个构造方法: public Exception(); public Exception(String s); 第二个构造方法可以接收字符串参数传入的信息,该消息通常是该异常所对应的错误的描述。 Exception类从父类Throwable那里继承了若干方法。常用的两个: public String toString():该方法返回描述当前Exception类信息的字符串 public void printStackTrace():该方法没有返回值,它的功能是完成一个输出操作,在当前的标准输出设备(一般时屏幕显示器)上输出当前异常对象的堆栈使用轨迹。 在Exception类中由一个子类RuntimeException代表运行时的异常,它是程序运行时自动地对某些错误作出反应而产生的,所以RuntimeException可以不编写异常处理的程序代码,依然可以成功编译。 程序对异常与错误的处理方式有三种:一是程序不能处理的错误;二是程序应避免而可以不去捕获的运行时异常;三是必须捕获的非运行时异常。
异常的处理
使用try-catch-finally语句 try { 要检查的语句序列 } catch(异常类名 形参对象名) { 异常发生时的处理语句序列 } finally { 一定会运行的语句序列 } 注意:如果程序产生的异常过多,可以直接在方法头的地方用throw Exception来解决或者用多个catch语句。
抛出异常
抛出异常具体分为: (1)系统自动抛出的异常 (2)指定方法抛出异常 抛出异常的方法 方式一:在方法体内使用throw语句抛出异常对象。语法格式为: throw 由异常类产生的对象; 方式二:在方法头部添加throws子句表示方法将抛出异常。语法格式为: [修饰符] 返回值类型 方法名([参数列表])throws 异常类列表
自动关闭资源的try语句
try-with–resources语句的语法格式: try(声明或初始化资源的代码) { 使用资源对象res语句 } try后面括号里面时声明、初始化一个或多个资源的语句,当有多个资源时用“;”隔开,当try语句执行结束时会自动关闭这些资源。 注意:并给所有的资源都可以自动关闭,只有实现java.lang.AutoCloseable接口的那些资源才可以自动关闭,该接口只有一个抽象方法: void close() throws Exception 自动关闭资源的try语句相当于包含了隐式的finally语句块,该finally语句块会自动调用res.close()方法关闭前面所访问的资源。所以说,自动关闭资源的try语句后面既可以没有catch块也可以没有finally块。如果程序需要,自动关闭资源的try语句后面也可以带有一个或多个catch块和一个finally块。如果在try-with-resources语句中含有catch和finally子句,则catch和finally子句将会在try-with-resources语句中打开的资源被关闭之后得到调用。 注意:java.io.Closeable接口继承了AutoCloseable接口,这两个接口被所有的i/o流类实现。因此,在使用i/o流时,可以使用try-with-resources语句。
自定义异常类
用户自定义异常类主要用来处理用户程序中可能产生的逻辑错误,使得这种错误能够及时被系统及时识别并处理,而不致扩散产生更大的影响,从而使用户程序有更好的容错性能,并使整个系统更加稳定。 自动异常类需要以下几步: (1)声明一个新的异常类。该类必须时Throwable类的直接或间接子类。一般以Exception类为直接父类,也可以使用某个已经存在的系统异常类或用户自己定义的异常类为其父类。 (2)为用户自定义的异常类定义属性和方法,或覆盖父类的属性和方法。一般在自定义异常类加入两个构造方法分别时没有参数的构造方法和含有字符型参数的构造方法 注意:用户自定义异常不能由系统自动抛出,因而必须借助于throw语句来定义何种情况算时产生了此种异常对应的错误,并抛出这个异常类的对象。
|