Java异常处理(附常见的异常)

一、异常概述
在编程中往往会出现这样或者那样的错误,这些错误就称之为异常

二、如何处理异常错误
如果在某个方法中抛出异常,既可以在当前方法中捕捉,然后处理该异常,也可以将异常向上抛出,由方法的调用者来处理

三、捕捉异常
Java语言的异常捕捉结构由try,catch和finally组成,其中try存放的是可能发生Java语句;catch程序块在try语句块之后,用来激发被捕获的异常;finally语句是异常处理结构最后一个部分,无论try块中的代码如何退出,都将执行finally块
语法:

try{
    //程序代码
}
catch(Exceptiontype1 e){
    //对Exceptiontype1 的处理
}
catch(Exceptiontype2 e){
    //对Exceptiontype2 的处理
}
......
finally{
    //程序块
}

1、try-catch语句

public class Take {
    public static void main(String[] args) {
        try {
            String str = "Iverson";
            System.out.print(str + "的age ");
            int age = Integer.parseInt("20L");
            System.out.println(age);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("End");
    }
}

结果是:
这里写图片描述
从上面的代码可以看出报的是NumberFormatException(字符串转换为数字)的错误,在最后的时候同样输出了End,说明Java的异常处理是结构化的,不会因为一个异常就影响整个程序的运行
注意:在catch语句中主要有以下几种函数来获取异常的相关信息
I、getMessage()函数:输出错误的性质
II、toString()函数:给出异常的类型和性质
III、printStackTrace()韩式:指出异常的类型,性质,栈层次及出现在程序中的位置
(一定不可以忽略这些函数,要不然出现错误是很难找到的)
2、finally语句块
一般而言,完整的异常处理语句一定要包含finally语句,无论程序有无异常发生,无聊了之间的try-catch语句是否顺利执行,都会执行finally语句,但是下面的4种情况是不会执行的
I、在finally语句块中出现异常
II、在前面的代码中使用了System.exit()退出程序
III、程序所在的线程死亡
IV、关闭了CPU

四、Java常见的异常
ClassCastException:类型转换异常
ClassNotFoundException:未找到相应类异常
ArithmeticException:算数异常
ArrayIndexOutOfBoundsException:数组下标越界异常
ArrayStoreException:数组中包含不兼容的值抛出的异常
SQLException:操作数据库异常
NullPointerException:空指针异常
NoSuchFieldException:字段未找到异常
NoSuchMethodException:方法未找到异常
NumberFormartException:字符串转换为数字抛出的异常
NegativeArraySizeException:数组元素格式是负数抛出的异常
StringIndexOutOfBoundsException:字符串索引超出范围抛出的异常
IOException:输入输出异常
IllegalAccessException:不允许访问某类异常
InstantiationException:当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常
EOFException:文件已结束异常
FileNotFoundException:文件未找到异常

五、自定义异常
用户只需继承Exception类就可以自定义异常,步骤如下:
1、创建自定义异常类。
2、在方法中通过throw关键字抛出异常对象
3、如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步的操作
先创建个MyException类

package com.example.exception;

public class MyException extends Exception {
    public MyException(String Error) {
        super(Error);
    }
}

再创建Tran类

package com.example.exception;

public class Tran {// 创建方法
    // 定义方法,抛出异常
    static int a(int no1, int no2) throws Exception {
        if (no1 > 10 || no2 > 10) {// 判断方法中参数是否满足指定条件
            throw new MyException("数值是大于10的");// 错误信息
        }
        return (no1 + no2) / 2;
    }

    public static void main(String[] args) throws Exception {
        try {
            int result = a(12, 13);// 调用a的方法
            System.out.println(result);// 将a的方法的返回值输出
        } catch (MyException e) {
            System.out.println(e);
        }
    }
}

运行结果是:
这里写图片描述
这就是自定义异常

六、在方法中抛出异常
1、使用throws关键字抛出异常
throws关键字通常被应用在声明方法时。用来指定方法可能抛出的异常,多个异常可以用“,”隔开

package com.example.exception;

public class Tran {// 创建方法
    // 定义方法,抛出异常
    static int a(int no1, int no2) throws Exception {
        if (no1 > 10 || no2 > 10) {// 判断方法中参数是否满足指定条件
            throw new MyException("数值是大于10的");// 错误信息
        }
        return (no1 + no2) / 2;
    }

    public static void main(String[] args) throws Exception {
        try {
            int result = a(12, 13);// 调用a的方法
            System.out.println(result);// 将a的方法的返回值输出
        } catch (MyException e) {
            System.out.println(e);
        }
    }
}

结果:
这里写图片描述
2、使用throw关键字抛出异常
throw关键字通常用于方法体中,并且抛出一个异常对象,程序在执行到throw语句时就立即终止,它后面的语句就不执行了,通过throw抛出异常后,如果想在上一级代码中捕获并处理异常,则就需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常,如果要捕捉throw抛出的异常就必须使用try-catch语句块
先创建个异常类:

package com.example.exception;

public class MyException extends Exception {
    String Message;

    public MyException(String Error) {
        Message = Error;
    }

    public String getMessage() {
        return Message;
    }
}

再编写Captor类

package com.example.exception;

public class Captor {//创建类
    static int q(int x, int y) throws MyException {//定义方法抛出异常
        if (y < 0) {//判断参数是否小于0
            throw new MyException("y不能为0");
        }
        return x + y;//返回值
    }

    public static void main(String[] args) {
        try {//try语句中包含可能出现异常的语句
            int result = q(2, -1);//调用q方法
        } catch (MyException e) {//处理自定义异常
            System.out.println(e.getMessage());//输出信息
        }

    }
}

结果:
这里写图片描述
这里要注意catch语句的顺序(见下面的例子)

try{
}
catch(MyException e){
//异常1
}
catch(ArithMeticException e){
//异常2
}
catch(Exception e){
//异常3
}

这里执行的顺序就是如果会发生异常1就到第一个的catch代码块中执行,同理,但是由于异常3是所有异常的父类,如果将这个放在最前面,后面就永远不能执行了,也就没什么意义了。

七、运行时的异常
运行时异常就是RuntimeException异常,在程序运行的过程中产生的异常,Java类库中的每个包都定义了异常类,所有的这些类都是ThrowTable类的子类,ThrowTable类派生了两个子类,分别是Exception和Error类,Error类及其子类是用来描述Java运行系统中的内部错误和资源耗尽的错误,这类错误比较严重,Exception类为非致命性类,可以 通过捕捉处理使程序继续执行,Exception类又根据错误发生的原因分为RuntimeException异常和除此之外的异常,一下的RuntimeException异常是可以通过try-catch语句捕获的。
NullPointerException:空指针异常
ArrayIndexOutOfBoundsException:数组 下标越界异常
ArithmeticException:算数异常
IllegalArgumentException:非法参数异常
SecurityException:安全型异常
NegativeArraySizeException:数组长度为负异常

八、异常使用原则
1、在当前方法声明中使用try-catch捕获异常
2、一个方法被覆盖时,覆盖他的方法必须抛出相同的异常或者异常的子类
3、如果父类抛出多个异常,则覆盖方法必须抛出那些异常的子集,不能抛出新的异常 。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值