小编Tho*_*asH的帖子

我应该显式抛出NullPointerException还是让Java为我做?

正如标题所说,我想知道关于抛出NullPointerExceptions的最佳实践是什么.具体来说,如果我有一个外部库函数,可以null在我不想实际处理的情况下返回(参见下面的具体示例),因为它null表示软件有问题.问题是,我应该

  1. 检查返回值null并自己抛出NullPointerException,或者
  2. 一旦我尝试使用该对象,我应该让Java为我做脏工作吗?

第一种方法让我添加一些额外的信息,因为我构建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是正确的做法,因为它表明了软件部署中的实际错误.

java null nullpointerexception

11
推荐指数
2
解决办法
7009
查看次数

在Likert数据的频率表中包括零频率

我有一个数据集,以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,所以也许我忽略了一些基本的东西,但我没有遇到能够提供所需结果的功能或选项.

r frequency

9
推荐指数
2
解决办法
7587
查看次数

Scatterplot矩阵与分类数据的箱线图

我是SPLOM的粉丝

有谁知道可以支持分类数据箱图的SPLOM包?当你有像"性别"这样的列的散点图时,这看起来很奇怪

statistics r

6
推荐指数
1
解决办法
1325
查看次数

如何通知JUnit在@DataPoints注释方法中生成的异常?

我已经使用JUnit的实验注释为hashCodeequals方法实现了通用测试@Theory.测试用例类本身基于dfa的版本.

但是,当我尝试测试java.net.InetAddress该类时,如果提供数据点的方法包含抛出异常的代码(在本例中为an UnknownHostException),我遇到了一个特殊的问题:

所以我尝试了两种方法,这两种方法都导致了同样令人不满意的结果:

  1. 将方法声明为抛出适当的异常:

    @DataPoints
    public static InetAddress[] declareException() throws UnknownHostException {
        return new InetAddress[] {
            InetAddress.getByName("not a valid internet address")
        };
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 显式捕获异常并重新抛出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中的错误?

java junit unit-testing junit4

5
推荐指数
1
解决办法
2545
查看次数

使用PREFIX时,为什么SPARQL查询中不允许转义字符?

抛出以下查询 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时呢?

rdf sparql virtuoso

5
推荐指数
0
解决办法
1076
查看次数