为什么我的Java应用程序被杀?

时间:2015-08-30 21:52:39

标签: java exception

关于哪一行导致问题,我可能错了,但每次更改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。)什么可能导致这种变量行为?

1 个答案:

答案 0 :(得分:0)

如果运营商如何运作:

if (CONDITION_1 && CONDITION_2){
 doSomething();
}
  1. 检查CONDITION_1 - 如果确实如此:
  2. 检查CONDITION_2 - 如果为真:
  3. 运行doSometring()。
  4. 如果CONDITION_1为false或抛出异常,则CONDITION_2永远不会检查。

    1. 请显示异常stackTrace。
    2. 变化:

      if (jsonValidator.isStringValidJSON(LRU) && !LRU.isEmpty())
      
    3. 到:

          if (!LRU.isEmpty() && jsonValidator.isStringValidJSON(LRU)) 
      

      因此,首先检查LRU是否为空,如果不是,则运行验证。