返回信息流比如这个
public static Integer div(int a, int b) {
if (b==0) {
return null;
} else {
return a/b;
}
}
如果处理的过程中出现错误,就返回null;否则返回正确的结果。这种方法可以用于处理异常。好处就是:
public static void main(String[] args) {
Integer a = div(1,2);
Integer b = div(3,4);
Integer c = div(5,0);
Integer d = div(7,8);
}
这样,即使a,b,c,d其中有一个值计算不正常(比如这次是c无法正常计算),所有的计算也能依次进行。有时候在复杂的计算中,允许“一部分不成功”,但是“其余部分如果能计算就要尽量计算”。
如果抛出异常
public static int div(int a, int b) {
if (b==0) {
throw new ArithmeticException("Divide by zero");
} else {
....
}
}
虽然也能处理异常,但是使用的时候,必须随时处理所有的异常。这偏偏不是我期望的。但是,好处是,exception里可以保存错误信息“Divide by zero”。
===============
我设想有另一种解决方案:设定一种对象:Bottom。它具备一个性质:
- 它是所有类的子类,它实现所有的接口。所以,它可以被赋给任何类型的变量。
- 对它的任何操作都是失败的。
根据这个定义,null就是一种Bottom。因为:
- ArrayList<String> a = null;
HashMap<Integer,Double> b = null;
URL u = null;
String s = null;
Integer i = null;
看吧,null可以被赋值给任何变量(当然,仅限于引用变量)
- a.add("hello"); (抛出NullPointerException)
b.put(3,3.14); (抛出NullPointerException)
u.openStream(); (抛出NullPointerException)
s.length(); (抛出NullPointerException)
i.intValue(); (抛出NullPointerException)
看吧,对它的任何操作都是失败的。
之所以叫bottom,是因为它处于继承树的最底层——它是所有类的子类。
但是,我想扩展null。让这个null里可以包含错误信息。
class Bottom extends everything_else implements all_interfaces {
private String message;
// getters and setters;
}
然后,div函数可以改成这样:
public static Integer div(int a, int b) {
if (b==0) {
return new Bottom("Divide by zero"); // 由于Bottom是任何类的子类,不应该有类型错误。
} else {
return a/b;
}
}
public static void main (String[] args) {
Integer a = div(5,0);
if (a instanceof Bottom) {
System.err.println(((Bottom)a).getMessage()); // 打印“Divide by zero”
}
}
Java应该不能直接这样定义。借助CGLib呢?
抛砖引玉。
这是一条镜像帖。来源:北邮人论坛 / java / #18329同步于 2011/5/14
Java机器人发帖
bottom??????
wks
2011/5/14镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。