我对Java很陌生并偶然发现了一个问题,我无法理解(我正在使用Eclipse Luna进行开发和执行):
我调用一个可能抛出错误并用try-catch-block包围它的方法:
try {
transaction.execute();
} catch (ModbusIOException e) {
log.debug("Fehler bei Modbustransaction: ModbusIOException - " + e.getMessage());
e.printStackTrace();
} ... // more catches
execute-method实际上抛出了ModbusIOException - 但它没有被catch-block捕获。在控制台中,我得到以下输出:
net.wimpi.modbus.ModbusIOException:读取失败 at net.wimpi.modbus.io.ModbusTCPTransport.readResponse(ModbusTCPTransport.java:180) 在net.wimpi.modbus.io.ModbusTCPTransaction.execute(ModbusTCPTransaction.java:193) at de.vksys.modbusclient.ModbusClient.getPlantState(ModbusClient.java:121) 在de.vksys.modbusclient.ReconnectingModbusClient.main(ReconnectingModbusClient.java:36)
如果我点击带有getPlantState的行,Eclipse会在上面的try-block中标记该行。但为什么不抓到那里呢?我还检查了catch块中ModbusIOException的全名,并且是相同的... net.wimpi.modbus.ModbusIOException。
任何想法,可能是什么原因?如果您需要更多代码来跟踪此情况,请告诉我。
提前致谢,
弗兰克
答案 0 :(得分:2)
它确实抓住了例外。您只需打印堆栈跟踪以及您在标准输出中看到的内容。
捕获异常,并不意味着它不会维护堆栈跟踪并且处理异常意味着您需要对其进行编码以便您可以从异常中恢复(这是您的程序中发生的事情,否则您的程序将会已经转到父方法,它调用你的方法回滚堆栈,即在readResponse方法中)你可能会说好的事情发生或你重新抛出异常。例如给出如下代码:
void myMethod() {
try {
methodThatThrowsIOException();
} catch (IOException ioe) {
ioe.printStackTrace();
}
System.out.println("I will be printed");
如果你没有发现异常,那么你永远不会执行类似&#34的打印声明;我将被打印出来#34; }