目录
第七章 自定义异常
7.1 概述
1. 为什么需要自定义异常类:
2. 什么是自定义异常类:
3. 异常类如何定义:
7.2 自定义异常的练习
第八章 异常练习题
我们说了Java中不同的异常类,分别表示着某一种具体的异常情况,那么在开发中总是有些异常情况是SUN没有定义好的,此时我们根据自己业务的异常情况来定义异常类。,例如年龄负数问题,考试成绩负数问题。
在上述代码中,发现这些异常都是JDK内部定义好的,但是实际开发中也会出现很多异常,这些异常很可能在JDK中没有定义过,例如年龄负数问题,考试成绩负数问题.那么能不能自己定义异常呢?
在开发中根据自己业务的异常情况来定义异常类.
自定义一个业务逻辑异常: LoginException。一个登陆异常类。
自定义一个编译期异常: 自定义类 并继承于java.lang.Exception
。
自定义一个运行时期的异常类:自定义类 并继承于java.lang.RuntimeException
。
要求:我们模拟注册操作,如果用户名已存在,则抛出异常并提示:亲,该用户名已经被注册。
首先定义一个注册异常类LoginException:
// 业务逻辑异常
public class LoginException extends Exception {
/**
* 空参构造
*/
public LoginException() {
}
/**
*
* @param message 表示异常提示
*/
public LoginException(String message) {
super(message);
}
}
模拟登陆操作,使用数组模拟数据库中存储的数据,并提供当前注册账号是否存在方法用于判断。
public class Demo {
// 模拟数据库中已存在账号
private static String[] names = {"bill","hill","jill"};
public static void main(String[] args) {
//调用方法
try{
// 可能出现异常的代码
checkUsername("nill");
System.out.println("注册成功");//如果没有异常就是注册成功
}catch(LoginException e){
//处理异常
e.printStackTrace();
}
}
//判断当前注册账号是否存在
//因为是编译期异常,又想调用者去处理 所以声明该异常
public static boolean checkUsername(String uname) throws LoginException{
for (String name : names) {
if(name.equals(uname)){//如果名字在这里面 就抛出登陆异常
throw new LoginException("亲"+name+"k已经被注册了!");
}
}
return true;
}
}
实例1:
自定义异常类
/**
* 自定义异常类:NoLiFeValueException,继承自RuntimeException
* 1)提供空参和有参构造
* 2)在有参构造中,需要调用父类的有参构造,把异常信息传入。
*/
class NoLiFeValueException extends RuntimeException{
static final long serialVersionUID=1L;
public NoLiFeValueException() {
}
public NoLiFeValueException(String message) {
super(message);
}
}
Person类
/**
* 属性:名称(name)和生命值(lifeValue)
* 提供setter和getter方法
* 在setLifeValue(int lifeValue)方法中,首先判断,如果lifeValue为负数,就抛出NoLiFeValueException
* 异常信息为:生命值不能为负值:xx
* 然后再给成员LifeValue赋值
* 提供空参构造
* 提供有参构造:使用setXxx方法给name和lifeValue赋值。
*
*/
class Person{
public Person() {
}
public Person(String name, int lifeValue) {
setName(name);
setLifeValue(lifeValue);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
private int lifeValue;
public void setLifeValue(int lifeValue){
if(lifeValue<0){
throw new NoLiFeValueException("生命值不能为负数"+lifeValue);
}
this.lifeValue=lifeValue;
}
}
测试类:
package test;
public class TestDemp02 {
public static void main(String[] args) {
//使用满参构造方法创建Person对象,生命值传入一个负数
//由于一旦遇到异常,后面的代码将不再执行,所以需要注释掉上面的代码
Person person=new Person("刘伯温",10);
// Person person1=new Person("刘伯温",-10);
//使用空参构造创建Person对象
//调用setLifeValue(int lifeValue)方法,传入一个正数,运行程序
Person person1=new Person();
person1.setLifeValue(10);
//调用setLifeValue(int lifeValue)方法,传入一个负数,运行程序
person1.setLifeValue(-10);
}
}
结果:
package test;
import java.util.Scanner;
public class DivisionDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String num1 = scanner.next();
String num2 = scanner.next();
try {
System.out.println(divide(num1, num2));
}catch (Exception e){
e.printStackTrace();
}
}
private static int divide(String num1, String num2) throws NumberFormatException, ArrayIndexOutOfBoundsException, ArithmeticException, BelowZeroException {
int a=Integer.parseInt(num1);
int b=Integer.parseInt(num2);
if (a < 0 || b < 0) {
//手动抛出异常类对象
throw new BelowZeroException("不能输入负数");
}
return a / b;
}
}
class BelowZeroException extends Exception {
static final long serialVersionUID = 1L;
public BelowZeroException() {
}
public BelowZeroException(String message) {
super(message);
}
}
结果: