Java基础篇异常处理总结

1.异常概述

1.1概念

   在Java语言中,将程序执行中发生的不正常情况称为“异常”。 (开发过程中的语法错误和逻辑错误不是异常)

1.2异常的体系结构

异常主要分为编译时异常和运行时异常

java.lang.Throwable
   |-----java.lang.Error:一般不编写针对性的代码进行处理。
   |-----java.lang.Exception:可以进行异常的处理
       |------编译时异常(checked)
            |-----IOException
               |-----FileNotFoundException
            |-----ClassNotFoundException
       |------运行时异常(unchecked,RuntimeException)
            |-----NullPointerException
            |-----ArrayIndexOutOfBoundsException
            |-----ClassCastException
            |-----NumberFormatException
            |-----InputMismatchException
            |-----ArithmeticException

1.3异常的分类

     运行时异常:是指编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该积极避免其出现的异常,对于此类异常一般不做处理
     编译时异常:是指编译器要求必须处置的异常。即程序在运行时由于外界因素造成的一般性异常。

2.异常的处理

2.1异常处理的“抓抛模型”

过程一:“抛”:程序正在执行的过程中,一旦抛出异常,就会在异常代码处生成一个对应的异常类对象 并将此对象抛出。
     一旦抛出对象以后,其后的代码就不再执行。

关于异常对象的产生:
①系统自动生成一个异常对象
②手动的生成一个异常对象,并抛出throw

过程二:“抓”:可以理解为异常的处理方式:①try-catch-finally ② throws

2.2异常处理的方式一:try-catch-finally

使用的方式:
try-catch-throws的使用方式
说明(理解很重要):

 1.finally是可选的
 2.使用try将可能出现的异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个异常类的对象,根据此对象的类型,去catch中进行匹配
 3.一旦try中的异常对象对象匹配到某一个catch时,就会进入catch中进行异常处理,一旦处理完成,就跳出try-catch结构,继续执行其后的代码
 4.catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓catch中的异常类型如果有子父类关系,则子类要声明在父类上面
 5.常见的异常处理方式:
    ①getMessage() ②e.printStackTrace();
 6.使用try-catch处理编译异常时,使得程序在编译时不报错,运行时还可能会报错, 相当于将一个编译时出现的错误,延时到运行时出现
 7.try-catch-finally结构可以再次嵌套try-catch
  在开发中,针对运行时异常一般不做处理,对于编译时异常使用try-catch-finally进行处理

使用样例:

public class ExceptionTest1 {

    public static void main(String[] args) {

    }

	//ArithmeticException 算术运算异常
    @Test
    public void Test6() {
        try {
            int a = 10;
            int b = 0;
            System.out.println(a / b);
        }catch (ArithmeticException e){
            e.printStackTrace();
        }

    }


   @Test
   public void Test2(){
        try{
            File file = new File("hello.txt");
            FileInputStream fis = new FileInputStream(file);

            int data = fis.read();
            while(data != -1){
                System.out.print((char) data);
                data = fis.read();
            }
            fis.close();
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }

   }

    //NumberFormatException数据格式异常
    @Test
    public void Test4() {
        String str = "123";
        str = "abc";
        try {
            int number = Integer.parseInt(str);//把字符串转为整型
        }catch (NumberFormatException e){
           // System.out.println("出现数值转换异常了");
            e.printStackTrace();
            System.out.println(e.getMessage());//获取异常信息
        }catch (NullPointerException e){
            System.out.println("出现空指针异常了");
        }catch (Exception e){
            System.out.println("出现异常了");
        }

    }
}

🍀finally的使用
说明:

1.finally是可以选择写,也可以选择不写的,具体情况具体分析,如果有必须要执行的就需要写
2.finally中声明的是一定会被执行的代码,即使catch中又出现异常了,try中有return语句,catch中有return语句等情况。
3.像数据库连接、数据输入输出流、网络编程Socket等资源,JVM是不能进行自动回收的,我们需要自己手动的进行资源的释放。此时的资源释放,就需要声明在finally中。

使用样例一:

public int test2() {
        try {
            int[] arr = new int[10];
            System.out.println(arr[10]);
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
            return 2;
        } finally {
            System.out.println("一定会被执行");
        }
    }

使用样例二:

@Test
    public void test3() {
        FileInputStream fis = null;//需要初始化
        try {
            File file = new File("C:\\Users\\Administrator\\Desktop\\com.java.li\\src\\day10\\com\\it\\java0\\hello.txt");
            fis = new FileInputStream(file);
            //可能此处出现异常,所以他会直接到第一个异常处理机制里面,因此fis.close()可能不会被关闭
            //--》fis.close()放在while下面显然有些不合适,他是一定会执行的语句,所以放在finally里比较好
            //异常套异常

            int data = fis.read();
            while (data != -1) {
                System.out.print((char) data);
                data = fis.read();
            }
            //fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fis != null){
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

2.3异常处理的方式二:throws + 异常类型

1.概述:

“throws + 异常类型”写在方法的声明处,指明此方法在执行时可能会出现的异常类型。
    当方法体执行出现异常时,仍会在异常代码处生成一个一场类的对象,此时对象满足throws后的异常类型时,就会被抛出,异常代码的后续代码就不会被执行!

2.两种方式之间的区别:

“try-catch-finally”真正的将异常处理掉了
“throws + 异常类型”只是将异常抛出给方法的调用者,并没有将异常真正处理掉

注意:子类的异常类型不大于父类的异常类型

throws使用样例:

public class ExceptionTest2 {
    public static void main(String[] args) {

        try {
            method2();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void method2()throws IOException{
        method1();
    }

    public static void method1()throws  IOException {
        File file = new File("C:\\Users\\Administrator\\Desktop\\com.java.li\\src\\day10\\com\\it\\java0\\hello.txt");
        FileInputStream fis = new FileInputStream(file);

        int data = fis.read();
        while(data != -1){
            System.out.print((char) data);
            data = fis.read();
        }
        fis.close();
    }
}

2.4如何选择异常处理方式

方式一:

     如果父类中被重写的方法没有throws的方式处理异常,则子类被重写的方法也不能使用throws的方式,意味着子类重写方法的异常必须使用try-catch-finally的方式处理异常

方式二:

    执行的方法a中,先后又调用了另外几个方法,这几个方法是递进的关系,(方法一的结果传递给方法二,方法二的结果传递给方法三),建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally的方式处理异常

3.手动处理异常

1.概述:

    在程序执行的过程中,除了自动抛出异常对象的情况之外,我们还可以手动的throw一个异常对象。

3.1throw和throws之间的区别

throw:表示抛出一个异常类的对象,生成异常类的对象的过程;声明在方法体内

throws属于异常处理方式的一种,声明在方法体外。

3.2throw典型例题

测试类:

public class StudentTest {

    public static void main(String[] args) {

        try {
            Student student = new Student();
            student.regist(-100);
            System.out.println(student);
        } catch (Exception e) {
            e.printStackTrace();
            e.getMessage();
        }

    }
}

Student类:

class Student {

    private int id;

    public void regist(int id)  throws Exception{//处理方法二抛出一个异常
        if (id > 0) {
            this.id = id;
        } else {//手动抛出一个异常处理方法1
            //throw new RuntimeException("输入的数据有误");

            //方式二
            //throw new Exception("输入的数据有误");

            //方式三,使用自定义异常
            throw new MyException("输入的数据为负数");
        }
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                '}';
    }
}

手写异常类:

public class MyException extends RuntimeException{

    static final long serialVersionUID = 7034897101145766939L;

    public MyException(){
    }

    public MyException(String msg){
        super(msg);
    }
}

3.3自定义异常类的实现

实现自定义异常类的步骤:

1.继承于现有的异常结构,RuntimeException,Exception
2.提供全局常量:serialVersionUID
3.提供重载的构造器

样例:

public class MyException extends RuntimeException{

    static final long serialVersionUID = 7034897101145766939L;

    public MyException(){
    }

    public MyException(String msg){
        super(msg);
    }
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
图文并茂很适合初学着学习 下面是课程的目录: 第一 基础   第1章 Java简介(精彩视频:33分钟) 21   1.1 Java的平台简介 21   1.2 安装工具包 22   1.2.1 下载JDK 22   1.2.2 安装JDK 24   1.2.3 查看与设置环境变量 25   1.2.4 JDK常用命令 27   1.2.5 Java各个目录含义 28   1.2.6 要善于使用JDK的帮助文件 28   1.3 程序开发过程 29   1.4 编码规范 29   1.5 HelloWorld:第一个Java程序 30   1.5.1 编写程序代码 30   1.5.2 编译程序代码并运行 30   1.5.3 注意事项 31   1.6 使用Eclipse集成开发工具开发 32   1.7 综合练习 32   1.8 小结 33   1.9 习题 33   第2章 Java的基本数据类型(精彩视频:38分钟) 34   2.1 数据类型 34   2.1.1 整型 34   2.1.2 浮点型 35   2.1.3 字符型(char) 36   2.1.4 布尔型(boolean) 36   2.2 数据类型间的转换 36   2.2.1 自动转换 36   2.2.2 强制转换 37   2.2.3 隐含转换 37   2.3 标识符的命名 38   2.3.1 标识符的命名规则 38   2.3.2 代码演示如何定义标识符 38   2.3.3 不好的标识符命名 38   2.3.4 良好的标识符命名 39   2.4 关键字 39   2.5 代码注释 40   2.5.1 行注释 40   2.5.2 块注释 41   2.5.3 文档注释用户自定义类型 41   2.6 综合练习 43   2.7 小结 43   2.8 习题 43   第3章 运算符(精彩视频:43分钟) 45   3.1 算术运算符 45   3.1.1 “+”:加法运算符 45   3.1.2 “-”:减法运算符 46   3.1.3 “*”:乘法运算符 47   3.1.4 “/”:除法运算符 48   3.1.5 “%”:求余运算符 48   3.2 自增自减运算符 49   3.3 关系运算符 51   3.3.1 “==”、“!=” 51   3.3.2 “>”、“<”、“>=”、“<=” 52   3.4 逻辑运算符 53   3.4.1 “&&”:与运算符 53   3.4.2 “||”:或运算符 53   3.4.3 “!”:非运算符 54   3.4.4 逻辑运算符总结 54   3.5 三元运算符 55   3.6 位运算符 55   3.6.1 “&”:按位与运算符 56   3.6.2 “|”:按位或运算符 56   3.6.3 “^”:按位异或运算符 57   3.7 位移运算符 57   3.7.1 “>>”:带符号右移运算符 58   3.7.2 “<<”:带符号左移运算符 58   3.7.3 “>>>”:无符号右移运算符 58   3.8 赋值运算符 59   3.8.1 一般赋值运算符 59   3.8.2 运算赋值运算符 59   3.9 运算符之间的优先级 60   3.10 综合练习 61   3.11 小结 62   3.12 习题 62   第4章 流程控制(精彩视频:58分钟) 64   4.1 if条件语句 64   4.1.1 if语句的语法 64   4.1.2 if语句用法举例 64   4.2 switch分支语句 67   4.2.1 switch分支语句的语法 67   4.2.2 switch分支语句表达式的使用条件 68   4.2.3 switch分支语句举例 70   4.3 while循环语句 72   4.3.1 while循环语句的语法 72   4.3.2 while循环语句举例 73   4.4 do...while循环语句 73   4.4.1 do...while循环语句的语法 74   4.4.2 do ... while循环语句举例 74   4.5 for循环语句 75   4.5.1 for循环语句的语法 75   4.5.2 用for循环来实现其他循环语句 76   4.5.3 for循环语句的举例 77   4.6 如何中断和继续语句的执行 78   4.6.1 break:中断语句执行 78   4.6.2 continue:继续语句执行 79   4.7 综合练习 79   4.8 小结 80   4.9 习题 81   第5章 数组(精彩视频:52分钟) 83   5.1 如何创建数组 83   5.1.1 创建数组 83   5.1.2 创建多维数组 84   5.2 数组的初始化 85   5.2.1 创建并初始数组元素 85   5.2.2 循环初始化 87   5.3 数组操作的举例 88   5.3.1 数组元素值的复制 88   5.3.2 数组元素的排序 90   5.3.3 在数组里查找指定元素 91   5.3.4 利用数组打印26个英文字母 92   5.4 综合练习 93   5.5 小结 94   5.6 习题 94   第二 面向对象   第6章 类与对象(精彩视频:48分钟) 96   6.1 什么是面向对象 96   6.1.1 面向对象编程的特点 96   6.1.2 面向对象编程与面向过程编程的区别 97   6.2 什么是类 97   6.2.1 类的定义和对象的创建 97   6.2.2 如何使用现有类 99   6.2.3 类设计的技巧 100   6.3 成员变量 101   6.3.1 成员变量的创建 101   6.3.2 成员变量的初始化 102   6.4 局部变量 105   6.4.1 局部变量的创建和初始化 105   6.4.2 局部变量和成员变量的区别 106   6.5 方法 106   6.5.1 方法的创建和参数 106   6.5.2 方法参数的传递 108   6.6 对象引用的使用 110   6.6.1 调用不存在的对象或成员变量 110   6.6.2 调用对象为null值的引用 111   6.6.3 对象引用间的比较 113   6.7 this 113   6.8 要活用JDK已有的类 114   6.8.1 Date类 114   6.8.2 Integer类 116   6.9 综合练习 117   6.10 小结 118   6.11 习题 118   第7章 控制逻辑(精彩视频:50分钟) 120   7.1 包(package) 120   7.1.1 创建一个包 120   7.1.2 如何使用包 121   7.1.3 什么是静态引入 122   7.2 类的访问级别 123   7.2.1 公开的访问级别 123   7.2.2 默认的访问级别 124   7.3 什么是封装 125   7.4 最终修饰符 127   7.4.1 final修饰对象类型的成员变量 127   7.4.2 final修饰基本类型的成员变量 129   7.4.3 final修饰的局部变量 131   7.4.4 final修饰的方法 132   7.5 静态修饰符 134   7.5.1 什么是静态变量 134   7.5.2 静态变量的访问 135   7.5.3 什么是静态常量 137   7.6 综合练习 139   7.7 小结 140   7.8 习题 140   第8章 继承(精彩视频:72分钟) 141   8.1 什么是继承 141   8.1.1 类的继承 142   8.1.2 继承的语法 145   8.2 修饰符 146   8.2.1 public:声明成员变量为公共类型 146   8.2.2 private:声明成员变量为私有类型 147   8.2.3 default:声明成员变量为默认类型 148   8.2.4 protected:声明成员变量为保护类型 149   8.3 成员变量的覆盖 150   8.4 对象引用 151   8.5 方法的重写和重载 152   8.5.1 方法重写的特点 152   8.5.2 方法重载的特点 154   8.5.3 重写的返回类型 156   8.5.4 重写是基于继承的 158   8.5.5 静态方法是不能重写的 159   8.5.6 三者之间的关系 161   8.5.7 重写toString方法 162   8.5.8 重写equals方法 163   8.6 final与继承的关系 164   8.7 abstract与继承的关系 165   8.8 什么是多态 166   8.9 什么是枚举类 168   8.10 什么是反射机制 169   8.11 什么是泛型 170   8.12 综合练习 172   8.13 小结 172   8.14 习题 172   第9章 接口(精彩视频:47分钟) 174   9.1 什么是接口 174   9.1.1 接口的定义 174   9.1.2 访问接口里的常量 176   9.2 接口的使用 177   9.2.1 接口里的方法如何创建 177   9.2.2 接口引用怎么使用 178   9.3 什么是抽象类 180   9.3.1 抽象类的使用和特点 180   9.3.2 抽象类与接口区别 183   9.4 接口的多态 183   9.5 判断类型 185   9.5.1 什么是instanceof 185   9.5.2 使用instanceof的注意事项 188   9.6 综合练习 189   9.7 小结 189   9.8 习题 189   第10章 构造器(精彩视频:46分钟) 191   10.1 什么是构造器 191   10.1.1 构造器的使用 191   10.1.2 被修饰的构造器 193   10.1.3 构造器方法与普通方法的区别 196   10.2 如何实例化一个对象 197   10.3 构造器的使用 199   10.3.1 构造器的调用 199   10.3.2 构造器重载 202   10.3.3 父子类间的构造器的调用流程 204   10.3.4 如何自定义构造器 207   10.4 什么是单子模式 208   10.5 构造器在程序中是何时运行的 211   10.6 综合练习 214   10.7 小结 215   10.8 习题 215   第11章 异常处理(精彩视频:60分钟) 217   11.1 异常处理基本介绍 217   11.1.1 try和catch捕获异常 217   11.1.2 try-catch语句使用注意点 218   11.1.3 finally语句的使用 220   11.1.4 再谈异常处理注意点 222   11.2 异常的分类 223   11.2.1 捕获异常 223   11.2.2 未捕获异常 225   11.3 抛出异常 225   11.3.1 抛出异常的简单介绍 225   11.3.2 使用throws和throw语句抛出异常 227   11.4 自定义异常 227   11.4.1 创建和使用自定义异常类 227   11.4.2 自定义异常的实际应用 228   11.5 综合练习 231   11.6 小结 232   11.7 习题 232   第12章 内部类(精彩视频:71分钟) 234   12.1 非静态内部类 234   12.1.1 创建非静态内部类 234   12.1.2 在外部类中访问内部类 235   12.1.3 在外部类外访问内部类 236   12.1.4 在内部类中访问外部类 237   12.2 局部内部类 240   12.2.1 创建局部内部类 240   12.2.2 在局部内部类中访问外部类成员变量 240   12.2.3 在局部内部类中访问外部类的局部变量 241   12.2.4 静态方法中的局部内部类 243   12.3 静态内部类 244   12.3.1 创建静态内部类 244   12.3.2 在外部类中访问静态内部类 245   12.3.3 在外部类外访问静态内部类 246   12.4 匿名内部类 247   12.4.1 创建匿名内部类 247   12.4.2 匿名内部类的初始化 249   12.5 综合练习 250   12.6 小结 250   12.7 习题 250   第13章 多线程(精彩视频:55分钟) 252   13.1 多线程简介 252   13.2 定义线程和创建线程对象 252   13.2.1 继承Thread类定义线程 252   13.2.2 实现Runnable接口定义线程 253   13.3 运行线程 254   13.3.1 启动线程 254   13.3.2 同时运行多个线程 256   13.4 线程生命周期 257   13.4.1 新建状态 257   13.4.2 准备状态 257   13.4.3 运行状态 257   13.4.4 等待/阻塞状态 258   13.4.5 死亡状态 258   13.5 线程的调度 258   13.5.1 睡眠方法 258   13.5.2 线程优先级 260   13.5.3 yield让步方法 261   13.5.4 join让步方法 262   13.6 综合练习 264   13.7 小结 265   13.8 习题 265   第三 应用   第14章 Swing桌面程序开发(精彩视频:70分钟) 268   14.1 开发第一个Swing程序 268   14.2 JFrame窗口类 269   14.2.1 JFrame窗口类简介 269   14.2.2 创建简单窗体 269   14.2.3 设置窗体 271   14.3 JPanel面板类 273   14.3.1 容器介绍 273   14.3.2 JPanel面板类简介 274   14.3.3 创建面板 274   14.4 JLabel标签类 275   14.4.1 JLabel标签类简介 275   14.4.2 创建标签 276   14.5 JButton按钮类 276   14.5.1 JButton按钮类简介 277   14.5.2 创建按钮 277   14.5.3 按钮动作事件 278   14.6 Swing中的事件 280   14.6.1 事件简介 280   14.6.2 同一个事件源注册多个监听器 280   14.6.3 同一个监听器注册给多个事件源 282   14.6.4 窗体获取和失去焦点事件 283   14.6.5 窗体打开、关闭和激活事件 284   14.7 综合练习 286   14.8 小结 288   14.9 习题 288   第15章 布局管理器(精彩视频:62分钟) 290   15.1 流布局 290   15.1.1 流布局介绍 290   15.1.2 使用流布局 291   15.2 网格布局 293   15.2.1 网格布局介绍 293   15.2.2 使用网格布局 293   15.3 边框布局 295   15.3.1 边框布局介绍 296   15.3.2 使用边框布局 296   15.4 空布局 298   15.4.1 空布局介绍 298   15.4.2 使用空布局 298   15.5 卡片布局 299   15.5.1 卡片布局介绍 299   15.5.2 使用卡片布局 300   15.6 综合练习 302   15.7 小结 304   15.8 习题 304   第16章 Swing常用控件(精彩视频:90分钟) 306   16.1 文本框及密码框和多行文本框 306   16.1.1 创建文本框 306   16.1.2 创建密码框 307   16.1.3 创建多行文本框 309   16.2 复选框和单选按钮 310   16.2.1 创建单选按钮 310   16.2.2 创建复选框 313   16.3 选项卡 315   16.3.1 选项卡介绍 315   16.3.2 创建选项卡 315   16.4 分隔窗格 317   16.4.1 分隔窗格介绍 317   16.4.2 创建分隔窗格 317   16.5 滑块和进度条 319   16.5.1 创建滑块 319   16.5.2 创建进度条 320   16.6 列表框 323   16.6.1 列表框介绍 323   16.6.2 创建列表框 324   16.6.3 下拉列表框 326   16.7 菜单 328   16.7.1 菜单介绍 328   16.7.2 创建菜单 329   16.7.3 创建弹出式菜单 330   16.8 综合练习 330   16.9 小结 332   16.10 习题 333   第17章 JDBC数据库编程(精彩视频:63分钟) 335   17.1 数据库基本介绍 335   17.1.1 数据库介绍 335   17.1.2 数据库应用架构 335   17.1.3 数据库模型 336   17.2 JDBC数据库编程介绍 336   17.2.1 JDBC和ODBC的关系 337   17.2.2 为什么使用JDBC数据库编程 337   17.3 SQL数据库操作技术 338   17.3.1 什么是SQL 338   17.3.2 如何进行SQL操作 338   17.4 创建数据库 339   17.4.1 创建Access数据库 339   17.4.2 创建SQL Server数据库 339   17.5 JDBC编程步骤 342   17.5.1 创建数据源 342   17.5.2 加载驱动程序 344   17.5.3 建立数据库连接 345   17.5.4 进行数据库操作 345   17.5.5 获取数据库中信息 346   17.5.6 JDBC数据库编程实例 347   17.6 事务处理 348   17.6.1 事务介绍 348   17.6.2 进行事务操作 349   17.7 综合练习 351   17.8 小结 352   17.9 习题 352   第18章 Java中输入/输出流(精彩视频:55分钟) 353   18.1 I/O流简介 353   18.1.1 什么是I/O流 353   18.1.2 节点流与处理流 353   18.1.3 字节流与字符流 354   18.1.4 抽象基类 354   18.2 使用流进行文件操作 356   18.2.1 使用File类进行文件与目录操作 356   18.2.2 FileInputStream类与FileOutputStream类 359   18.2.3 FileReader类与FileWriter类 362   18.3 综合练习 364   18.4 小结 364   18.5 习题 364   第19章 集合框架(精彩视频:65分钟) 366   19.1 集合框架总论 366   19.1.1 什么是集合框架 366   19.1.2 Collection接口 366   19.2 列表 367   19.2.1 List列表接口 367   19.2.2 Vector类 368   19.2.3 ArrayList类 371   19.2.4 LinkedList类 373   19.3 集合 376   19.3.1 Set接口 376   19.3.2 SortedSet接口 377   19.3.3 TreeSet类 378   19.3.4 HashSet类 380   19.4 映射 381   19.4.1 Map接口 381   19.4.2 HashMap类 382   19.4.3 TreeMap类 384   19.5 综合练习 385   19.6 小结 386   19.7 习题 387   第20章 网络编程(精彩视频:58分钟) 389   20.1 网络编程基础 389   20.1.1 TCP/IP协议 389   20.1.2 网络编程模型 389   20.1.3 网络传输协议 390   20.1.4 端口和套接字 390   20.2 基于TCP/IP协议的网络编程 391   20.2.1 Socket套接字 391   20.2.2 ServerSocket类 391   20.2.3 Socket类 392   20.2.4 网络编程C/S架构实例 393   20.3 综合练习 396   20.4 小结 398   20.5 习题 398   第四 综合案例   第21章 学生管理系统(精彩视频:54分钟) 399   21.1 系统设计 399   21.2 数据库设计 399   21.3 登录界面开发 400   21.3.1 界面设计 400   21.3.2 程序开发 400   21.4 学生界面开发 402   21.4.1 界面设计 402   21.4.2 程序开发 402   21.4.3 开发插入学生界面 403   21.4.4 查询学生信息界面 406   21.4.5 查询成绩信息 409   21.5 综合练习 412   21.6 小结 413
1. 实验目的 本实验旨在通过设计一个简单的石头迷阵游戏来帮助学生深入理解面向对象程序设计和Java语言的基本概念,包括类、对象、继承、接口、异常处理等。 2. 实验要求 设计一个石头迷阵游戏,要求实现以下功能: (1)设计一个迷阵类Maze,包含一个二维数组表示迷阵的地图,以及一个方法printMaze()用于打印地图。 (2)设计一个角色类Role,包含角色的位置坐标、移动方法move()、攻击方法attack()等。 (3)设计一个怪物类Monster,包含怪物的位置坐标、移动方法move()、攻击方法attack()等。 (4)设计一个游戏控制类Game,包含游戏的开始、进行和结束方法,以及游戏中的各种操作。 (5)实现异常处理机制,防止程序崩溃。 3. 实验设计 在本实验中,我们采用了面向对象的程序设计思想,将游戏中的各种元素抽象成不同的类,并通过继承、接口等方式进行组合和扩展。具体的实现步骤如下: (1)设计Maze类 Maze类是游戏中的地图类,包含一个二维数组map表示迷阵的地图,以及一个方法printMaze()用于打印地图。具体代码如下: ```java public class Maze { private int[][] map; // 迷阵地图 private int rows; // 迷阵行数 private int cols; // 迷阵列数 public Maze(int[][] map) { this.map = map; this.rows = map.length; this.cols = map[0].length; } // 打印地图 public void printMaze() { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { System.out.print(map[i][j] + " "); } System.out.println(); } } } ``` (2)设计Role类 Role类是游戏中的角色类,包含角色的位置坐标、移动方法move()、攻击方法attack()等。具体代码如下: ```java public abstract class Role { protected int x; // 角色横坐标 protected int y; // 角色纵坐标 protected int hp; // 角色血量 protected int attack; // 角色攻击力 // 移动方法 public abstract void move(int direction); // 攻击方法 public abstract void attack(Role enemy); // 受伤方法 public void hurt(int damage) { hp -= damage; if (hp <= 0) { System.out.println("角色死亡!"); } } } ``` (3)设计Monster类 Monster类是游戏中的怪物类,包含怪物的位置坐标、移动方法move()、攻击方法attack()等。具体代码如下: ```java public class Monster extends Role { public Monster(int x, int y, int hp, int attack) { this.x = x; this.y = y; this.hp = hp; this.attack = attack; } @Override public void move(int direction) { // 怪物随机移动 int dx = (int) (Math.random() * 3) - 1; int dy = (int) (Math.random() * 3) - 1; if (x + dx >= 0 && x + dx < Game.MAP_ROWS && y + dy >= 0 && y + dy < Game.MAP_COLS) { x += dx; y += dy; } } @Override public void attack(Role enemy) { System.out.println("怪物攻击!"); enemy.hurt(attack); } } ``` (4)设计Player类 Player类是游戏中的玩家类,继承自Role类,包含玩家的位置坐标、移动方法move()、攻击方法attack()等。具体代码如下: ```java public class Player extends Role { public Player(int x, int y, int hp, int attack) { this.x = x; this.y = y; this.hp = hp; this.attack = attack; } @Override public void move(int direction) { switch (direction) { case Game.UP: if (x > 0 && Game.map[x - 1][y] != Game.WALL) { x--; } break; case Game.DOWN: if (x < Game.MAP_ROWS - 1 && Game.map[x + 1][y] != Game.WALL) { x++; } break; case Game.LEFT: if (y > 0 && Game.map[x][y - 1] != Game.WALL) { y--; } break; case Game.RIGHT: if (y < Game.MAP_COLS - 1 && Game.map[x][y + 1] != Game.WALL) { y++; } break; } } @Override public void attack(Role enemy) { System.out.println("玩家攻击!"); enemy.hurt(attack); } } ``` (5)设计Game类 Game类是游戏的控制类,包含游戏的开始、进行和结束方法,以及游戏中的各种操作。具体代码如下: ```java import java.util.Scanner; public class Game { public static final int UP = 1; public static final int DOWN = 2; public static final int LEFT = 3; public static final int RIGHT = 4; public static final int WALL = 1; public static final int PLAYER = 2; public static final int MONSTER = 3; public static final int TREASURE = 4; public static final int MAP_ROWS = 10; public static final int MAP_COLS = 10; public static int[][] map = new int[MAP_ROWS][MAP_COLS]; // 游戏地图 private Maze maze; // 迷阵对象 private Player player; // 玩家对象 private Monster monster; // 怪物对象 // 开始游戏 public void start() { initMap(); maze = new Maze(map); maze.printMaze(); initPlayer(); initMonster(); Scanner scanner = new Scanner(System.in); while (true) { System.out.print("请输入方向(w上 s下 a左 d右):"); String input = scanner.next(); int direction = getDirection(input); if (direction == 0) { System.out.println("输入有误!"); } else { player.move(direction); checkCollision(); } } } // 初始化地图 private void initMap() { for (int i = 0; i < MAP_ROWS; i++) { for (int j = 0; j < MAP_COLS; j++) { if (i == 0 || j == 0 || i == MAP_ROWS - 1 || j == MAP_COLS - 1) { map[i][j] = WALL; } else { map[i][j] = (int) (Math.random() * 3) + 2; } } } } // 初始化玩家 private void initPlayer() { int x, y; do { x = (int) (Math.random() * MAP_ROWS); y = (int) (Math.random() * MAP_COLS); } while (map[x][y] != PLAYER); player = new Player(x, y, 100, 10); } // 初始化怪物 private void initMonster() { int x, y; do { x = (int) (Math.random() * MAP_ROWS); y = (int) (Math.random() * MAP_COLS); } while (map[x][y] != MONSTER); monster = new Monster(x, y, 50, 5); } // 获取方向 private int getDirection(String input) { switch (input) { case "w": return UP; case "s": return DOWN; case "a": return LEFT; case "d": return RIGHT; default: return 0; } } // 检测碰撞 private void checkCollision() { if (player.x == monster.x && player.y == monster.y) { player.attack(monster); monster.attack(player); } } } ``` 4. 实验结果 经过测试,我们的石头迷阵游戏能够正常运行,并且实现了基本的功能,如玩家移动、怪物移动、玩家攻击、怪物攻击等。同时,我们还实现了异常处理机制,确保程序不会因为错误输入或其他异常情况而崩溃。 5. 实验总结 通过本次实验,我们深入学习了面向对象程序设计和Java语言的基本概念,如类、对象、继承、接口、异常处理等。同时,我们通过实际设计一个简单的石头迷阵游戏来加深对这些概念的理解和掌握。在实验过程中,我们还学习了如何使用Java的基本语法和API,如数组、循环、条件语句、Scanner类等。通过这些实践,我们不仅提高了自己的编程能力,还加深了对计算机科学的理解和认识,为以后的学习和工作打下了坚实的基础

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮皮皮皮皮皮卡乒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值