- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通常 Java 方法如下所示:
public <U,V> U doSomething(V aReference) {
// Do something
}
这通常意味着方法 doSomething()
返回 null
如果它失败(无论出于何种原因)或有效的对象引用。在某些情况下“有效对象引用”本身可能是 null
。例如,该方法 aMap.get(k)
可能会返回null
如果没有 key k
或者如果有一把 key k
但其对应的值为null
。困惑!
更不用说NullPointerException
如果你的 LOC 的 50% 不只是空检查。
像这样的方法有什么问题:
public <T> ReturnTuple<T> doSomething(V aReference) {
T anotherObjRef = getValidObjT();
if (successful) {
return ReturnTuple.getSuccessTuple(anotherObjRef);
} else {
return ReturnTuple.getFailureTuple("aReference can't be null");
}
}
所在类(class)ReturnTuple<T>
定义如下:
class ReturnTuple<T> {
private boolean success;
// Read only if success == true
private T returnValue;
// Read only if success == false
private String failureReason;
// Private constructors, getters, setters & other convenience methods
public static <T> ReturnTuple<T> getSuccessTuple(T retVal) {
// This code is trivial
}
public static <T> ReturnTuple<T> getFailureTuple(String failureReason) {
// This code is trivial
}
}
那么调用代码将如下所示:
ReturnTuple<T> rt = doSomething(v);
if (rt.isSuccess()) {
// yay!
} else {
// boo hoo!
}
所以,我的问题是:为什么这种模式没有更常见?这是什么问题?
请记住,我并不是要求对这段确切的代码进行批评,而是要求对对这一总体想法的批评。
请注意:这里的重点不是让上面的代码编译,只是为了讨论一个想法。所以请不要对代码的正确性过于迂腐:-)。
我想我应该从一开始就添加这一部分,但最好晚点添加比从来没有...
是否曾经希望一个方法可以同时返回两个值?或者说返回的一个值的大小可以与指示成功的能力脱钩,或者失败?
这也可以促进方法干净整洁的想法自包含单元(低耦合和高内聚):处理所有(或大多数)执行过程中产生的异常(不是谈论异常喜欢 IllegalArgumentException
),谨慎地记录失败原因(而不是比未捕获的异常的丑陋堆栈跟踪)并且只会打扰调用者准确提供所需信息。恕我直言,这也促进了信息隐藏和封装。
尽最大努力进行测试,但是当代码部署给客户时,未捕获的异常丑陋的堆栈跟踪使一切看起来如此不专业。
与上述类似:您可能有可能生成20 种不同的异常,但您只捕获其中的 5-7 个。正如我们大家一样知道,客户做了最糟糕的事情:依靠他们来引起所有其他事情未捕获 13-15 个异常:-)。当他们看到一个大的东西时,你最终看起来很糟糕堆栈跟踪(而不是添加到日志中的离散失败原因)。
这是(例如)显示堆栈跟踪与Web 应用程序中的用户 vs. 向他们展示格式良好的 5xx 错误页面:例如:“出现错误,无法完成您的请求。管理员已收到通知,将尽快修复。”等
这个想法并非完全没有优点,因为 Java 8 提供了 Optional类(正如 @JBNizet 所指出的)和 Google 的 Guava图书馆还有一个 Optional类(class)。这只是更进一步。
最佳答案
This typically means that the method
doSomething()
returns a null if it fails
不,这不是这个意思。这意味着 doSomething()
方法有时可能会合法地返回 null
,而不会失败。 Java 提供了一个强大的系统来处理故障——即异常处理。这就是 API 指示失败的方式。
why isn't this [return a tuple] pattern more common? What is wrong with it?
这种模式的主要错误是它使用了一种与 Java 不同的方式报告失败的机制。如果您的 API 遇到故障,请抛出异常。这使您不必创建“主流”情况下所需数量的两倍的对象,并且使熟悉 Java 类库的人能够直观地理解您的 API。
在某些情况下,返回 null
可以以两种方式解释:作为失败,以及作为合法的返回值。在关联容器中查找对象提供了一个很好的例子:当您提供一个不在映射中的键时,人们可以声称这是一个编程错误并抛出异常(.NET 类库就是这样做的),或者声称当该键缺少,则 map 中的相应点包含默认值,即 null
- 这是在 Java 中完成的方式。在这种情况下,返回元组是完全可以接受的。 Java 的 Map
决定不这样做,因为每次从 Map
请求对象时,很可能会节省创建额外对象的时间。
关于java - 为什么 Jave 方法不返回一个元组而不是一个对象引用(或 null)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24585677/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!