课程地址
http://ss.sysu.edu.cn/~pml/dct/1_intro.html
实验内容
解释 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(); // 捕获空指针引用异常 } } }
输出结果:
在生产实践中,每个业务模块都会定义一个异常基类,例如 Account 模块定义 AccountException 继承 Exception,然后在定义各种业务异常 如 OutOfMoneyException 继承 AccountException。请使用 UML 绘图工具 UMLet 绘制这些类及其关系。
类的方法中,如果抛出一个异常类型,方法声明中能否不申明?例如 public void transfer(double amount) throws OutOfMoney 去掉 throws OutOfMoney。去掉的后果是什么?
Socket是两个进程联系的虚拟通道。如果服务器程序不启动,仅运行客户端,客户端会阻塞还是出错?在那条语句?
出错。 在获取本地ip地址,访问在本地的服务程序的语句中。
// 获取本地ip地址,访问在本地的服务程序,缺省端口是:1234 Socket server = new Socket(args[0], Integer.parseInt(args[1]));
如果程序运行到一半,服务端意外退出,客户端会表现出什么行为?
客户端在不提交数据的情况下保持不变,当提交数据时,会因为连接不到服务端而产生错误,自动关闭(!)BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream())); 语句是典型的设计模式“装饰模式”,请检索自学“Decorator Pattern”,请使用 UML 绘图工具 UMLet 绘制涉及的类及其关系。
案例中 ServerSocket 能否支持两个或以上客户端?为什么?
不可以。这是单线程服务程序,服务端只获取了一个客户端:
// 监听客户程序的连接请求 Socket client = server.accept();
线程与进程的区别?
线程是指进程内的一个执行单元,也是进程内的可调度实体。进程是一种重量级任务,而线程则是一种轻量级任务。每一进程占有独立的地址空间,包括代码、数据及其他资源,而一个进程中的多个线程可共享该进程的这些空间;进程之间的通信(简称 IPC)开销较大且受到诸多限制,必须具有明确的对象或操作接口并采用统一的通信协议,而线程之间则可通过共享的公共数据区进行通信,开销较少且比较简单;进程间的切换开销也较大,而线程间的切换开销较小。Java 两个启动线程方法各有哪些优点、缺点?
- 通过继承Thread类的方式时,线程类就无法继承其他的类来实现其他一些功能,实现接口的方式就没有这中限制;
- 通过实现Runnable接口的方式可以达到资源共享的效果。
- (!)简述 Java 中 synchronized 的用法。
- 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
- 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
- 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
- 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
对象序列化二进制流中能否存在指针值(内存地址引用)?为什么?
不能。因为别的环境下对应的内存地址不一定是有效值。
(!)为了使序列化和反序列化变得易于理解,人们提出了使用 Json,XML,Yaml等格式的文本表示对象。请写一个小程序,选择其中一种格式,在控制台输出Account对象
instanceof 很好用,为什么需要反射技术呢?请结合案例简述反射的必要性。
Instanceof牺牲了面向对象中的多态性。在AccountReflect的copy函数中,并不知道要使用的类是什么,而反射机制就是提供了程序使用在编译期并不知道的类的功能。
代理模式(proxy pattern)的特征是代理类与委托类有同样的接口。请使用 UML 绘图工具 UMLet 绘制案例代理模式的 UML 图(图8),并用自然语言简单描述静态代理类 StaticServiceProxy 的工作过程。
建客户端PorxyClient通过AccountService代理类StaticServiceProxy来对用Server服务端的AccountServiceImpl对象的方法。
简述静态代理和动态代理的区别。
- 静态代理类:程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
- 动态代理类:在程序运行时,运用反射机制动态创建而成。
个人学习小结
异常处理:
错运行时异常都是RuntimeException类及其子类异常,如 NullPointerException 、IndexOutOfBoundsException 等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理Java启动线程的两个方法:
- 应用 Runnable 创建线程
- 继承 Thread 类
序列化:
当ObjectOutputStream对对象进行序列化时,如果该对象具有writeObject()方法,那么就会执行这一方法,否则就按默认方式序列化。在该对象的writeObjectt()方法中,可以先调用ObjectOutputStream的defaultWriteObject()方法,使得对象输出流先执行默认的序列化操作。同理可得出反序列化的情况,不过
使用的是defaultReadObject()方法。代理:
如果使用静态代理方式,那么对于每一个需要代理的类,都要手工编写静态代理类的源代码;如果使用动态代理方式,那么只要编写一个动态代理工厂类,它就能自动创建各种类型的动态代理类