zoukankan      html  css  js  c++  java
  • 一文让你秒懂Java的异常处理

    导读:异常处理看完这篇就够了,文章较长,建议收藏再看。别忘记素质三连呀!

    什么是异常,异常机制有什么用?

    程序发生不正常情况,即异常,java把异常信息打印到控制台,供程序员参考,程序员可以对程序进行修改,让程序更加健壮。

    package ExceptionPcakage;
    
    public class ExceptionTest1 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int a=10,b=0,c=3;
    		System.out.println(devide(a,b));
    	}
    	public static int devide(int a,int b) {
    		return a/b;
    	}
    }
    
    
    • Java中异常是以什么方式存在的?
      异常是以类的形式存在。
    • 当出现异常时,jvM虚拟机会自动new异常对象,并将异常对象抛出,因此我们能在控制台看到异常信息。
    • 异常类在java.lang包下,所以不用导入类。
    package ExceptionPcakage;
    
    public class ExceptionTest1 {
    
    	public static void main(String[] args) {
    //	 通过异常类“实例化”异常对象
    		int a=9,b=0;
    		NumberFormatException fe =new NumberFormatException("数字格式化异常");
    		
    		System.out.println(fe);
    	}
    }
    
    

    UML

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

    • UML图就是一个设计图,可以描述类和类之间的关系,层序执行的流程,对象的状态等。就好比盖大楼一样,盖楼之前,会先由建筑师画图纸,图纸上的符号都是标准符号,只要是搞建筑的都能看懂,因为图纸上的标注是一种标准语言。
    • 作为程序员,得看懂。

    错误和异常

    Object下有Throwable(可抛出异常)
    Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理)

    • Exception下有两个分支:
      编译时异常:(故名思议,必须预先对这些异常进行处理否则编译报错。
      RuntimeException:运行时异常,在编写阶段可以不管可以处理。
    • 两者都发在在运行阶段,编译阶段是不会发生得,因为只有运行阶段才可以new对象。
      错误只要发生,java程序只有一个结果,终止程序得执行,退出JVM。错误是不能被处理的。
    • 编译时异常(受检异常,受控异常)和运行时异常(非受检异常,非受控异常)的区别?
      编译时异常发生得概率高。
      例如:外面下雨,你出去,如果不打伞你可能会生病,而且发生得概率很高。所以我们需要再出门前带上伞。带伞就是预处理。
      因此对于一些发生概率较高的异常,需要在运行之前对其进行预处理。
    • 而运行时异常发生的概率低。
      比如出门被飞机轮子砸到,对于这些概率较低得异常,不需要对其预处理。(如果预处理将活得很累)。

    Java对异常的处理的两者方式

    • 第一种:在方法声明的位置上,使用throws关键字,抛给了上一级。谁调用我就抛给谁。
    • 第二种:使用try … catch语句进行异常的捕捉。谁也不知道,因为我抓住了。
      例如:我是一个集团的销售员,因为失误造成公司损失了1000元。(看作是一个异常发生)
      第一种方式:我把这件事告诉我的领导【异常上抛】
      第二种方式:我自己掏腰包补上。【异常的捕捉】
    • 思考:如果异常发生后,我选择了上抛,抛给了我的调用者,调用者需要对这个异常继续处理,那么调用者处理这个异常同样有两者处理方式。
    • 注意:java中异常发生后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了Jvm,jvm知道这个异常发生,终止程序的执行。
    • 上抛等于推卸责任,抛给其调用者,捕捉是解决了问题。
    • 我们主要处理编译异常。
      在这里插入图片描述
    • 可以抛异常的父类,因为父类包括其异常类,throws后面可以写多个异常。
    • 我们只需要处理编译性异常即可,运行时异常不处理也可以。
    • catch(异常类型 参数名)的参数保存的时出现异常的对象地址。 catch执行完后,其后的代码可以执行,但try代码块异常行后的代码不会执行。
    • 只要异常没有捕捉 ,采用上报的方式,此方法的后续代码不会执行,即方法结束,相当于return。
    • 并且如果try语句块中 某一行代码出现异常,改代码后面的代码不会执行。
    • 可以写多个catch(),其会自动选择,catch尽量类型错误尽量具体,子类的类型的catch不须写在父类前(从上到下,从小到大)。
    • jdk8中catch的异常类型可以用或(“|”)选择多个异常。
    • 开发中如果想要调用者知道,就让调用者处理,根据实际情况选择处理方式。

    异常对象的方法

    • getMassage()获取异常简单的描述信息。

    在这里插入图片描述

    • printStackTrace() 打印异常追踪的堆栈信息。采用了异步线程的方式打印的。(打印异常信息,异步输出)
      在这里插入图片描述
      查看异常信息:sun写的就不用看,从上往下看自己写的。
    • thorw 手动抛异常。

    finally

    • 在finally子句最后执行的,并且一定会执行, 即使try语句块出现了异常,finally子句必须和try一起出现,不能单独书写。
    • 流使用完要关闭,出现异常也要关闭。
      在这里插入图片描述
    • try可以直接和finally连用,不用catch.
    • try不能单独使用。
    • return执行方法结束,但就算try中有return,也会执行finally语句块,return最后执行。但退出jvm后finally的代码就不执行了,虽然finally充了钱,哈哈。
    • finally面试题
      在这里插入图片描述
      java中自上而下执行。返回100.
      • final ,finally,finalize的区别
        在这里插入图片描述
    • finalize是gc负责调用的。

    如何自定义异常类

    • sun公司提供的JDK的内置异常肯定是不够的,在实际开发中,我们很多业务出现异常可能是JDK中没有的,这时我们需要自定义异常。
    • 第一步:编写一个类继承EXception或者RuntimeException.
    • 第二步:提供两个构造方法,一个无参数的,一个带有String参数的。
    • 程序中哪里出现异常,就用thow 手动抛异常。
      在这里插入图片描述
    • 方法覆盖时,重写的方法不能比父类的方法抛出更多(更宽泛)的异常,可以更少。
    • 小练习:
      在这里插入图片描述
      //主类
    package Package1;
    
    import java.util.Scanner;
    
    public class ExceptionPractice1 {
        public static void main(String[] args) {
            UersService aa = new UersService();
            Scanner Scan = new Scanner(System.in);
            System.out.println("请输入用户名:");
            String Name = Scan.next();
            System.out.println("请输入密码:");
            String Code = Scan.next();
            try {
                aa.register(Name,Code);
            } catch (MyException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    

    //用户类

    package Package1;
    
    public class UersService {
        private String AccountName;
        private String AccountNameCode;
    
        public UersService() {
        }
    
        public UersService(String accountName, String accountNameCode) {
            AccountName = accountName;
            AccountNameCode = accountNameCode;
        }
    
        public String getAccountName() {
            return AccountName;
        }
    
        public void setAccountName(String accountName) {
            AccountName = accountName;
        }
    
        public String getAccountNameCode() {
            return AccountNameCode;
        }
    
        public void setAccountNameCode(String accountNameCode) {
            AccountNameCode = accountNameCode;
        }
    //    注册
        public void register(String a,String b)throws MyException{
            if(a==null||a.length()>14||a.length()<4)
                throw new MyException("用户名请长度应为6到16");
            else if(b.length()<6||b.length()>18)
                throw new MyException("密码长度应为6到18");
            else
                System.out.println("登入成功!欢迎你:"+a);
        }
    
    }
    //自定义异常类
    
    ```go
    package Package1;
    
    public class MyException extends Exception{
        public MyException() {
        }
    
        public MyException(String message) {
            super(message);
        }
    }
    
    

    在这里插入图片描述

    以梦为马,不负韶华。
  • 相关阅读:
    windows下安装python模块
    红包demo
    如何查看python 的api
    vscode 与 python 的约会
    默认构造函数
    关于重载
    转类型转换
    asm-offset.h 生成
    debian 7 安装
    emacs 定制进缩风格
  • 原文地址:https://www.cnblogs.com/huangjiahuan1314520/p/12683930.html
Copyright © 2011-2022 走看看