1.解释 RuntimeException。例举它的1-2个之类,并用一个小程序验证捕获并处理异常的过程。
错运行时异常都是 RuntimeException 类及其子类异常。这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理,但 程序应该从逻辑角度尽可能避免这类异常的发生。
如NullPointerException 、 IndexOutOfBoundsException 等
2.在生产实践中,每个业务模块都会定义一个异常基类,例如 Account 模块定义 AccountException 继承 Exception,然后在定义各种业务异常 如 OutOfMoneyException 继承 AccountException。请使用 UML 绘图工具 UMLet 绘制这些类及其关系。
3.类的方法中,如果抛出一个异常类型,方法声明中能否不申明?例如 public void transfer(double amount) throws OutOfMoney 去掉 throws OutOfMoney。去掉的后果是什么?
不行,在方法声明时throws的意思时将异常的抛出交给方法来做,若想要在类的方法中抛出异常就必须声明,若去掉则会报错。
4.Socket是两个进程联系的虚拟通道。如果服务器程序不启动,仅运行客户端,客户端会阻塞还是出错?在那条语句?
会出错。
在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是由机器地址和端口号来区分/识别的,那么在一个特定的计算机网 络上,每一个Socket都是以此方式被唯一识别的。这就使得应用程序可以唯一地去定位网络上的另外一个位置的Socket。只能连一个客户端。
8.线程与进程的区别?
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源。
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。
由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。
9.Java 两个启动线程方法各有哪些优点、缺点?
优点:继承Thread类和实现Runnable接口。
缺点:继承是单继承,实现接口可以多继承,如果用继承Thread类的方式,就不可以继承其他类了,而实现接口的方式编程复杂,若访问当前线程,必须使用Thread。currentThread()方法。
10.(!)简述 Java 中 synchronized 的用法。
线程阻塞是实现线程之间通信与同步的基础,Java 语言为线程提供了多种阻塞机制,其中 由 synchronized 标识的同步代码段与 wait()/notify()机制是最重要的两类线程阻塞形式。
同步模块:
同步对象:
同步方法:
11.对象序列化二进制流中能否存在指针值(内存地址引用)?为什么?
可以存在指针值,但是一般序列化数据,因为序列化一般用于文件的读写以及数据的传输,而储存指针值在关闭程序后指针值就失效了没有意义。
12.(!)为了使序列化和反序列化变得易于理解,人们提出了使用 Json,XML,Yaml等格式的文本表示对象。请写一个小程序,选择其中一种格式,在控制台输出Account对象
13.instanceof 很好用,为什么需要反射技术呢?请结合案例简述反射的必要性。
Instanceof 用于判断对象是否为某一类或接口的实例,避免转换异常,但是放射技术可以用来传递类型,比如说远程方法的调用,服务器不知道客户端传过来的参数的类型,利用反射技术就可以通过字符串的形式告诉客户端参数类型。
14.代理模式(proxy pattern)的特征是代理类与委托类有同样的接口。请使用 UML 绘图工具 UMLet 绘制案例代理模式的 UML 图(图8),并用自然语言简单描述静态代理类 StaticServiceProxy 的工作过程。
StaticServiceProxy 初始化时传入用于连接的主机号以及端口,当调用getAccount方法并传入需要发送的数据时,开始连接服务器,连接成功则将数据打包并调用connector中的方法来进行远程调用。
15.简述静态代理和动态代理的区别。
静态代理所要调用的远程方法是已经确定的用户无法自定义的,而动态代理需要用户提供他们所想要调用的方法名称。