zoukankan      html  css  js  c++  java
  • 关于JAVA异常(Exception)的学习

    关于JAVA异常(Exception)的学习

    0、异常处理机制
      0.1、java中异常的作用是:增强程序健壮性。
      0.2、java中异常以类和对象的形式存在。

    1、java的异常处理机制

    1.1、异常在java中以类和对象的形式存在。那么异常的继承结构是怎样的?
       我们可以使用UML图来描述一下继承结构。

       


       画UML图有很多工具,例如:Rational Rose(收费的)、starUML等....
       Object
       Object下有Throwable(可抛出的)
         Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)
       Exception下有两个分支:
         Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常。)。
         RuntimeException:运行时异常。(在编写程序阶段程序员可以预先处理,也可以不管,都行。)

    1.2、编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。
       编译时异常因为什么而得名?
        因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名。
        所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象。
        因为异常的发生就是new异常对象。

    1.3、编译时异常和运行时异常的区别?

    编译时异常一般发生的概率比较高。
    举个例子:
       你看到外面下雨了,倾盆大雨的。
       你出门之前会预料到:如果不打伞,我可能会生病(生病是一种异常)。
       而且这个异常发生的概率很高,所以我们出门之前要拿一把伞。
       “拿一把伞”就是对“生病异常”发生之前的一种处理方式。

       对于一些发生概率较高的异常,需要在运行之前对其进行预处理。

    运行时异常一般发生的概率比较低。
    举个例子:
       小明走在大街上,可能会被天上的飞机轮子砸到。
       被飞机轮子砸到也算一种异常。
       但是这种异常发生概率较低。
       在出门之前你没必要提前对这种发生概率较低的异常进行预处理。
       如果你预处理这种异常,你将活的很累。

    假设你在出门之前,你把能够发生的异常都预先处理,你这个人会更加
    的安全,但是你这个人活的很累。

    假设java中没有对异常进行划分,没有分为:编译时异常和运行时异常,
    所有的异常都需要在编写程序阶段对其进行预处理,将是怎样的效果呢?
    首先,如果这样的话,程序肯定是绝对的安全的。
    但是程序员编写程序太累,代码到处都是处理异常
    的代码。

    1.4、编译时异常还有其他名字:
       受检异常:CheckedException
       受控异常

    1.5、运行时异常还有其它名字:
       未受检异常:UnCheckedException
       非受控异常

    1.6、再次强调:所有异常都是发生在运行阶段的。

    1.7、Java语言中对异常的处理包括两种方式:

       第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级。
         谁调用我,我就抛给谁。抛给上一级。

       第二种方式:使用try..catch语句进行异常的捕捉。
         这件事发生了,谁也不知道,因为我给抓住了。

    举个例子:
       我是某集团的一个销售员,因为我的失误,导致公司损失了1000元,
       “损失1000元”这可以看做是一个异常发生了。我有两种处理方式,
       第一种方式:我把这件事告诉我的领导【异常上抛】
       第二种方式:我自己掏腰包把这个钱补上。【异常的捕捉】

        张三 --> 李四 ---> 王五 --> CEO

    思考:
    异常发生之后,如果我选择了上抛,抛给了我的调用者,调用者需要
       对这个异常继续处理,那么调用者处理这个异常同样有两种处理方式。

    1.8、注意:Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续
       向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果。终止java程序的执行。

     1 package exception;
     2 
     3 /*
     4  * 什么是异常?异常处理机制有什么用
     5  */
     6 public class ExceptionTest01 {
     7     /** 
     8      * 异常对象有两个重要的方法 
     9      * 获取异常简单的描述信息: String msg=exception.getMessage();
    10      * 打印 异常追踪的堆栈信息: exception.printStackTrace();
    11      * 
    12      */
    13     public static void main(String[] args) {
    14         NullPointerException e = new NullPointerException("空指针异常");
    15         String msg = e.getMessage();
    16         System.out.println(msg);
    17     //打印异常堆栈信息
    18         e.printStackTrace();
    19         System.out.println("hello world");
    20     }
    21     
    22 }

     1 package exception;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.FileNotFoundException;
     5 import java.io.IOException;
     6 
     7 /*
     8  * 什么是异常?异常处理机制有什么用
     9  */
    10 public class ExceptionTest02 {
    11     /** 
    12      * 
    13       try catch 子类finally  通常在其对语句块中完成的资源进行释放,关闭
    14                      finally中的语句肯定会执行
    15      * 
    16      * 
    17      */
    18     public static void main(String[] args) throws IOException {
    19         FileInputStream fis=null;
    20         try {
    21             //创建输入
    22                 fis=new FileInputStream("D:\迅雷下载\照片\日职.jpg");
    23             String s=null;
    24             //s.toString();
    25             System.out.println("你好");
    26         } catch (FileNotFoundException e) {
    27             
    28             e.printStackTrace();
    29         }finally{
    30             //关闭输入流,为避免程序如果发生异常导致输入流不关闭,建议在finally里关闭输入流
    31             if(fis!=null){
    32             fis.close();
    33             System.out.println("try执行了");
    34             //System.exit(0);  //退出java虚拟机,后面不执行
    35         }
    36         }
    37         
    38         System.out.println("try  ...  finally联合使用");
    39         
    40         try{
    41             System.out.println("先执行");
    42             
    43             return;//最后执行
    44             
    45         }finally{
    46             System.out.println("finally 第二次执行,一定会执行");
    47             
    48         }
    49         
    50         
    51         //System.out.println("return了,这里不会执行");
    52     }
    53     
    54 }

    finally的使用

     1 package exception;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.FileNotFoundException;
     5 import java.io.IOException;
     6 
     7 /*
     8  * 什么是异常?异常处理机制有什么用
     9  */
    10 public class ExceptionTest02 {
    11     /** 
    12      * 
    13       try catch 子类finally  通常在其对语句块中完成的资源进行释放,关闭
    14                      finally中的语句肯定会执行
    15      * 
    16      * 
    17      */
    18     public static void main(String[] args) throws IOException {
    19         FileInputStream fis=null;
    20         try {
    21             //创建输入
    22                 fis=new FileInputStream("D:\迅雷下载\照片\日职.jpg");
    23             String s=null;
    24             //s.toString();
    25             System.out.println("你好");
    26         } catch (FileNotFoundException e) {
    27             
    28             e.printStackTrace();
    29         }finally{
    30             //关闭输入流,为避免程序如果发生异常导致输入流不关闭,建议在finally里关闭输入流
    31             if(fis!=null){
    32             fis.close();
    33             System.out.println("try执行了");
    34             //System.exit(0);  //退出java虚拟机,后面不执行
    35         }
    36         }
    37         
    38         System.out.println("try  ...  finally联合使用");
    39         
    40         try{
    41             System.out.println("先执行");
    42             
    43             return;//最后执行
    44             
    45         }finally{
    46             System.out.println("finally 第二次执行,一定会执行");
    47             
    48         }
    49         
    50         
    51         //System.out.println("return了,这里不会执行");
    52     }
    53     
    54 }

    面试题:

     1 package exception;
     2 /**
     3  * 面试题 java亘古不变的语法
     4  * 1.方法体中的代码必须遵循自上而下的顺序依次执行
     5  * 2.return语句一旦执行,整个方法必须结束,return 最后执行
     6  * @author ASUS
     7  *
     8  */
     9 public class ExceptionTest03 {
    10 
    11     public static void main(String[] args) {
    12       int s=m();
    13       System.out.println(s);   //结果为100
    14     }
    15 
    16     private static int m() {
    17         int i=100;
    18         try{
    19             return i; 
    20         }finally{
    21             i++;
    22         }
    23     }
    24 
    25 }

     自定义异常:

    /*
    * 异常的自定义
    * 两步:
    * 1.写一个类继承exception或者RunctimeException
    * 2.提供两个构造方法,一个无参,一个有参
    */

     1 package exception;
     2 /**
     3  * 自定义异常
     4  * 
     5  * @author ASUS
     6  *
     7  */
     8 public class IllegalNameException extends Exception{
     9 
    10     public IllegalNameException() {
    11     }
    12     public IllegalNameException(String s){
    13         super(s);
    14     }
    15 }
     1 package exception;
     2 /**
     3  * 用户业务类,处理用户相关的业务:例如登录,注册等功能
     4  * @author ASUS
     5  *
     6  */
     7 public class UserService {
     8     public void register(String username ,String password) throws IllegalNameException{
     9         
    10         if(username==null||username.length()<=4||username.length()>=12){
    11             throw new IllegalNameException("用户名错误,长度必须在6-12之间");
    12             
    13         }
    14         System.out.println("注册成功,欢迎"+username);
    15     }
    16 
    17 }
    package exception;
    
    import java.util.Scanner;
    
    
    /**
     * 用户注册测试类
     * @author ASUS
     *
     */
    public class RegistTest {
        public static void main(String[] args) {
            
        
       UserService u=new UserService(); 
       Scanner sc=new Scanner(System.in);
       System.out.println("欢迎来到注册界面!!");
       System.out.println("请输入用户名:");
       String a = sc.next();
       System.out.println("请输入密码:");
       String b = sc.next();
      
       
       try {
        u.register(a, b);
        
    } catch (IllegalNameException e) {
        
        System.out.println(e.getMessage());
    }
               
        }
    }


    2、什么是UML?有什么用
    UML是一种统一建模语言。
    一种图标式语言(画图的)
    UML不是只有java中使用。只要是面向对象的编程语言,都有UML。
    一般画UML图的都是软件架构师或者说是系统分析师。这些级别的人员使用的。
    软件设计人员使用UML。

    在UML图中可以描述类和类之间的关系,程序执行的流程,对象的状态等.

    盖大楼和软件开发一样,一个道理。
    盖楼之前,会先由建筑师画图纸。图纸上一个一个符号都是标准符号。
    这个图纸画完,只要是搞建筑的都能看懂,因为这个图纸上标注的这些
    符号都是一种“标准的语言”。

    在java软件开发当中,软件分析师/设计师负责设计类,java软件开发人员
    必须要能看懂。

  • 相关阅读:
    HashMap 链表插入方式 → 头插为何改成尾插 ?
    MySQL 日志之 binlog 格式 → 关于 MySQL 默认隔离级别的探讨
    Eclipse
    Delphi
    Delphi
    Delphi
    Delphi
    Delphi
    Delphi
    Delphi
  • 原文地址:https://www.cnblogs.com/yumu77/p/13817801.html
Copyright © 2011-2022 走看看