java基础-day14-异常和集合
2021-06-26 本文已影响0人
触手不可及
异常和集合
1. 异常
1.1 生活中的异常
生病
医生: 你是怎么了?
我: 我难受
医生: 你那里难受
我: 我肚子疼
1.2 开发中的异常
主要划分为两大类
Error
Exception
统一的父类
Throwable 异常和错误的基类
主要了解的方法:
构造方法 Constructor
Throwable();
创建或者说生成一个异常/错误类对象,异常/错误信息为null
Throwable(String message);
创建或者说生成一个异常/错误类对象,异常/错误信息为message
成员方法:
String toString();
展示当前异常/错误的简要信息
String getMessage();
获取当前异常/错误的信息方法
void printStackTrace();
展示错误/异常的前因后果【红字】
package com.qfedu.a_throwable;
/**
* Throwable常用方法演示
* @author Anonymous
*
*/
public class Demo1 {
public static void main(String[] args) {
// 创建了一个Throwable类对象
// Throwable throwable = new Throwable();
Throwable throwable = new Throwable("急性肠胃炎");
System.out.println(throwable.getMessage());
System.out.println(throwable.toString());
// throwable.printStackTrace();
testThrowable();
}
public static void testThrowable() {
new Throwable("测试错误").printStackTrace();
}
}
1.3 异常和错误的区别
Exception
异常 可以处理,代码中也就不存在异常
Error
错误 只能避免
错误和异常根据报错结尾来判断不同的情况。
错误只能避免
异常有两种处理方式
1. 捕获
2. 抛出
1.4 捕获异常
格式:
try {
有可能出现异常的代码
} catch (异常对象) {
对应当前异常处理方式
}
try {
有可能出现异常的代码
} catch (异常对象) {
对应当前异常处理方式
} finally {
用于关闭当前程序使用到的资源。
}
package com.qfedu.a_throwable;
/*
* 异常捕获注意事项:
* 1. 当代码捕获异常之后,JVM会认为当前程序中并没有异常存在,继续执行代码
* 2. 代码从异常发生开始,不在正常运行
* 3. 代码中如果出现了多个异常,可以添加多个catch块进行捕获处理,对症下药
* 4. Exception可以处理所有异常,但是不能处理所有的异常都用Exception,
* 可以使用Exception捕获多余问题,或者说未发现问题
* 5. 可以使用 | 位或在同一个catch 中捕获多个异常。后期IDE工具会鄙视你
*/
public class Demo3 {
public static void main(String[] args) {
test(20, 0, null);
}
public static void test(int num1, int num2, int[] arr) {
int ret = 0;
try {
// 有可能出现异常的代码
arr[0] = 10;
System.out.println("你猜我运行吗???");
ret = num1 / num2;
} catch (ArithmeticException | NullPointerException e) {
System.out.println("都是异常");
} catch (Exception e) {
System.out.println("Exception是所有异常的基类");
}
System.out.println("ret : " + ret);
}
}
1.5 抛出异常
关键字:
throw
在代码中满足条件的情况下,抛出异常
throws
在【方法声明】位置告知调用者,这里有哪些异常抛出
package com.qfedu.a_throwable;
/*
* 抛出异常特征:
* 1. 抛出异常就是一个高级版的参数合法性判断
* 2. 代码中如果使用throw抛出指定异常,必须在代码声明位置告知调用者
* 当前方法存在哪些异常抛出
* 3. 异常从抛出位置开始,之后的代码就不再运行。
* 4. 同一个代码块中不得抛出多个异常,如果代码需要抛出多个异常,需要执
* 行不同的判断条件。
* 5. 如果调用的方法存在抛出异常, 这里需要采用异常处理方式,
* a. 捕获异常
* b. 抛出异常
* NullPointerException
* ArrayIndexOutOfBoundException
*/
public class Demo4 {
public static void main(String[] args)
throws ArithmeticException, NullPointerException {
try {
test(10, 0, null);
} catch (ArithmeticException | NullPointerException e) {
System.out.println("当前代码存在异常问题");
}
test(10, 0, null);
}
/**
* 方法功能概述
*
* @param num1 参数1
* @param num2 参数2
* @throws ArithmeticException 当前方法抛出算术异常。
* @throws NullPointerException 数组首地址不得为null
*/
public static void test(int num1, int num2, int[] arr)
throws ArithmeticException, NullPointerException {
// 在方法的声明位置告知调用者,该方法有哪些异常抛出。
// 参数合法性判断
/*
* if (0 == num2) { System.out.println("Input Parameter is Invalid"); return; }
*/
if (0 == num2) {
// throw new 异常构造方法();
throw new ArithmeticException("算术异常");
}
if (null == arr) {
throw new NullPointerException("数组异常");
}
int ret = num1 / num2;
System.out.println(ret);
}
}
1.6 抛出和捕获使用情况图例
image.png1.7 自定义异常
Java中异常众多!!!
也满足不了我们的日常!!!
单身狗异常
网线断了异常
Java中现有异常无法满足,自定义异常玩一玩了!!!
格式:
class 自定义异常 extends Exception {
// 无参数构造方法
// 有参数构造方法
}
SingleDogException
package com.qfedu.a_throwable;
/**
* 单身狗异常完毕!!!
* 错误日志记录
* @author Anonymous
*
*/
class SingleDogException extends Exception {
// 无参数构造方法
public SingleDogException() {}
/**
* 带有Message异常信息参数的构造方法
*
* @param message String类型异常信息
*/
public SingleDogException(String message) {
/*
* 调用父类的String类型构造方法。
* super()
* 就可以直接调用父类的构造方法,会根据实际参数来选择对应的
* 构造方法执行。
*/
super(message);
}
}
public class Demo5 {
public static void main(String[] args) throws SingleDogException {
try {
buyOneFreeOne(true);
} catch (SingleDogException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
buyOneFreeOne(true);
}
/**
* 买一赠一
*
* @param single boolean true 真·单身狗
* @throws SingleDogException 单身狗异常
*/
public static void buyOneFreeOne(boolean single) throws SingleDogException {
if (single) {
throw new SingleDogException("路见不平一声吼");
}
System.out.println("书亦烧仙草买一送一, 美团有券9.9RMB");
}
}