Может кто-нибудь объяснить этот пример "мертвого кода"?

Некоторые пояснения по поводу следующих фрагментов:
Я возиться с некоторыми вызовами Bluetooth обнаружения. Для этого я использую обратный вызов, который будет вызван, если BluetoothDevice найден или нет. Если устройство не найдено, параметр имеет значение null:

@Override
public void provideDevice(BluetoothDevice device) {
    super.provideDevice(device);
    Log.v("MainActivity","device name = " +device.getName());
    if(device != null) {

        mBinder.start(device);

    } else { 

        Toast.makeText(this, "No Device found", Toast.LENGTH_SHORT).show();

    }
}

Затмение говорит мне, что блок else является мертвым кодом.

Если я перееду Log вызовите в блоке if предупреждение исчезло:

@Override
public void provideDevice(BluetoothDevice device) {
    super.provideDevice(device);

    if(device != null) {

        Log.v("MainActivity","device name = " +device.getName());
        mBinder.start(bc);

    } else { 

        Toast.makeText(this, "No Device found", Toast.LENGTH_SHORT).show();

    }
}

Я знаю, что первый фрагмент бросит NPE, если параметр имеет значение null. Это не проблема в этом примере.

Я хотел бы знать, почему dead code warning появляется.

Я могу предоставить полный код, если этого недостаточно, чтобы сказать мне, что происходит.

2 ответа

Решение

Вы разыменование device в отчете журнала.

Если вы пройдете эту строку кода, device не может быть нулевым, потому что вы бы получили NPE, если бы это было.

Это означает, что else оператор является избыточным, потому что, если код заходит так далеко, он не может быть null,

Ваша проблема в том, что в первом примере Java знает, что это невозможно device != null быть ложным, так как если бы оно было нулевым, вы бы получили NPE из оператора log и не достигли бы этого кода.

Другие вопросы по тегам