10.异常
一.异常机制
1.定义:程序中的不正常情况,一旦发生程序会终止
2.异常的分类:
最大父类:Throwable
Error:程序本身无法修复。例如:内存溢出,线程死锁
Exception:程序可以预先设定解决方案来解决
运行时异常:代码在编译时不会出错,在运行可能出错
检查时异常:代码在编译时不能通过编译,必须处理
二.处理机制:
1.捕获处理异常:
try:和catch来监控可能产生异常的代码
catch:是捕获try监控代码中产生的异常,并处理。注意:catch必须捕获类型匹配的异常
catch可以写多重catch,更精准的处理异常结果。注意:父类必须写在多重catch的最后一个
finally:终将被执行的代码,不管前面发生什么,都会要被执行,通常将程序中所占用的资源释放代码写在此。
2.抛出异常
throw:是在方法中手动抛出一个异常
throws:是在方法声明时声明有多个异常抛出。谁调用这个方法,谁来处理异常
三.自定义异常:
1.写一个普通类,继承Exception
2.重写getMessage,将异常信息返回出来
3.配合throw关键字来抛出使用
四.例子
写一段程序,完成输入5个学员的年龄,求平均数
要求:用异常处理,
1如果是输入不匹配异常,我们提醒用户“输入有误”
2如果是其他异常,我们提示用户“系统错误,找管理员”
3.不管程序如何运行,我们都输出“谢谢使用本程序”
1.自定义异常,用来限定性别是“男”或者“女”
2.创建一个学员类型,该性别属性封装,在set方法中判断性别是否正常,如果不正常抛出自定义异常
3.测试方法调用,处理异常
package com.demo1108; import java.util.InputMismatchException; import java.util.Scanner; /** * 异常的案例 */ public class ExcptionDemo { public static void main(String[] args) { try{ Scanner sc = new Scanner(System.in); System.out.println("请输入第一个数"); int num1 = sc.nextInt(); System.out.println("请输入第二个数"); int num2 = sc.nextInt(); int num3 = num1/num2; System.out.println(num3); }catch (InputMismatchException e) { //处理方法。B计划 System.out.println("A计划失败,执行B"); e.printStackTrace(); }catch (ArithmeticException e) { System.out.println("A计划失败,执行C"); e.printStackTrace(); }catch (Exception e) { System.out.println("所有计划都失败,执行自毁程序"); e.printStackTrace(); }finally{ System.out.println("我是终将被执行的代码"); } System.out.println("程序正常结束"); } }
package com.demo1108; import java.util.Scanner; public class MyselfException { public static void main(String[] args) { Student stu = new Student(); Scanner sc = new Scanner(System.in); while(true){ System.out.println("请输入性别:"); try { stu.setSex(sc.next()); } catch (SexException e) { System.out.println("输入有误,请重新输入。"); // e.printStackTrace(); continue; } break; } } } class Student{ private String sex; public String getSex() { return sex; } public void setSex(String sex) throws SexException { if("男".equals(sex)||"女".equals(sex)){ this.sex = sex; }else{ throw new SexException(); } } } class SexException extends Exception{ public String getMessage() { return "性别只能输入'男'或者'女'"; } }
package com.demo1108; public class ThrowDemo { public static void main(String[] args) { Teacher t = new Teacher(); try { t.teach(); System.out.println("你是最棒的"); } catch (Exception e) { e.printStackTrace(); System.out.println("执行B计划"); } finally { System.out.println("我是谁?"); } System.out.println("程序正常结束"); } } class Teacher{ public void teach() throws NullPointerException,Exception{ String weather="高温"; if("冰冻".equals(weather)){ throw new Exception("冰冻三尺"); } if("高温".equals(weather)){ throw new MyException(); } System.out.println("正常上课"); } } class MyException extends Exception{ @Override public String getMessage() { return "这是一个自定义异常"; } }
五.游戏设计文档
设计一款游戏:传奇世界
1.英雄选择:战士,道士,法师,不同的职业有不同的成长属性
2.英雄属性有:
昵称,等级,当前经验值(用来设定判断等级,等级越高普通攻击和血量越高,自己设定),普通攻击力,防御,血量(hp),装备(数组),技能
3.其中装备包括:
头盔,项链,手镯两个,戒子两个,衣服,武器(以出现在装备数组中的顺序为判断依据,比如说,数组中第一个放头盔,依次类推)
4.英雄的攻击和防御值由自身属性加上装备属性叠加得到
5.装备的属性:名字,防御,攻击,血量。注意,装备名字(可以网上查)和属性自己设定
6.技能对象:
属性:名字,使用次数,等级,伤害值
方法:技能释放--就是获取该技能当前等级的伤害值,并输出技能名字,每使用一次累加技能使用次数,达到一定次数技能等级提升,伤害值提升
注意:每个英雄都只有一个技能
战士技能:烈火剑法
道士技能:灵魂火符
法师技能:冰咆哮
技能等级次数和伤害值自己设定
7.英雄方法:
攻击:攻击伤害由攻击(普通攻击+装备攻击)+技能攻击伤害而定
穿戴装备:当击杀怪物后会得到装备,根据装备的特征换到装备栏中相应的位置
选择打怪:选择当前地图的怪物决斗,计算出决斗结果(怪物的血量/(人物伤害-怪物的防御)<>人物血量/(怪物伤害-人物的防御),如果人物获胜,将获得怪物的经验值来升级,还可以获取怪物爆出来的装备。如果人物死亡回新手村满血复活
选择地图:选择4个地图之一
8.怪物设计:
属性有:经验值,名字,血量,攻击力,防御,所带装备数组
方法:
爆出装备--当决斗结果为人物获胜时,将从怪物所带装备数组中随机爆出装备,也有数组保存返回,数组中可以为null
9.地图设计:
总共有4张地图,每张地图上的怪物不一样,自己设定
地图属性:
名字,怪物数组
地图名字:新手村,比奇省,盟重省,祖马庙,地图的难度从左到右依次变难,可以越级选择地图,每个地图都有一个boss,自己设定
地图中包含的怪物:
新手村:鸡,小鹿,稻草人,钉耙猫,半兽人
比奇省:骷髅兵,骷髅战士(boss),骷髅精灵,僵尸,僵尸王(boss)
盟重省:红野猪,黑野猪,白野猪(boss),蜈蚣,钳虫,触龙神(boss)
祖马庙:祖玛战士,祖玛卫士,祖玛弓箭手,祖玛教主(终极boss杀死他通关)
10.系统设计:
属性:当前人物,当前地图
方法:游戏执行流程--显示当前菜单--人物选择功能--循环人物选择功能直到人物死亡回到新手村继续游戏