java异常

异常

一,生活中的异常

二,什么是异常

异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序

什么是异常处理

Java编程语言使用异常处理机制为程序提供了错误处理的能力

Java中如何进行异常处理

Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws

异常的分类


Throwable:是所有异常(Exception)和错误(Error)的父类

Error:错误,程序本身无法解决的问题:比如断电,运行内存不足,电脑坏了,程序不要去处理
​
Exception:所有异常的父类
分类:
1.运行时异常RuntimeException :代码运行运行之后才会出现的异常
​
2.非运行时异常CheckedException: 在编译时期就会出现的异常
FileInputStream ins=new FileInputStream("");

常见的异常类型

异 常 类 型说 明
Exception异常层次结构的父类
ArithmeticException算术错误情形,如以零作除数
ArrayIndexOutOfBoundsException数组下标越界
NullPointerException尝试访问 null 对象成员空指针(空指针异常)
ClassNotFoundException不能加载所需的类
IllegalArgumentException方法接收到非法参数
ClassCastException对象强制类型转换出错
NumberFormatException数字格式转换异常,如把"abc"转换成数字

三,异常处理

1.捕获异常

使用try-catch块捕获异常,分为三种情况:

package com.sk.test;
​
import java.util.Scanner;
​
/**
 * ClassName: Dome01 <br/>
 * Description: <br/>
 * date: 2021/12/10 8:20<br/>
 *
 * @author 斑马<br />
 */
public class Dome02 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        try{//try中放的是 有可能出现异常的代码
            System.out.print("请输入被除数:");
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(num1 + "/" + num2 + "=" + (num1 / num2));
        }catch (ArithmeticException e){//catch出现异常之后怎么去处理
            //()中放的是有可能出现的异常类型
            e.printStackTrace();//打印出现的异常,和异常发生的位置
        }
        System.out.println("感谢使用本程序!");
    }
}
​

解决异常不匹配:多重catch块

引发多种类型的异常 排列catch 语句的顺序:先子类后父类 发生异常时按顺序逐个匹配 只执行第一个与异常类型匹配的

package com.sk.test;
​
import java.util.InputMismatchException;
import java.util.Scanner;
​
/**
 * ClassName: Dome01 <br/>
 * Description: <br/>
 * date: 2021/12/10 8:20<br/>
 *
 * @author 斑马<br />
 */
public class Dome02 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        try{//try中放的是 有可能出现异常的代码
            System.out.print("请输入被除数:");
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(num1 + "/" + num2 + "=" + (num1 / num2));
        }catch (ArithmeticException e){//catch出现异常之后怎么去处理
            //()中放的是有可能出现的异常类型
            e.printStackTrace();//打印出现的异常,和异常发生的位置
        }catch (InputMismatchException e){
            e.printStackTrace();
        }
        System.out.println("感谢使用本程序!");
    }
}

tyr catch finally

无论有没有异常都会执行finally块的代码,除非遇见强制退出虚拟机

package com.sk.test;
​
import java.util.InputMismatchException;
import java.util.Scanner;
​
/**
 * ClassName: Dome01 <br/>
 * Description: <br/>
 * date: 2021/12/10 8:20<br/>
 *
 * @author 斑马<br />
 */
public class Dome02 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        try{//try中放的是 有可能出现异常的代码
            System.out.print("请输入被除数:");
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(num1 + "/" + num2 + "=" + (num1 / num2));
        }catch (ArithmeticException e){//catch出现异常之后怎么去处理
            //()中放的是有可能出现的异常类型
            e.printStackTrace();//打印出现的异常,和异常发生的位置
        }catch (InputMismatchException e){
            e.printStackTrace();
        }finally {
            System.out.println("感谢使用本程序!");
        }
    }
}
​

面试题:

try-catch块中存在return语句,是否还执行finally块,如果执行,说出执行顺序

答:finally会执行,无论是否发生异常都会先执行finally,再去执行return

package com.sk.test;
​
import java.util.Scanner;
​
/**
 * ClassName: Dome03 <br/>
 * Description: <br/>
 * date: 2021/12/10 10:13<br/>
 *
 * @author 斑马<br />
 */
public class Dome03 {
    public static int  a(){
        Scanner sc=new Scanner(System.in);
        try{
            System.out.println("请输入数字:");
            int a=sc.nextInt();
            return a;
        }catch (Exception e){
            e.printStackTrace();
            return 0;
        }finally {
            System.out.println("执行");
        }
        //报错,永远执行不到
        //System.out.println("as");
    }
​
    public static void main(String[] args) {
        System.out.println(a());
    }
}
​

2.声明异常throws

throws声明某个方法可能抛出的各种异常

package com.sk.test;
​
import java.util.InputMismatchException;
import java.util.Scanner;
​
/**
 * ClassName: Dome04 <br/>
 * Description: <br/>
 * date: 2021/12/10 10:23<br/>
 *
 * @author 斑马<br />
 */
public class Dome04 {
​
    public static int a()  throws Exception {//声明了一个异常
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int a=sc.nextInt();
        return a;
    }
    //第一种解决办法 :继续声明,下一个调用者还是要处理,不建议
    public static void b() throws Exception {
        a();
    }
    //第二中解决办法:处理异常(捕获)  主动解决
    public static void c()  {
        try {
            b();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        c();//c()中已经对异常进行了处理,所有后续的调用者不需要再次处理
    }
}
​

谁调用,谁处理

3.抛出异常 throw

抛出异常之后,必须声明

调用者需要去处理异常

package com.sk.test;
​
/**
 * ClassName: Persion <br/>
 * Description: <br/>
 * date: 2021/12/10 10:46<br/>
 *
 * @author 斑马<br />
 */
public class Person {
    private String name;
​
    public String getName() {
        return name;
    }
    //抛出异常之后,必须声明
    public void setName(String name) throws Exception {
        if(name.equals("男")||name.equals("女")){
            this.name = name;
        }else {
            throw new Exception("性别错误");
        }
    }
​
    public static void main(String[] args)  {
        Person p=new Person();
        try {
            p.setName("a");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getStackTrace());
            System.out.println(e.getMessage());
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

斑马有点困

原创不易,多谢打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值