Java--异常处理

异常的类型

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

——Error:JVM、硬件、执行逻辑错误,不能手动处理

——StackOverflowError :栈空间不足异常

——OutOfMemoryError :内存不足异常

——Exception:程序在运行和配置中产生的问题,可处理

——RuntimeException:运行时异常,可处理,可不处理

——CheckedException:检查时异常,必须处理

常见运行时异常

NullPointerException:空指针异常

ArrayIndexOutOfBoundsException :数组越界异常

ClassCastException:类型转换异常

NumberFormatException:数字格式化异常

ArithmeticException:算术异常

异常传递

按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认异常处理。

异常处理

Java的异常处理是通过5个关键字来实现的:

try:执行可能产生异常的代码

Catch:捕获异常,并处理

finally:无论是否发生异常,代码总能执行

throw:手动抛出异常

throws:声明方法可能要抛出的各种异常

异常处理形式

1、try{
  可能出现异常的代码块
  } catch(Execption e){
  异常处理的相关代码 如:getMessage()、printStackTrace()
  }

2、try{
  可能出现异常的代码块
  } catch(Execption e){
  异常处理的相关代码 如:getMessage()、printStackTrace()
  }finally{
  是否发生异常都会执行,可以释放资源等..
  }
  (1)finally块是否发生异常都执行,可以释放资源
  (2)finally块不执行的唯一情况,退出java虚拟机
3、try{
     
  }catch(异常类型1){
     
  }catch(异常类型2){
     
  }catch(异常类型3){
     
  }
  (1)子类异常在前,父类异常在后
  (2)发生异常时按顺序逐个匹配
  (3)只执行第一个与异常类型匹配的catch语句
  (4)finally根据需要可写可不写
4、try{
 
  }finally{
 
  }    
  try...finally 不能捕获异常,仅仅用来当发生异常时,用来释放资源
  一般用在底层代码,只释放资源不做异常处理,把异常向上抛出

声明异常

throws:声明异常 修饰在方法参数的后端

谁调用谁就要处理异常或者声明异常,否则会报错

使用原则:底层代码向上声明或者抛出异常,最上层一定要处理异常,否则程序中断

package com.monv.exception;
​
import java.util.Scanner;
​
/**
​
 * throws:声明异常
 * @author Administrator
   *
    */public class Demo {
    public static void main(String[] args) {
        try {
            divde();
        } catch (Exception e) {
            // TODO Auto-generated catch block
//          e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }
    public static void divde() throws Exception {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入第一个数字:");
        int num1 = input.nextInt();
        System.out.println("请输入第二个数字:");
        int num2 = input.nextInt();
        int result = num1/num2;
        System.err.println("结果为:"+result);
    }
}

 

抛出异常

除了系统自动抛出异常外,有些问题需要程序员自行抛出异常

throw关键字:抛出异常

语法:throw 异常对象

//1.处理方法1
    public void setSex(String sex){
        if (sex.equals("女")||sex.equals("男")){
                this.sex = sex;
          } else {
                throw new RuntimeException("性别不符合要求");
          }
    }
    
    public void setAge(int age) {
        if (age >0 && age<=120 ){
             this.age = age;
        }else {
            //抛出异常 告知年龄输入错误
            throw new RuntimeException("年龄不符合要求");
         }
    }       
    //2.处理方法2 声明异常 在程序编写调用的时候会知道要处理异常
    public void setAge(int age) throws Exception{
        if (age >0 && age<=120 ){
             this.age = age;
        }else {
            //抛出异常 告知年龄输入错误
            throw new Exception("年龄不符合要求");
         }
    }
    public void setSex(String sex) throws Exception{
        if (sex.equals("女")||sex.equals("男")){
            this.sex = sex;
        } else {
            throw new Exception("性别不符合要求");
        }
    }  

自定义异常

需继承自Exception或Exception的子类,常用RuntimeException

必须提供的构造方法:

1、无参数构造方法

2、String message参数的构造方法

目的:使抛出的异常类型更加准确

带有异常声明的方法覆盖

子类中的方法,不能抛出比父类更多、更宽的异常

posted @ 2020-11-25 14:52  改Bug的小魔女  阅读(106)  评论(0编辑  收藏  举报