分布式计算第一周实验:Java进阶与Socket通讯

课程地址

http://ss.sysu.edu.cn/~pml/dct/1_intro.html

实验内容

  1. 解释 RuntimeException。例举它的1-2个之类,并用一个小程序验证捕获并处理异常的过程。
    NullPointerException - 空指针引用异常
    IndexOutOfBoundsException - 下标越界异常

    // 测试代码:
    public class test1 {
      public static void main(String[] args) {
        int[] numbers = new int[5];
        try {
          int test = numbers[10];
        } catch (IndexOutOfBoundsException e) {
          e.printStackTrace();   // 捕获下标越界异常
        }
    
        String str = null;
        try {
          str.equals("test");
        } catch (NullPointerException e) {
          e.printStackTrace();   // 捕获空指针引用异常
        }
      }
    }

    输出结果:
    输出结果:

  2. 在生产实践中,每个业务模块都会定义一个异常基类,例如 Account 模块定义 AccountException 继承 Exception,然后在定义各种业务异常 如 OutOfMoneyException 继承 AccountException。请使用 UML 绘图工具 UMLet 绘制这些类及其关系。

    这里写图片描述

  3. 类的方法中,如果抛出一个异常类型,方法声明中能否不申明?例如 public void transfer(double amount) throws OutOfMoney 去掉 throws OutOfMoney。去掉的后果是什么?

    这里写图片描述

  4. Socket是两个进程联系的虚拟通道。如果服务器程序不启动,仅运行客户端,客户端会阻塞还是出错?在那条语句?

    出错。 在获取本地ip地址,访问在本地的服务程序的语句中。

    // 获取本地ip地址,访问在本地的服务程序,缺省端口是:1234
    Socket server = new Socket(args[0], Integer.parseInt(args[1]));

    这里写图片描述

  5. 如果程序运行到一半,服务端意外退出,客户端会表现出什么行为?
    客户端在不提交数据的情况下保持不变,当提交数据时,会因为连接不到服务端而产生错误,自动关闭

    这里写图片描述

  6. (!)BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream())); 语句是典型的设计模式“装饰模式”,请检索自学“Decorator Pattern”,请使用 UML 绘图工具 UMLet 绘制涉及的类及其关系。

  7. 案例中 ServerSocket 能否支持两个或以上客户端?为什么?

    不可以。这是单线程服务程序,服务端只获取了一个客户端:

    // 监听客户程序的连接请求
    Socket client = server.accept();
  8. 线程与进程的区别?
    线程是指进程内的一个执行单元,也是进程内的可调度实体。进程是一种重量级任务,而线程则是一种轻量级任务。每一进程占有独立的地址空间,包括代码、数据及其他资源,而一个进程中的多个线程可共享该进程的这些空间;进程之间的通信(简称 IPC)开销较大且受到诸多限制,必须具有明确的对象或操作接口并采用统一的通信协议,而线程之间则可通过共享的公共数据区进行通信,开销较少且比较简单;进程间的切换开销也较大,而线程间的切换开销较小。

  9. Java 两个启动线程方法各有哪些优点、缺点?

    1. 通过继承Thread类的方式时,线程类就无法继承其他的类来实现其他一些功能,实现接口的方式就没有这中限制;
    2. 通过实现Runnable接口的方式可以达到资源共享的效果。
  10. (!)简述 Java 中 synchronized 的用法。
    1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
    2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
    3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
    4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
  11. 对象序列化二进制流中能否存在指针值(内存地址引用)?为什么?

    不能。因为别的环境下对应的内存地址不一定是有效值。

  12. (!)为了使序列化和反序列化变得易于理解,人们提出了使用 Json,XML,Yaml等格式的文本表示对象。请写一个小程序,选择其中一种格式,在控制台输出Account对象

  13. instanceof 很好用,为什么需要反射技术呢?请结合案例简述反射的必要性。

    Instanceof牺牲了面向对象中的多态性。在AccountReflect的copy函数中,并不知道要使用的类是什么,而反射机制就是提供了程序使用在编译期并不知道的类的功能。

  14. 代理模式(proxy pattern)的特征是代理类与委托类有同样的接口。请使用 UML 绘图工具 UMLet 绘制案例代理模式的 UML 图(图8),并用自然语言简单描述静态代理类 StaticServiceProxy 的工作过程。

    建客户端PorxyClient通过AccountService代理类StaticServiceProxy来对用Server服务端的AccountServiceImpl对象的方法。

    这里写图片描述

  15. 简述静态代理和动态代理的区别。

    1. 静态代理类:程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
    2. 动态代理类:在程序运行时,运用反射机制动态创建而成。

个人学习小结

  1. 异常处理:
    错运行时异常都是RuntimeException类及其子类异常,如 NullPointerException 、IndexOutOfBoundsException 等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理

    这里写图片描述

  2. Java启动线程的两个方法:

    1. 应用 Runnable 创建线程
    2. 继承 Thread 类
  3. 序列化:

    当ObjectOutputStream对对象进行序列化时,如果该对象具有writeObject()方法,那么就会执行这一方法,否则就按默认方式序列化。在该对象的writeObjectt()方法中,可以先调用ObjectOutputStream的defaultWriteObject()方法,使得对象输出流先执行默认的序列化操作。同理可得出反序列化的情况,不过
    使用的是defaultReadObject()方法。

  4. 代理:
    如果使用静态代理方式,那么对于每一个需要代理的类,都要手工编写静态代理类的源代码;如果使用动态代理方式,那么只要编写一个动态代理工厂类,它就能自动创建各种类型的动态代理类

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值