Menci Lucio Ответов: 2

Неожиданный мертвый код java


Всем привет!
У меня есть этот источник:
protected boolean createDocument(String FileName, Row fileRow, ArrayList rows) {
    String currKey = getCurrentKey(fileRow);
    TransferDocument dtr = null;

    if (documentList.containsKey(currKey)) {
        dtr = (TransferDocument) documentList.get(currKey);
        if (dtr == null) // already found into the search, already done
            return true;
    }

    if (dtr == null) {  // documentList does not contains the key
        dtr = newDocument(fileRow);     // may be null or not
        documentList.put(currKey, dtr); // record even if it is null
        if (dtr == null)
            return true;
    }

    addRows(dtr, fileRow);

    return true;
}

protected TransferDocument newDocument(Row fileRow) {
    String alreadyDone = super.searchAlreadyDone(fileRow);
    if (alreadyDone != null) {
        output.print("Already done: " + alreadyDone);
        return null;
    }

    TransferDocument dtr = (TransferDocument) Factory.createObject(TransferDocument.class);

    return dtr;
}


Что я уже пробовал:

Затмение предупреждает меня на return true; сразу после проверки dtr == null метод createDocument, но новый документ может возвращать значение null или не NULL значения.

Где-то я читал о том, что мертвый код не будет скомпилирован. Должен ли я бояться этого?

Спасибо.

Richard MacCutchan

Пожалуйста, покажите точное сообщение об ошибке.

2 Ответов

Рейтинг:
12

Menci Lucio

Я решил так:

if (dtr == null) {  // documentList does not contains the key
    dtr = newDocument(fileRow);     // may be null or not
    documentList.put(currKey, dtr); // record even if it is null
}

if (dtr != null)
    addRows(dtr, fileRow);

return true;


но это предупреждение компилятора настолько странно (я думаю, что компилятор не знает, что нулевое значение может быть передано методу put).


Richard MacCutchan

Вы все еще не показали нам точное сообщение об ошибке. Поэтому мы можем только догадываться, в чем может быть проблема.

Рейтинг:
0

Kornfeld Eliyahu Peter

Глобально мертвый код не будет означать никаких проблем после компиляции (даже я не вижу, где здесь какой-то мертвый код...), так что вам не нужно его бояться...
Однако я вижу там и другую проблему...

Ваша версия:

dtr = newDocument(fileRow);

documentList.put(getCurrentKey(fileRow), dtr); // what if dtr is null here?

if (dtr == null)
  return true;
Моя версия:
dtr = newDocument(fileRow);

if (dtr == null)
  return true;

documentList.put(getCurrentKey(fileRow), dtr); // put this line here to be sure


Menci Lucio

Я немного очистил свой код, чтобы увидеть только интересные строки для purpouse, но вместо этого исходный код:
TransferDocument dtr = (TransferDocument) documentList. get(getCurrentKey(fileRow));
был:
Строка currKey = getCurrentKey(fileRow);
TransferDocument ДТР = нуль;
если (documentList.containsKey(currKey)) {
dtr = (TransferDocument) documentList. get(currentKey);
if (dtr = = null) / / уже найдено в поиске, уже сделано
вернуть true;
}

Таким образом, уже сделанное предупреждение появится только один раз.

Kornfeld Eliyahu Peter

Значит, ваш исходный код таков?

protected boolean createDocument(String FileName, Row fileRow, ArrayList rows) {	
	String currKey = getCurrentKey(fileRow);	
	TransferDocument dtr = null; 	

	if (documentList.containsKey(currKey)) {		
		dtr = (TransferDocument) documentList.get(currentKey);		

		if (dtr == null) // already found into the search, already done			
			return true;	
	} 	

	if (dtr == null) {		
		dtr = newDocument(fileRow);		
		documentList.put(getCurrentKey(fileRow), dtr);		

		if (dtr == null)			
			return true;	
	} 	

	addRows(dtr, fileRow); 	
	return true;
}

На какой строке находится предупреждение о мертвом коде?
(Конечно, "if (dtr == null)" в строке 11 всегда истинно с точки зрения компилятора...

Menci Lucio

Я обновил свой код.

DocumentList может содержать ключ, а может и нет. Если он содержит ключ, его значение может быть нулевым, а может и не быть нулевым.

Есть четыре чека. Если есть ключ (первая проверка истинна) и его значение равно null (вторая проверка ложна), возвращается, если его значение не равно null, третья проверка ложна.

Если ключа нет (первая проверка false), то третья проверка истинна, newDocument может создать или не создать документ, поместить результат в список документов, а четвертая проверка может быть истинной или ложной (если документ создан или нет).

Никакие проверки не могут иметь только истинный или ложный результат.

documentList - это карта (точнее, древовидная карта). Я думаю, что компилятор не знает, что нулевое значение может быть передано методу put.