项目和异常
1. 项目
被甲方支配的恐惧
2. 异常
2.1 生活中的异常
医院看病:
医生问你: 你怎么了?
我: 我难受
医生: 你那里难受
我: 我头疼
医生: 你为什么头痛
我: 昨天晚上喝了2斤二锅头 + 10瓶福佳白 + 1瓶生命之水
医生:.....
异常或者说错误,都讲究一个前因后果!!!
处理错误,讲究对症下药!!!
2.2 代码中的异常
Throwable类
Java中所以异常的超类,在Java中所有的异常,错误的基类就是Throwable类。
Throwable
--| Exception 异常 可以处理,代码还有拯救的可能性
--| Error 错误 GG思密达
Throwable常用方法:
Constructor:
Throwable(); Throwable构造方法,Throwable类对象中,存储的异常或者
错误信息为null
Throwable(String message); Throwable构造方法,Throwable类对象
中,存储的异常或者错误信息为message
Method:
String getMessage(); 获取Throwable对象中存储的异常或者错误信息
String toString(); 返回当前异常或者错误的简要描述
void printStackTrace(); 展示错误的前因后果,【红色字体】
2.3 Exception和Error区别
Exception 异常,可以处置
Error 错误,不可以处置,只能避免
2.4 异常处理
2.4.1 捕获异常
try - catch 结构
try - catch - finally 结构 后期设计到资源问题,再讲解
格式:
try {
// 有可能出现异常代码
} catch (/* 对应处理的异常对象 */) {
// 处理方式
}
package com.qfedu.a_throwable;
public class Demo3 {
public static void main(String[] args) {
test(10, 2, null);
}
public static void test(int num1, int num2, int[] arr) {
int ret = 0;
try {
ret = num1 / num2;
System.out.println("测试代码");
arr[0] = 10;
} catch (ArithmeticException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
System.out.println("ret:" + ret);
}
}
2.4.2 抛出异常
throw
在方法内抛出异常
throws
在【方法声明】位置,告知调用者当前方法有哪些异常抛出
声明的异常需要生成对应的文档注释
package com.qfedu.a_throwable;
public class Demo4 {
public static void main(String[] args)
throws NullPointerException, ArithmeticException {
try {
test(10, 2, null);
} catch (ArithmeticException e) {
System.out.println(e.getMessage());
} catch (NullPointerException e) {
System.out.println(e.getMessage());
}
test(10, 0, null);
}
public static void test(int num1, int num2, int[] arr)
throws ArithmeticException, NullPointerException {
if (0 == num2) {
throw new ArithmeticException("算术异常");
}
if (null == arr) {
throw new NullPointerException("数组空指针异常");
}
System.out.println(num1 / num2);
arr[0] = 10;
}
}
2.4.3 抛出和捕获的对比
捕获之后,代码可以正常运行,要保证处理之后的异常不会在导致其他问题。
例如:
用户名密码错误,不能采用捕获异常。
用户指定路径问题,也不能采用捕获异常。
抛出的确可以解决很多问题,并且可以让代码健壮性很强。到用户层面说什么都不能抛出异常。
所谓不能抛出,是指不能讲错误信息直接甩到用户脸上。
用户密码错误情况:
1. 捕获异常
2. 通过异常处理 catch将错误抛出
3. 给予用户的友好提示
2.4.4 为什么不使用大异常和不知道为什么出错
Exception
不行!!!
对症下药!!!
不能所有的异常都使用Exception捕获或者抛出无法得知具体的异常类型,无法做到对症下药
不知道为什么出错
Eclipse IDEA都会有当前错误的提示。
正常情况下,只要不是带有自定义异常的方法,通常情况下需要处理的异常,代码中都有会有声明告知。如果未处理异常,代码报错。
2.5 RuntimeException
运行时异常:
JVM在运行的过程中可以非检查异常
例如:
ArrayIndexOutOfBoundException
NullPointerException
StringIndexOutOfBoundException
ArithmeticException
这些异常在代码中如果出现,不需要代码中强制进行捕获或者抛出处理。
2.6 自定义异常
代码运行的过程中存在一定的生活化
例如:
用户名密码错误
NoGirlFriendException 没有女朋友异常
自定义异常格式:
class 自定义异常类名 extends Exception {
// No Fields Constructor
// String Field Constructor
}
自定义异常类名:
必须Exception结尾!!!
package com.qfedu.a_throwable;
class NoGirlFriendException extends Exception {
public NoGirlFriendException() {}
public NoGirlFriendException(String message) {
super(message);
}
}
public class Demo5 {
public static void main(String[] args) throws NoGirlFriendException {
try {
buyOneFreeOne(false);
} catch (NoGirlFriendException e) {
e.printStackTrace();
}
buyOneFreeOne(false);
}
public static void buyOneFreeOne(boolean singleDog)
throws NoGirlFriendException {
if (singleDog) {
throw new NoGirlFriendException("两只黄鹂鸣翠柳,你还没有女朋友");
}
System.out.println("买蜜雪冰城甜筒一个送保时捷一辆");
}
}