关于哪一行导致问题,我可能错了,但每次更改if()语句时错误都会改变:
try {
while(true) {
String LRU = hashOperation();
System.out.println("In worker thread, this should be valid JSON: " + LRU);
if (jsonValidator.isStringValidJSON(LRU) && !LRU.isEmpty()) {
HashMap<String,String> messageMap = jsonGenerator.readJSON(LRU);
所以我认为问题在于if()语句。如果我这样写:
if (jsonValidator.isStringValidJSON(LRU)) {
然后应用程序启动,我得到了这个例外:
In worker thread, this should be valid JSON:
Exception in worker thread in Main::main: No content to map to Object due to end of input
但如果我这样写:
if (jsonValidator.isStringValidJSON(LRU) && !LRU.isEmpty()) {
然后应用程序启动,但几乎立即死亡:
/usr/bin/java -cp /home/jenkins/run-nlp/SSAM.jar com.sofar.SSAM.Main
Starting NLP app 2015/08/30 21:42:28
Loading classifier from dependencies/english.all.7class.distsim.crf.ser.gz ... Killed
这里的基本想法是应用程序启动然后旋转一些在Redis上无休止地轮询的后台线程,寻找输入(输入来自另一个应用程序,将数据发布到Redis上的通道)。
当我看到&#34; Killed&#34;我假设一个Exception没有被捕获,但我将整个Thread :: run()包装在一个以/结尾的try / catch中:
} catch (Exception e) {
System.out.println("Exception in worker thread in Main::main: " + e.getMessage());
}
你可以看到,如果我这样做,这就是我得到的异常消息:
if (jsonValidator.isStringValidJSON(LRU)) {
虽然错误可能在其他地方,但我认为空字符串是有效的JSON是奇怪的,我想我会用以下方法筛选出这种可能性:
if (jsonValidator.isStringValidJSON(LRU) && !LRU.isEmpty()) {
为什么这一次更改导致我的应用程序被杀死?
更新:
我重构了这个应用程序:
static void processMessage(ssamBrain ssamBrain, Jedis jedis, HashMap<String, String> responseMap, JsonGenerator jsonGenerator, JSONValidator jsonValidator, String LRU) {
try {
if (!LRU.isEmpty()) {
HashMap<String,String> messageMap = jsonGenerator.readJSON(LRU);
Transformer transformer = new Transformer();
同样,导致问题的那一行似乎是:
if (!LRU.isEmpty()) {
如果我没有if()语句,那么代码将获得:
java.io.EOFException: No content to map to Object due to end of input
在下一行,因为空字符串无效JSON。
但是当我添加这个:
if (!LRU.isEmpty()) {
然后我的应用程序在启动时死亡。
也许autoboxing是问题?还是缺席呢?现在假设:
LRU =&#34;&#34 ;;
我假设我可以调用方法,但可能不是?为什么我不会得到例外?
问题可能在其他地方,但if()语句似乎是导致问题浮出水面的主要因素。
更新
更新
该应用程序有时会存活几分钟,但有时会在几秒钟后死亡。所以我想我需要问:
1。)当Java应用程序说&#34; Killed&#34;在终端中,这是否总是意味着一个例外未被捕获?
2。)什么可能导致这种变量行为?
答案 0 :(得分:0)
如果运营商如何运作:
if (CONDITION_1 && CONDITION_2){
doSomething();
}
如果CONDITION_1为false或抛出异常,则CONDITION_2永远不会检查。
变化:
if (jsonValidator.isStringValidJSON(LRU) && !LRU.isEmpty())
到:
if (!LRU.isEmpty() && jsonValidator.isStringValidJSON(LRU))
因此,首先检查LRU是否为空,如果不是,则运行验证。