一文让你秒懂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);
    }
}

在这里插入图片描述

以梦为马,不负韶华。
原文地址:https://www.cnblogs.com/huangjiahuan1314520/p/12683930.html