Может кто-нибудь объяснить этот пример "мертвого кода"?
Некоторые пояснения по поводу следующих фрагментов:
Я возиться с некоторыми вызовами 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 и не достигли бы этого кода.