Java 异常(加深)

概念: 程序在运行过程中出现的特殊情况(异常就是Java在编译、运行或运行过程中出现的错误。)

异常处理的必要性: 任何程序都可能存在大量的未知问题、错误;如果不对这些问题进行正确处理,则可能导致程序的中断,造成不必要的损失

程序错误分为三种: 编译错误运行时错误逻辑错误

        1.编译错误是因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置,这也是新手在刚接触编程语言时经常遇到的问题

        2.运行时错误是因为程序在执行时,运行环境发现了不能执行的操作

        3.逻辑错误是因为程序没有按照预期的逻辑顺序执行。

异常:也就是指程序运行时发生错误,而异常处理就是对这些错误进行处理和控制

异常的结构

在Java中,所有的异常都有一个共同的祖先 Throwable(可抛出的)

Throwable:可抛出的,一切错误或者异常的父类,位于java.lang包下

Throwable有两个重要的子类: Exception(异常)和 Error(错误),二者都是Java异常处理的重要子类,各自都包含大量子类。

异常与错误的区别是:异常能被程序本身处理,而错误无法处理

Throwable类中常用方法

public String getMessage(); 返回异常发生时的详细信息
​
public String toString(); 返回异常发生时的简要描述

public String getLocalizedMessage();
返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,
可以生成本地化信息。 如果子类没有覆盖该方法,
则该方法返回的信息与getMessage()返回的结果相同
​
public void printStackTrace();
在控制台上打印Throwable对象封装的异常信息(堆栈信息)
 

Error(错误)

程序无法处理的错误,表示运行应用程序中较严重的问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM出现的问题。

OutOfMemoryError 内存溢出

StackOverflowError 栈溢出

Exception(异常)

是程序本身可以处理的异常。

Exception分为两大类:运行时异常非运行时异常(编译异常)

运行时异常(RuntimeException): 无需在throws子句中进行声明,不强制程序处理。一般由程序逻辑错误引起的,程序应该从逻辑角度尽量避免这类异常的发生。(即使没有try-catch语句捕获,也没有throws子句声明抛出,也会编译通过)

NullPointerException    空指针异常
​
ArithmeticException     算术运算异常
​
ClassCastException      类型转换异常
​
ArrayIndexOutOfBoundsException      超出界限异常
​
StringIndexOutOfBoundsException     字符数组越界异常
​
InputMismatchException      传递的输入与方法不匹配

非运行时异常(编译异常): 时运行时以外的异常,类型上都属于Exception类及其子类。必须进行处理的异常,如果不处理,程序就不能编译通过。

SQLException 数据库异常报错
​
IOException 输入输出异常
​
ClassNotFoundException 找不到指定类的异常

Java的异常分为 可查的异常(checked exceptions)不可查的异常(unchecked exceptions)

可查的异常(checked exceptions)(必须处置的异常): 正确的程序在运行中,很容易出现的、情理可容的异常状况(除运行时异常和它的子类)都属于可查异常。

特点: Java编译器会检查它,当程序中可能出现这类异常,要么用 try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

不可查的异常(unchecked exceptions)(不要求强制处理的异常): 包括运行时异常和错误。程序中不必捕获运行时类型的异常,也不必在方法体声明抛出与运行时异常类。

异常处理机制

  1. 抛出异常: 当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。

    throws 在方法的定义处,声明异常。(方法内部不能或者不想处理这个异常,则声明)并没有真正的处理异常。而是交由调用来处理。调用者依然可以选择try-catch或者继续throws,如此一层一层往上递交,直到交给JVM,JVM直接报错。

  2. 捕获异常: 在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。

    try-catch-finally 或者try-catch

异常处理的方法

try···catch处理

    try{
    //尝试执行的代码
        }catch(Exception e){
    //处理异常的代码
        }finally{
    //最终的
    }


    try {
       System.out.println(5/0);//0不能为分母
       
    }catch (Exception e){
       e.printStackTrace();//打印错误信息,给程序员看的
       
       System.out.println("系统出现错误,请联系管理员");
       //给客户看的
       
    }finally {
            //一般做收尾工作
            
       System.out.println("你好");
    }

try 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常,异常就被抛出。

catch 用于捕获异常。catch用来捕获try语句块中发生的异常。

finally finally语句块总会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)

无论捕获异常与否,都会执行finally语句,当try和catch中有return时,finally仍然会执行((System.exit(x))出现,不执行final)

throws和throw处理

throws表示方法准备要扔出来一个异常

throw表示向外抛出异常

    
public static void chu(int a,int b) throws Exception{
        if (b==0){
            throw new Exception("除数不能为0");
        }else {
            System.out.println(a/b);
        }
    }
    public static void main(String[] args) throws Exception{
 
        chu(1,0);
    }
}

自定义异常

Person类

public class Person {
    String name;//姓名
    String gender;//性别
    public Person(String name, String gender) {
        this.name = name;
        this.gender = gender;
    }
}

厕所类

public class Wc {//定义一个厕所类
public void man(Person p) throws GenderException{
    if (p.gender=="男"){
        System.out.println("入厕愉快");
    }else {
        //需要抛出一个异常
        throw new GenderException("性别错误,这里是男厕所");
    }
}

GenderException

public class GenderException extends Exception{
    //自己定义的异常必须要继承Exception或RuntimeException
 
    public GenderException(String msg){
        super(msg);//调用父类的构造方法,Exception(msg)
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Illus1ion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值