为什么需要自定义异常类:
在Java中不同的异常类分别表示着某一种具体的异常情况,那么在开发中总是有些异常情况是SUN公司没有定义好的,此时我们根据自己业务的异常情况来定义异常类。
什么是自定义异常类:在开发中根据自己业务的异常情况来定义的异常类
自定义一个业务逻辑异常:LogicException.
异常类如何定义:
方式1:自定义一个受检查的异常类自定义类并继承于java.lang.Exception.
方式2:自定义一个运行时期的异常类:自定义类并继承于java .lang.RuntimeException.
模拟邮箱已被注册的情况:
package com_520it_05_loggicException;
//业务逻辑异常
public class LogicException extends RuntimeException {
private static final long serialVersionUID = 1L;
public LogicException() {
super();
}
/**
*
* @param message 表示当前异常的原因/信息
* @param cause 表示当前异常的根本原因
*/
public LogicException(String message, Throwable cause) {
super(message, cause);
}
public LogicException(String message) {
super(message);
}
}
package com_520it_05_loggicException;
public class RegisterDemo {
//模拟数据库中已经存在的账号
private static String[] names = { "will", "luky", "lily" };
public static void main(String[] args) {
try {
//可能出现异常的代码
checkUsername("will");
} catch (LogicException e) {
//处理异常
String errorMag = e.getMessage();
System.out.println("给用户看:" + errorMag);
}
}
public static boolean checkUsername(String username) {
for (String name : names) {
if (name.equals(username)) {
throw new LogicException(name + "账户已被注册!");
}
}
return false;
}
}
解决开车上班案例
✎
package com_520it_05_loggicException;
//车坏了的异常
class CarWrongException extends RuntimeException {
private static final long serialVersionUID = 1L;
public CarWrongException(String message, Throwable cause) {
super(message, cause);
}
public CarWrongException(String message) {
super(message);
}
}
//上班迟到异常
class LateException extends RuntimeException {
private static final long serialVersionUID = 1L;
public LateException(String message, Throwable cause) {
super(message, cause);
}
public LateException(String message) {
super(message);
}
}
//车
class Car {
public void run() {
int a = 2;
if (a == 2) {//爆胎了
throw new CarWrongException("车爆胎了!");
}
System.out.println("开车去上班!");
}
}
//上班的人
class Worker {
private Car car = null;
Worker(Car car) {
this.car = car;
}
public void gotoWork() {
try {
car.run();//正常开车去上班
System.out.println("美好的一天!");
} catch (CarWrongException e) {
e.printStackTrace();
//车坏,出现异常
this.walk();
throw new LateException("迟到原因:" + e.getMessage());
}
}
private void walk() {
System.out.println("走路去上班。");
}
}
//测试类
public class WhyDemo {
public static void main(String[] args) {
Car c = new Car();
Worker worker = new Worker(c);
try {
worker.gotoWork();
System.out.println("老板面无表情!");
} catch (LateException e) {
System.out.println("老板发飙了!");
e.printStackTrace();
}
}
}
运行结果:
异常转译和异常链
异常转译:当位于最上层的子系统不需要关心底层的异常细节时,常见的做法是捕获原始的异常,把它转换为一个新的不同类型的异常。再抛出新的异常。
根据上述例子:我的车抛锚了,我在catch中重新抛出一个新的异常(LateException)给我的调用者(老板)我们不能把车的异常信息抛给老板看,因为老板不关心这些细节,关心的我是否迟到。
异常链:把原始的异常包装为新的异常类,从而形成多个异常的有序排列,有助于查找异常的根本原因。
Java7的异常新特性
Android用不到Java7,支持的是Java5/Java6的语法;
1、增强的throw;
2、多异常捕获;
3、自动关闭资源。
圆括号里面是打开资源
处理异常的原则
✎
处理异常的原则:
1、异常只能用于非正常情况,try-catch的存在也会影响性能;
2、需要为异常提供说明文档,比如java doc,如果自定义了异常或某一个方法抛出了异常,我们应该记录在文档注释中;
3、尽可能避免异常。如:NullPointerException做如下处理:
String str = null;
if (str != nul1) {
Syatem. out.println(str.length);
}
4、异常的粒度很重要,应该为一个基本操作定义一个try-catch块,不要为了简便,将几百行代码放到一个try-catch块中;
5、不建议在循环中进行异常处理,应该在循环外对异常进行捕获处理(在循环之外使用try catch);
6、自定义异常尽量使用RuntimeException类型的。
小结
异常需要掌握:
1、五个关键字:try,catch,finally,throw,throws;
2、异常体系的两个继承结构;
21)Throwable类有两个子类(Error和Exception);
2.2)Exception类有一个子类RuntimeException;RuntimeException类及其子类称之为:runtime异常。Exception类和子类中(除了RuntimeException体系):checked异常。
3)、定义异常类
面试题:
1)Error和Exception的区别和关系;
2)checked异常和runtime异常的区别;
3)如何保证一段代码必须执行到(finally);
4)finally中的代码一定会执行吗?
5)finally和return的执行顺序?(关注finally里面的两道题)
6)throw和throws的区别?
7)列举5个常见的异常类;
8)列举5个常见的Runtime异常类;
ArithmeticException:算术异常
NullPointerException:空指针异常
ArrayIndexOutOfBoundsException:数组索引越界
StringindexOutofBoundsE xception:String操作中索引越界
NumberFormatException:数字格式化异常
CassCastException:类型强制转换异常
java培训学校:http://www.baizhiedu.com/java2019