java中异常处理

异常

java.lang.Throwable类是 Java 语言中所有错误或异常的超类

  • Exception:编译期异常,进行编译java程序出现的问题

    • RuntimeException:运行期异常,java程序运行过程中出现的问题
      异常就相当于程序有个一个小毛病(感冒,发烧),把异常处理掉,程序可以继续执行(吃点药,继续革命工作),是可以处理的
  • Error:错误
    错误就相当于程序得了一个无法治愈的毛病(非典,艾滋).必须修改源代码,程序才能继续执行

异常产生过程

代码示例

class ArrTool{
    public static int getElement(int[] nArr,int nIndex){
        int nElement=nArr[nIndex];
        return nElement;
    }
}


public class ExceptionDemo {
    public static void main(String[] args) {
        int[] arr = { 34, 12, 67 };
        intnum = ArrayTools.getElement(arr, 4)
        System.out.println("num=" + num);
        System.out.println("over");
    }
}

异常分析如下图
在这里插入图片描述

异常的处理

抛出异常

抛出异常使用关键字throw,throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行

  • 使用格式:
throw new 异常类名(参数)
注意:
    1. throw关键字必须写在方法的内部
    2. throw关键字后边new的对象必须是Exception或者Exception的子类对象
    3. throw关键字抛出指定的异常对象,我们就必须处理这个异常对象
    		throw关键字后边创建的是RuntimeException或者是 RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)
    		throw关键字后边创建的是编译异常(写代码的时候报错),我们就必须处理这个异常,要么throws,要么try...catch

代码示例

package cn.exception;


class ArrTool{
    public static int getElement(int[] nArr,int nIndex){
        //抛出异常
        if(nIndex<0||nIndex>nArr.length-1){
            throw new ArrayIndexOutOfBoundsException("兄嘚,下标越界了");
        }
        int nElement=nArr[nIndex];
        return nElement;
    }
}

public class ExceptionTest {

    public static void main(String[] args){
        int[] nArr={10,20,30};
        int nNum=ArrTool.getElement(nArr,4);
        System.out.println("nNum:"+nNum);
    }
}

在这里插入图片描述

异常处理

那么对于调用者来说两种处理方式

  • 一种就是继续讲问题声明出去,使用throws声明处理
    关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)
声明异常格式:方法 throws 异常类名1,异常类名2{   }
 **注意:**
        1.throws关键字必须写在方法声明处
        2.throws关键字后边声明的异常必须是Exception或者是Exception的子类
        3.方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常
            如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可
        4.调用了一个声明抛出异常的方法,我们就必须的处理声明的异常
            要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM
            要么try...catch自己处理异常

代码示例

package cn.exception;

//自定义异常
class FileNotFoundException extends Exception{
    //有参
    FileNotFoundException(String strExcetionMess) {
        super(strExcetionMess);
    }
}

public class ExceptionTest {
		//调用者main也不处理也是声明异常,让调用main函数的调用者处理,调用main函数的是jvm,所以交给jvm处理了
        public static void main(String[] args) throws FileNotFoundException {
            read("a.txt");
            System.out.println("ok");
        }
        // 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明
        public static void read(String strPath) throws FileNotFoundException {
            if (!strPath.equals("1.txt")) {//如果不是 1.txt这个文件
                // 如果不是 1.txt 认为 该文件不存在是一个错误 也就是异常则throw
                throw new FileNotFoundException("文件不存在");
            }
        }
}

在这里插入图片描述

  • 另一种是进行捕获处理(try-catch)
    • 捕获异常语法如下
try{
     编写可能会出现异常的代码
}catch(异常类型  e){
     处理异常的代码
     //记录日志/打印异常信息/继续抛出异常
}`

注意:try和catch都不能单独使用,必须连用

代码示例

package cn.exception;

//自定义异常
class FileNotFoundException extends Exception{
    //有参
    FileNotFoundException(String strExcetionMess) {
        super(strExcetionMess);
    }
}

public class ExceptionTest {
        public static void main(String[] args) throws FileNotFoundException {
            try{// 当产生异常时,必须有处理方式。要么捕获,要么声明。
                    read("a.txt");
            }catch (FileNotFoundException e) {//try中抛出的是什么异常,在括号中就定义什么异常类型
                System.out.println(e);
            }
            //处理异常后程序继续向下执行
            System.out.println("ok");
        }
        // 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明
        public static void read(String strPath) throws FileNotFoundException {
            if (!strPath.equals("1.txt")) {//如果不是 1.txt这个文件
                // 我假设  如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常  throw
                throw new FileNotFoundException("文件不存在");
            }
        }
}

在这里插入图片描述

finally关键字

finally:因为异常会引发程序跳转,导致有些语句执行不到,而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的
例如:try语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等),我们都得在使用完之后,必须关闭这些打开的资源

代码示例

package cn.exception;

//自定义异常
class FileNotFoundException extends Exception{
    //有参
    FileNotFoundException(String strExcetionMess) {
        super(strExcetionMess);
    }
}

public class ExceptionTest {
        public static void main(String[] args) throws FileNotFoundException {
            try{
                read("a.txt");
            }catch (FileNotFoundException e){
                //抓取到的是编译期异常  抛出去的是运行期
                throw new RuntimeException(e);
            }finally{
                System.out.println("不管程序是否异常都要执行");
            }

            System.out.println("ok");
        }
        // 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明
        public static void read(String strPath) throws FileNotFoundException {
            if (!strPath.equals("1.txt")) {//如果不是 1.txt这个文件
                // 我假设  如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常  throw
                throw new FileNotFoundException("文件不存在");
            }
        }
        
}

在这里插入图片描述

自定义异常

异常类定义:

  1. 自定义一个编译期异常: 自定义类 并继承于 java.lang.Exception
  2. 自定义一个运行时期的异常类:自定义类 并继承于java.lang.RuntimeException

代码示例

package cn.exception;

//自定义异常
class FileNotFoundException extends Exception{
    //有参
    FileNotFoundException(String strExcetionMess) {
        super(strExcetionMess);
    }
}
public class ExceptionTest {
        public static void main(String[] args) throws FileNotFoundException {
            try{
                read("a.txt");
            }catch (FileNotFoundException e){
                //打印异常信息
                e.printStackTrace();
            }
        }

        public static void read(String strPath) throws FileNotFoundException {
            if (!strPath.equals("1.txt")) {//如果不是 1.txt这个文件
                throw new FileNotFoundException("文件不存在");
            }
        }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值