我正在将记录导入我的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
),但我仍然得到相同的错误。感谢您提供的任何提示或指示。
答案 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;