异常处理(一)


捕获处理
try catch finally
try
{
//用于包裹可能发生异常的代码,其后面必须跟catch或finally
}
catch(数据类型 变量名)//可能有多个
{
//用于捕获某种try中引发的异常,并且执行引发此异常的代码
}
finally
{
//必须执行的代码部分
}
异常和错误的区别
异常:程序在各种复杂甚至是极端过程中产生的不正常的情况
处理方式: 异常处理
错误:程序编写时存在硬伤,导致问题不解决将无法正常执行
处理方式: 修改代码

编译器异常和运行期异常

编译期异常:必须在编译之前进行处理的异常(直接继承自Exception)
运行期异常:可以不去主动处理的异常(继承自RuntimeException的异常)
例:判断下列异常是编译期异常还是运行期异常
java.lang.NullPointerException
java.lang.ArrayIndexOutOfBoundsException
java.lang.ArithementException
java.lang.ParseException
java.lang.ClassCastException
在这里插入图片描述
故只有java.lang.ParseException 为编译期异常

异常的抛出处理

throw关键字

自定义异常

1.创建异常对象
例:创建人类对象,包含姓名,年龄,性别,当年龄大于120岁时引发异常
自定义异常

public class InformationException extends RuntimeException
{
    public InformationException(String message)
    {
        super(message);
    }
}

不满足要求时抛出异常

class Person
{
     private String name;
     private int age;
     private String sex;

    public void setName(String name)
    {
        this.name = name;
    }

    public void setAge(int age)
    {
        if(age<120)
        this.age = age;
        else
        {
            InformationException ie = new InformationException("年龄输入为"+age+"岁,不符合要求");
            throw ie;
        }
    }

    public void setSex(String sex)
    {
        this.sex = sex;
    }

    @Override
    public String toString()
    {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}
public class B
{
    public static void main(String[] args)
    {
        Person person = new Person();
        try
        {
            person.setAge(121);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        person.setName("小王");
        person.setSex("男");
        System.out.println(person);
    }
}


结果

在这里插入图片描述

创建一个商品类
1.商品名称(String)
2.过期日期(LocalDate)要求不能小于当前日期
3.重量(Double)不能为0或负数
自定义异常

public class OutOfNormalException extends RuntimeException
{
    public OutOfNormalException(String message)
    {
        super(message);
    }
}

抛出异常

import java.time.LocalDate;

class Good
{
    private String name;
    private LocalDate localDate;
    private double weight;

    public void setName(String name)
    {
        this.name = name;
    }

    public void setLocalDate(LocalDate localDate)
    {

        if(localDate.isAfter(LocalDate.now()))
        this.localDate = localDate;
        else
        {
            OutOfNormalException outOfNormalException = new OutOfNormalException("日期不符合要求");
            throw outOfNormalException;
        }
    }

    public void setWeight(double weight)
    {
        if(weight>0)
        this.weight = weight;
        else
        {
            OutOfNormalException outOfNormalException = new OutOfNormalException("重量不符合要求");
            throw outOfNormalException;
        }
    }

    @Override
    public String toString()
    {
        return "Good{" +
                "name='" + name + '\'' +
                ", localDate=" + localDate +
                ", weight=" + weight +
                '}';
    }
}
public class C
{
    public static void main(String[] args)
    {
        Good good = new Good();
        try
        {
            good.setLocalDate(LocalDate.now().minusDays(1));
            good.setName("商品1");
            good.setWeight(10);
            System.out.println(good);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        Good good1 = new Good();
        try
        {
            good1.setLocalDate(LocalDate.now().plusDays(1));
            good1.setName("商品二");
            good1.setWeight(0);
            System.out.println(good1);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}


2.throw关键字

import java.time.LocalDate;

class Good
{
    private String name;
    private LocalDate localDate;
    private double weight;

    public void setName(String name)
    {
        this.name = name;
    }

    public void setLocalDate(LocalDate localDate)
    {

        if(localDate.isAfter(LocalDate.now()))
        this.localDate = localDate;
        else
        {
            OutOfNormalException outOfNormalException = new OutOfNormalException("日期不符合要求");
            throw outOfNormalException;
        }
    }

    public void setWeight(double weight)
    {
        if(weight>0)
        this.weight = weight;
        else
        {
            OutOfNormalException outOfNormalException = new OutOfNormalException("重量不符合要求");
            throw outOfNormalException;
        }
    }

    @Override
    public String toString()
    {
        return "Good{" +
                "name='" + name + '\'' +
                ", localDate=" + localDate +
                ", weight=" + weight +
                '}';
    }
}
public class C
{
    public static void main(String[] args)
    {
        Good good = new Good();
        try
        {
            good.setLocalDate(LocalDate.now().minusDays(1));
            good.setName("商品1");
            good.setWeight(10);
            System.out.println(good);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        Good good1 = new Good();
        try
        {
            good1.setLocalDate(LocalDate.now().plusDays(1));
            good1.setName("商品二");
            good1.setWeight(0);
            System.out.println(good1);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}


结果
在这里插入图片描述

throw和throws的区别

  1. throw用在方法体内,throws用在方法声明
  2. throw后面跟的是异常对象且只能跟一个,throws后面跟的是异常类且可以跟多个
  3. throw抛出的异常由方法体内的语句处理(try-catch),throws抛出的异常由方法的调用者处理
  4. 4.执行throw一定抛出异常,执行throws只是表示异常的一种可能性,不一定抛出异常
    两者都是消极的处理异常的方式,只是对异常进行抛出而不处理,真正处理异常的为方法的调用者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值