从方法返回的Java不正确的类型:无法为java.lang.String分配void值

时间:2015-06-29 17:54:05

标签: java solr

我正在将记录导入我的Solr数据库,并使用.bsh脚本预处理URL字段。该脚本工作正常,但记录没有URL字段的情况除外,然后它抛出以下错误:

Error while trying to evaluate script: getURLs.bsh
java.lang.IllegalArgumentException: Error while trying to evaluate script: getURLs.bsh
        at org.solrmarc.index.SolrIndexer.handleScript(SolrIndexer.java:1170)
        at org.solrmarc.index.SolrIndexer.addFieldValueToMap(SolrIndexer.java:914)
        at org.solrmarc.index.SolrIndexer.map(SolrIndexer.java:821)
        at org.solrmarc.marc.MarcImporter.addToIndex(MarcImporter.java:398)
        at org.solrmarc.marc.MarcImporter.importRecords(MarcImporter.java:312)
        at org.solrmarc.marc.MarcImporter.handleAll(MarcImporter.java:605)
        at org.solrmarc.marc.MarcImporter.main(MarcImporter.java:865)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.simontuffs.onejar.Boot.run(Boot.java:334)
        at com.simontuffs.onejar.Boot.main(Boot.java:170)
Caused by: Incorrect type returned from method: getURLDOICan't assign void value to java.lang.String: Can't assign void value to java.lang.String: <at unknown location>

at bsh.UtilEvalError.toEvalError(Unknown Source)
at bsh.BshMethod.invokeImpl(Unknown Source)
at bsh.BshMethod.invoke(Unknown Source)
at bsh.BshMethod.invoke(Unknown Source)
at org.solrmarc.index.SolrIndexer.handleScript(SolrIndexer.java:1162)
... 12 more

我的脚本如下:

import org.marc4j.marc.Record;

public String getURLDOI(Record record) {
    String url = indexer.getFirstFieldVal(record,"856u");
    if (url != null) {
        if (url.substring(0,7).equals("urn:doi")) {
            String result = "http://hdl.handle.net/"+url.substring(9);
            return result;
        } else {
            String result = url;
            return result;
        }
        return null;
    }
}

我如何处理那些没有URL字段("856u")的记录?我尝试在方法开始时设置result = null,然后在结尾处返回结果(而不是return null),但我仍然得到相同的错误。感谢您提供的任何提示或指示。

2 个答案:

答案 0 :(得分:1)

如果函数有一个字符串作为返回类型,则必须返回一个或抛出异常。正如另一篇文章所说,你可以返回一个空字符串或一些其他特殊值,然后让调用代码处理它。

您的另一个问题是您提供的功能无法编译。我重写了它以摆脱依赖,我得到:

public static String getURLDOI(String record) {
    String url = record;
    if (url != null) {
        if (url.substring(0,7).equals("urn:doi")) {
            String result = "http://hdl.handle.net/"+url.substring(9);
            return result;
        } else {
            String result = url;
            return result;
        }
        return "";
    }
}

当我尝试编译时出现这些错误:

Main.java:18: error: unreachable statement
  return "";
  ^
Main.java:20: error: missing return statement
}
^

按照我的想法,我会改写你的功能:

public static String getURLDOI(Record record) {

    String url = indexer.getFirstFieldVal(record,"856u");

    if (url == null)
        return "";

    if (url.substring(0,7).equals("urn:doi")) 
        return "http://hdl.handle.net/"+url.substring(9);

    return url;

}

它比嵌套的if语句读得更好,你犯了错误!它很容易做到,这就是你不应该为它们筑巢的原因。

答案 1 :(得分:0)

你可以返回一个空字符串&#34;&#34;