第五周学习视频(一)

一、 java中的异常处理

将异常本身作为一个对象,产生异常就是产生一个异常对象。
该异常对象中包括了异常事件的类型,发生异常时应用程序的状态和调用过程。
可以将程序逻辑与异常处理分开编写。

二、异常的分类

(1)受检异常:在编译时就能被java编译器检测到。
(2)非受检异常:不能在编译时检测到,包括:运行时异常(Runtime Exception);错误(Error)。

三、Error

动态链接失败,虚拟机错误等。通常Java程序不应该捕获这类异常,也不会抛弃这种异常。

四、Exception

(1)运行时异常:继承于RuntimeException的类都属于运行时异常。
(2)非运行时异常--受检异常:除了运行时异常之外的其他由Exception继承来的异常类都是非运行时的异常,都是受检异常。Java编译器要求在程序中必须处理这种异常: 捕获异常或者声明抛弃异常
(3)throw:用户自己定义的异常。

五、处理异常

java语言中有两种异常处理机制:捕获异常声明抛弃异常

六、方法一:捕获异常

捕获异常是通过 try-catch-finally 语句实现的。

try{
   ...... //常规的代码
   [throw ...]
 } catch( ExceptionName1 e )  {
     ...... //处理异常1
 } catch( ExceptionName2 e ) {
    ...... //处理异常2
 }
       ......
 finally{
    ......  //不论发生什么异常(或者不发生任何异常),都要执行的部分
 } 

七、try

用try{…}选定捕获异常的范围。
在try{…}这一部分,存放常规的代码,或可能出错的代码段。
该代码块中的语句在执行过程中可能会生成异常对象并抛出。
如果发生了异常,则try语句块中剩下的代码将会跳过。

八、catch

每个try代码块可以伴随一个或多个catch语句块,用于处理try代码块中所生成的异常事件。
catch后跟一个形式参数指明它所能够捕获的异常类型,这个类必须是Throwable的子类。


Jdk7允许捕获多个异常:catch( Type1 | Type2 | Type3 e)
例如:

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

九、捕获异常的顺序

try后跟的若干catch语句块可以捕获若干种异常,捕获异常的顺序和catch语句的顺序有关,当捕获到一个异常时,剩下的catch语句就不再进行匹配
因此,在安排catch语句的顺序时:首先应该捕获最特殊的异常,然后再逐渐一 般化。也就是一般先安排子类,再安排父类。

十、finally

不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。
若程序在try语句块之前调用了System.exit 方法退出,则不会执行finally。
由于finally语句块几乎总是会执行,因此可用于保护资源免于泄漏。

try {
     对文件进行处理的程序;
 } catch(IOException e) {
     //对文件异常进行处理;
 } finally {
    不论是否发生异常,都关闭文件;
 }

十一、方法二:声明抛弃异常

(1)使用throws关键字抛弃异常
当一个类/方法中有异常被抛出了,就要做处理(try-catch)。
但有时候一个类/方法中产生了异常,却不知道该怎么处理它,此时可对类/方法的头部使用throws关键字声明要抛弃的异常,当有异常抛出时就中断该方法,将异常抛到这个方法的调用者那里。
eg.public static void main(String args[]) throws IOException,IndexOutOfBoundsException {…}
栈解退:当抛出了异常,但还没有在特定的作用域中被捕获时,方法调用栈便被“解退”, 并试图在下一个外层try语句块中捕获这 个异常,此过程被称为“栈解退”。 此时抛出未捕获异常的方法将终止,这个方法中所有的局部变量都将超出作用域, 控制会返回到最初调用这个方法的语句。


(2)使用throw语句将异常抛弃
在java代码中如果发生异常的话,jvm会抛出异常对象,导致程序代码中断,这个 时候jvm做的操作就是:创建异常对象,然后抛出。
但是有时候有些错误在jvm看来不是错误,例如年龄是负数,此时我们需要自己手动创建异常对象,并抛出该异常对象,这就是throw的作用。
可以抛弃的异常必须是Throwable或其子类的实例。
eg. IOException e=new IOException(); throw e;
用户自定义异常:用户定义的异常类型必须是 Throwable 的直接或间接子类。Java 推荐用户的异常类型以 Exception 为直接父类。(即extends Exception)
链式异常:抛出一个新的异常,将捕获的初始异常作为第二实参,这种方法可以使得新异常抛出时,异常对象 能包含来自于原始异常的完整的栈踪迹信息。(eg.throw new Exception( "Exception thrown in method2", exception ) )

十二、小结:处理异常的常用方法

(1) 一旦捕获异常,马上进行处理
(2) 重新抛出异常
(3) 捕获异常,但并不处理
(4) 通过语句System.exit()退出应用程序

十三、单体程序设计模式

单体模式的特点:
(1)单体类只能有一个实例。
(2)单体类必须自己创建自己的唯一实例。
(3)单体类必须给所有其他对象提供这一实例。

//     单体类实现例程。
 public class J_Singleton {
     private static J_Singleton m_object = new J_Singleton( ); 
     // 定义构造方法: 不允许自行创建这个类的实例对象
     private J_Singleton( )     {
     } // J_Singleton构造方法结束 
     // 返回单体实例对象的引用
     public static J_Singleton mb_getObject( )     {
         return m_object;
     } // 方法mb_getObject结束
 } // 类J_Singleton结束  
//单体类Runtime
 public class Runtime {
     private static Runtime currentRuntime = new Runtime( ); 
 
     public static Runtime getRuntime( )     {
          return currentRuntime;
     } 
 
    /** Don't let anyone else instantiate this class */
     private Runtime( )     {
     }
     // ... ...
 } 
posted @ 2020-03-16 09:46  大萌神  阅读(137)  评论(0编辑  收藏  举报