异常处理


1.异常概述

  1. Error: JVM无法解决的严重问题。比如栈溢出,这种情况不编写针对性代码处理
  2. Exception:编程错误或外在因素导致的错误:比如空指针访问、数组越界
  3. 运行时异常:编程的逻辑错误 比如除数为0 数组越界 可以不做处理,保证逻辑正确即可
  4. 编译时异常:必须要处理

2.常见异常

  • java.lang,RuntimeExceprion
    1. 类转化异常
    2. 数组越界异常
    3. 空指针异常
    4. 算术异常
    5. 数据格式异常
  • java.io.IOException
    1. 文件未找到异常
    2. 文件结束异常
  • java.lang.ClassNotFoundException
  • java.lang.InterruptedException
  • java.io.FileNotFoundException
  • java.sql.SQLException
package JavaBasis.chapter7;

public class IndexOutExp {
    public static void main(String[] args) {
        String friends[]={"lisa","biby","mike"};
        for(int i=0;i<5;i++)
        {
            System.out.println(friends[i]);
        }
         System.out.println("end");
    }
}

lisa
biby
mike
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
        at JavaBasis.chapter7.IndexOutExp.main(IndexOutExp.java:8)
package JavaBasis.chapter7;

public class NullRef {
    int i=1;
    public static void main(String[] args) {
        NullRef t=new NullRef();
        System.out.println(t.i);
        t=null;
        System.out.println(t.i);
    }
    
}
1
Exception in thread "main" java.lang.NullPointerException
        at JavaBasis.chapter7.NullRef.main(NullRef.java:9)
package JavaBasis.chapter7;

public class DivideZero {
    int x;//默认值0
    public static void main(String[] args) {
        int y;
        DivideZero c=new DivideZero();
        y=3/c.x;
        System.out.println("end");
    }
}
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at JavaBasis.chapter7.DivideZero.main(DivideZero.java:8)
PS D:\VS_Code_Java> 
package JavaBasis.chapter7;

import java.util.Date;

public class Order {
    public static void main(String[] args) {
        Object obj=new Date();
        Order order;
        order=(Order)obj;//类型转化异常
        System.out.println(order);
    }
    
}
Exception in thread "main" java.lang.ClassCastException: java.util.Date cannot be cast to JavaBasis.chapter7.Order
        at JavaBasis.chapter7.Order.main(Order.java:9)

3. try-catch-finally

  • 异常的抛出是从底往上的,最终会抛到OS然后终止程序
  • 一个方法内如果产生异常没有处理,就会抛到调用这个方法的上一层方法,若还未处理,会一直上抛,直到main方法,如果main方法也没有处理,则程序运行结束
  • try: 将可能出现异常的代码块放在try{}语句块中
  • catch: 对异常对象进行处理的代码,每个try可以伴随多个catch语句
  • catch的参数可以是确定已知的异常,也可以是该异常的父类,比如ArithmeticException处可以用RuntimeException,也可以用Exception
  • getMessage(): 获取异常信息,返回字符串
  • printStackTrace(): void类型,获取异常类名和异常信息,以及异常在程序中的位置
  • finallly: 不论try块中是否发生了异常,catch中是否有异常,catch语句中是否有return,finally块中的语句一定会执行
  • finally语句和catch语是任选的
package JavaBasis.chapter7;

public class IndexOutExp {
    public static void main(String[] args) {
        String friends[]={"lisa","biby","mike"};

         try {
            for(int i=0;i<5;i++)
            {
                System.out.println(friends[i]);
            }
         } catch (ArrayIndexOutOfBoundsException e) {
             System.out.println("index error");
         }
        
        System.out.println("end");
    }
}
lisa
biby
mike
index error
end
package JavaBasis.chapter7;

public class DivideZero {
    int x;//默认值0
    public static void main(String[] args) {
        int y;
        DivideZero c=new DivideZero();
        try {
            y=3/c.x;
        } catch (Exception e) {
            System.out.println("divided by zero error");
        }
       
        System.out.println("end");
    }
}
divided by zero error
end
  • 对于运行时异常Java可以自己捕获,而对于像IOException等非运行时异常,则必须捕获,不然编译错误
package JavaBasis.chapter7;

import java.io.FileInputStream;

public class IOExp {
    public static void main(String[] args) {
        FileInputStream in=new FileInputStream("text.txt");
        int b;
        b=in.read();
        while(b!=-1)
        {
            System.out.println((char)b);
            b=in.read();
        }
        in.close();
        
    }
}
//上述代码无法通过编译
package JavaBasis.chapter7;

import java.io.FileInputStream;

public class IOExp {
    public static void main(String[] args) {

        try {
            FileInputStream in=new FileInputStream("D://VS_Code_Java//JavaBasis//chapter7//a.txt");
        int b;
        b=in.read();
        while(b!=-1)
        {
            System.out.println((char)b);
            b=in.read();
        }
            in.close();
        } catch (Exception e) {
            System.out.println(e);
        }finally{
            System.out.println("read end");
        }
        
       

    }
}
h
e
l
l
o

w
o
r
l
d
read end

4.throws

  • 除了上面的try-catch-finally语句块捕获异常,声明抛出异常也是Java的一种异常处理方式
  • 如果一个方法中可能产生某种异常,而该方法不知道如何处理这种异常,可以显示地将这些异常抛给该方法的调用者
package JavaBasis.chapter7;

import java.io.FileInputStream;
import java.io.IOException;

public class ThrowsTest {

    public static void main(String[] args) {
        ThrowsTest t=new ThrowsTest();
        try {
            t.readFile();
        } catch (Exception e) {
         e.printStackTrace();
        }
    }
    public void readFile() throws IOException
    {   
        //readFile函数未对异常做出处理 而是将异常抛给它的调用者mian函数去处理
        FileInputStream in=new FileInputStream("D://VS_Code_Java//JavaBasis//chapter7//a.txt");
        int b;
        b=in.read();
        while(b!=-1)
        {
            System.out.println((char)b);
            b=in.read();
        }
            in.close();
    }
    
}
  • 重写方法不能比原方法抛出的异常类型要大,因此子类对父类重写的方法抛出的异常类型不能大于父类方法抛出的异常

5.手动抛出异常

  • 生成异常类对象,然后通过throw(不是throws)语句抛出异常
  • IOException e=new IOException(); throw e;

6.自定义异常类

  • 用户自定义异常类一般都是RuntimeException的子类
  • 自定义异常通常需要编写几个重载的构造器
  • 自定义异常需要提供serialVersionUID
  • 自定义异常通过throw抛出
  • 在方法内使用throw 自定义异常需要在方法外面再加上throws 自定义异常,throw系统自带的异常则不需要在方法外面throws
package JavaBasis.chapter7;

import javax.lang.model.util.ElementScanner6;

public class MyExpTest {
    public void redist(int num) throws MyException {//这里需要加上throws
        if(num<0)
           throw new MyException("人数是负值", 3);
        else
        System.out.println("登记人数:"+num);
        
    }

    public void manager()
    {
        try {
            redist(-1);
        } catch (MyException e) {
            System.out.println("登记失败,出错种类:"+e.getId());
        }
        System.out.println("登记结束");
    }
    public static void main(String[] args) {
        MyExpTest t=new MyExpTest();
        t.manager();
    }
    
}

class MyException extends Exception {
    static final long serialVersionUID=12345678L;
    private int idnumber;

    public MyException(String message,int id)
    {
        super(message);
        this.idnumber=id;
    }
    public int getId(){
        return idnumber;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CodePanda@GPF

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

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

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

打赏作者

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

抵扣说明:

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

余额充值