异常、异常处理

一、异常

1.异常介绍

异常:程序无法正常执行。

异常(Throwable):包含Error和Exception两个子类

Error:这类不需要程序员关注,一般是由虚拟机生成并脱出。

2.异常(Exception)的种类

1.运行时异常(RuntimeException):在运行期间发生的异常,编译通过。

常见的运行时异常:

1.空指针异常(NullPointerException):当对象无法正常存在,会发生空指正。

处理方法:使用if判断

2.类型转换异常(ClassCastException):在多态中不同子类之间的转换,会发生类型转换异常。

处理方法:使用intansceof判断是否符合类型转换

public class TextEp {
    public static void main(String[] args) {
        //类型转换异常:ClassCastException
        A a1=new B();//B子类对象不能转为C子类
        //C c=(C)a1;//运行时发生异常
        //处理异常的方法:instanceof
        if(a1 instanceof C) {
            C c=(C)a1;
        }   
    }
}
class A{
    public void print() {
        System.out.println("父类方法");
    }
}
class B extends A{
    public void input() {
        System.out.println("A子类方法");
    }
}
​
class C extends A{
    public void test() {
        System.out.println("B子类方法");
    }
}

3.数学异常(ArithmeticException):例如除数为0时,则会出现数学异常。

处理方法:使用if进行判断(增强程序的健壮性)

public class TextEp {
    public static void main(String[] args) {
        //运行时的异常
        //数学异常
        int a=0;
        //System.out.println(5/a);//运行时发生异常
        //处理数学异常:if
        if(a>0) {
            System.out.println(5/a);
        }
            
    }
}

4.数字转换异常(NumberFormatException)

public class TextEp {
    public static void main(String[] args) {
        //数字转换异常:空指针(NullPointerException)
        String str="abc";
        str=null;
        //System.out.println(str.length());
        //解决异常的方法
        if(str!=null) {
            System.out.println(str.length());
        }
            
    }
}

5.数组下标越界

6.数组长度负数异常

 

2.编译时异常( CheckedException):发生在编译期间,如果不处理程序无法运行。

 

3.异常处理

1.throw:异常抛出,抛给上一层处理,当前不处理。

2.try....catch....finally:异常捕获。

try中一旦遇到异常,try后面的代码不会继续执行,直接去找对应的catch,如果存在多个catch,从上到下依次判断。

无论try中是否出现异常,都会执行finally中的代码。

一个try后面可以跟多个catch,但至少有一个。

try中有多个catch时,捕获异常类型的范围要从小到大。

 

4.自定义异常

1.直接或间接的继承Throwable

2.运行时异常:继承自RuntimeException

package com.rexception;
//自定义异常:运行时出现异常
public class TestC {
    public static void main(String[] args) throws B {
        //运行时异常
        User user=new User();
        user.setNum("123");
    }
    
    
}
//自定义异常:运行时 RuntimeException
class B extends RuntimeException{
    public B() {
        
    }
    public B(String str) {
        super(str);
    }
}
​
//javabean:存储数据
class User{
    private String name;
    private String num;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getNum() {
        return num;
    }
    public void setNum(String num) throws B {
        if(num.length()==11) {
            this.num = num; 
        }else {
            //抛出异常
            System.out.println("电话格式不正确");
            throw new B("电话长度必须11");
        }
        
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", num=" + num + "]";
    }
    
}

3.编译时异常: Exception或者某一个编译时异常的子类

public class TestR {
    public static void main(String[] args) {
        //自定义异常:编译时
        User user=new User();
        String num="1234";
        try {
            user.setNum(num);
        } catch (A e) {
            e.printStackTrace();
        }
        System.out.println(user);
    }
}
​
//自定义异常:对电话长度不等于11时报出异常
class A extends Exception{
    //创建空构造器
    public A() {
        
    }
    //自定义构造器
    public A(String str) {
        super(str);//调用父类Exception传输值
    }
}
​
//javabean:存储数据
class User{
    private String name;
    private String num;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getNum() {
        return num;
    }
    public void setNum(String num) throws A {
        if(num.length()==11) {
            this.num = num; 
        }else {
            //抛出异常
            System.out.println("电话格式不正确");
            throw new A("电话长度必须11");
        }
        
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", num=" + num + "]";
    }
    
}

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值