正如标题所说,我想知道关于抛出NullPointerExceptions的最佳实践是什么.具体来说,如果我有一个外部库函数,可以null在我不想实际处理的情况下返回(参见下面的具体示例),因为它null表示软件有问题.问题是,我应该
null并自己抛出NullPointerException,或者第一种方法让我添加一些额外的信息,因为我构建NullPointerException,但第二种方法在我看来更清晰的代码.我还想知道任何性能影响,也就是说,Java在"原生"投掷NPE方面更有效率?
举例来说,我正在尝试使用Java Speech API使用以下代码创建语音合成器:
synthesizer = Central.createSynthesizer(generalDesc);
if (synthesizer == null) {
// (1) throw NPE explicitly
throw new NullPointerException("No general domain synthesizer found.");
}
// (2) let the JVM throw the NPE when dereferencing
synthesizer.allocate();
Run Code Online (Sandbox Code Playgroud)
Central.createSynthesizernull如果找不到合适的合成器,则返回,这通常是由于缺少speech.properties文件引起的.所以这是系统设置错误的问题,而且在运行时很难恢复,而不是需要以编程方式处理的情况.因此,我认为抛出NullPointerException是一个有效的响应,因为它表示一个错误(不在代码中,而是在软件的部署中).但是由于该synthesizer对象在下一个语句中被解除引用,我应该让JVM为我抛出NPE并保存null检查吗?
附录:考虑到当(通常)"user.home"或"java.home/lib"中的文件系统上存在需要存在JVM启动时才加载 speech.properties ,令人费解的是createSynthesizer不会直接抛出NPE(这是我最初在弗洛伊德语中写的,当它找不到它但返回null时.我认为抛出NullPointerException是正确的做法,因为它表明了软件部署中的实际错误.
我有一个数据集,以9pt的比例对Likert项目做出回应.我想创建数据的频率表(和条形图),但是我的数据集中的某些值永远不会出现,因此table()从频率表中删除该值.我想用它来表示频率为的值0.也就是说,给定以下数据集
# Assume a 5pt Likert scale for ease of example
data <- c(1, 1, 2, 1, 4, 4, 5)
Run Code Online (Sandbox Code Playgroud)
我想获得以下频率表,而无需手动插入3以该值命名的列0.
1 2 3 4 5
3 1 0 2 1
Run Code Online (Sandbox Code Playgroud)
我是新手R,所以也许我忽略了一些基本的东西,但我没有遇到能够提供所需结果的功能或选项.
我是SPLOM的粉丝
有谁知道可以支持分类数据箱图的SPLOM包?当你有像"性别"这样的列的散点图时,这看起来很奇怪
我已经使用JUnit的实验注释为hashCode和equals方法实现了通用测试@Theory.测试用例类本身基于dfa的版本.
但是,当我尝试测试java.net.InetAddress该类时,如果提供数据点的方法包含抛出异常的代码(在本例中为an UnknownHostException),我遇到了一个特殊的问题:
所以我尝试了两种方法,这两种方法都导致了同样令人不满意的结果:
将方法声明为抛出适当的异常:
@DataPoints
public static InetAddress[] declareException() throws UnknownHostException {
return new InetAddress[] {
InetAddress.getByName("not a valid internet address")
};
}
Run Code Online (Sandbox Code Playgroud)显式捕获异常并重新抛出AssertionError:
@DataPoints
public static InetAddress[] rethrowAsAssertionError() {
try {
return new InetAddress[] {
InetAddress.getByName("not a valid internet address")
};
} catch(UnknownHostException ex) {
throw new AssertionError(ex);
}
}
Run Code Online (Sandbox Code Playgroud)在这两种情况下,AssertionError都会抛出一条无用的消息"从未找到满足方法假设的参数.违反假设:[]",这与首先没有带@DataPoints注释的方法相同.
有没有人知道是否有办法将异常传播给JUnit(最终是用户)或者这是JUnit中的错误?
抛出以下查询 Virtuoso 37000 Error SP030: SPARQL compiler, line 0: Bad character '%' (0x25) in SPARQL expression at '%'
PREFIX res: <http://dbpedia.org/resource/>
PREFIX yago: <http://dbpedia.org/class/yago/>
SELECT * WHERE {
res:Reykjav%C3%ADk rdf:type yago:CapitalsInEurope ;
rdfs:label ?label ;
rdfs:comment ?abstract.
FILTER (lang(?label) = "en" && lang(?abstract) = "en")
}
Run Code Online (Sandbox Code Playgroud)
虽然这个(原谅双关语)语义上相同的查询没有
PREFIX yago: <http://dbpedia.org/class/yago/>
SELECT * WHERE {
<http://dbpedia.org/resource/Reykjav%C3%ADk> rdf:type yago:CapitalsInEurope ;
rdfs:label ?label ;
rdfs:comment ?abstract.
FILTER (lang(?label) = "en" && lang(?abstract) = "en")
}
Run Code Online (Sandbox Code Playgroud)
为什么在带前缀的标识符中不允许使用URL转义字符,但是在提供完整的IRI时呢?