Bootstrap

异常处理体系(throw,throws,try-catch,自定义异常)

异常Throwable分为Error和Exception,Exception分为RuntimeException和其他

Error:通过代码无法解决的严重问题,比如内存溢出

编译时异常,java编译器强制要求方法必须声明可能抛出的异常,或者在调用可能抛出这些异常方法的时显式捕获他们。

RuntimeException类,运行时异常,不要求必须声明抛出运行时异常,因为他们是编程错误,必须在编译阶段避免。

Throws声明异常

throws在方法签名中使用他来声明该方法可能抛出的异常类型,告知调用者需要处理或再次声明这些异常。常用格式如下,在方法名后写异常类名,如果有多个用逗号隔开:

public static void 方法名() throws 异常类名1 ,异常类名2,…{}

throw抛出异常

常用在方法体里面,用于抛出异常,常用格式如下

throw new 异常类名();

try-catch 抛出异常

用法格式如下:

try { 可能出现异常的代码;}

catch(异常类名 变量名) {异常的处理代码;}

当有多个catch时可以一直向下写,如果异常之间有继承关系,父类要写在最后

Throwable成员方法

toString():返回此可抛出的简短描述  System.out.println(e.toString());

getMessage():返回此 throwable 的详细消息字符串System.out.println(e.getMessage());

printStackTrace():把异常的错误信息输出在控制台 e.printStackTrace();

自定义异常

当Java中提供的异常不能满足我们的需求时使用自定义异常解决,以下题为例

编写一个计算N个整数平均值的程序。程序应该提示用户输入N的值,如何必须输入所有N个数。如果用户输入的值是一个负数,则应该抛出一个异常并捕获,提示“N必须是正数或者0”。并提示用户再次输入该数(自定义异常)。

//首先编写异常类
//1、定义异常类NumberOutOfIndexException
//2、写继承关系,extends RuntimeException

public class NumberOutOfIndexException extends RuntimeException{
//3、提供空参构造,继承父类的空参构造
    public NumberOutOfIndexException() {
        super();
    }
//4、提供带参构造,继承父类的有参构造
    public NumberOutOfIndexException(String message) {
        super(message);
    }
}
import java.util.Scanner;   //使用键盘录入
import java.util.InputMismatchException;   //使用输入异常
class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("你想计算几个数的平均数 ");
        int n = 0;
        while (true) {
            try {   //使用try...catch方式

                n = sc.nextInt();
                if (n < 0) {   //如果输入的数小于0就使用自定义异常
                    throw new NumberOutOfIndexException(); //throw抛出异常
                }
                break;
            } catch (InputMismatchException e) {
                System.out.println("请输入整数");  //防止输入小数造成运行中断使用输入异常
                sc.next();
            } catch (NumberOutOfIndexException e) {
                System.out.println("N为正整数或0");
            }
        }

        double sum = 0; //使用double,平均数大概率为小数
        int m;

        if (n == 0) {  //输入为0就不用计算平均数了,为0
            System.out.println("平均值为0");
        } else {


            for (int i = 1; i < n + 1; i++) {
                while (true) {
                    try {
                        System.out.println("请输入第" + i + "个数");
                        m = sc.nextInt();
                        if (m < 0) {
                            throw new NumberOutOfIndexException();
                        }
                        sum = sum + m;
                        break;
                    } catch (InputMismatchException e) {
                        System.out.println("请输入整数");
                        sc.next();
                    } catch (NumberOutOfIndexException e) {
                        System.out.println("N为正整数或0");
                    }
                }
            }
            double avg = sum / n;
            System.out.println("平均值为:"+avg);

        }
    }
}

最终运行结果如下: 


你想计算几个数的平均数 
2
请输入第1个数
0.3
请输入整数
请输入第1个数
-3
N为正整数或0
请输入第1个数
4
请输入第2个数
5
平均值为:4.5

Process finished with exit code 0

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;