我有一些代码无法正常工作(这对我来说很常见),但由于我没有收到错误,它只会继续运行错误的数据。我认为问题是它一直告诉我将我的部分代码包装在try / catch块中(我的测试是基本的,我只是在try区域输出一条消息,如果它输出了,我认为一切都很顺利。所有似乎都没有在我的代码中)。我在生产中理解,使用try / catch语句可以帮助代码继续运行,但它使我难以排除故障,因为我正在尝试对代码中的那部分进行故障排除。
有没有办法解决这个问题,所以我实际上可以看到尝试区内的某些内容何时失败?
以下是我的代码示例:
try {
ByteArrayInputStream baos_back = new ByteArrayInputStream(message);
ObjectInputStream oos_back = new ObjectInputStream(baos_back);
i = oos_back.readInt();
d = oos_back.readDouble();
list_of_ints = (int[]) oos_back.readObject();
oos_back.reset();
baos_back.reset();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 0 :(得分:3)
发生此错误时,您是否试图让程序爆炸?如果是这样,您应该能够将IOException
包裹在RuntimeException
中并将其丢弃。它们是未经检查的,所以你不需要声明它们就应该杀掉你的程序就好了。
答案 1 :(得分:1)
如果您希望代码抛出相应的异常,我建议不要使用try-catch块。 Try-catch用于处理异常,然后继续运行程序,但听起来你根本不想处理它们。
如果你想使用try-catch块,你总是可以在catch块的末尾手动抛出RuntimeException。 类似的东西:
throw new IOException();
try {
// Some code...
} catch(Exception e) {
// Error handling code...
throw new RuntimeException(e.getMessage());
}
答案 2 :(得分:1)
正如我在评论中提到的那样,您可以使用全面的catch语句捕获Java中的所有异常:
try {
// code
} catch (Exception e) {
e.printStackTrace();
}
这将捕获Exception
块中抛出的每个try
,并且唯一不会捕获的是Error
s。
实际上,您需要限制捕获的异常类型,并捕获更具体的异常,因此可以按如下方式链接异常链:
try {
// code
} catch (IOException ioe) {
// we expected this
ioe.printStackTrace();
} catch (SomeOtherException soe) { // just an example...
soe.printStackTrace();
} catch (Exception e) {
// Did we expect this? Maybe not!
e.printStackTrace();
}
上述内容也让人知道你期望发生某些类型的异常,然后是一个可以捕捉到你没想到的事情的全面的全面说明。
您还可以将异常记录到文件或其他内容,而不是像现在这样的代码那样将它们输出到标准输出。基本日志记录实用程序是java.util.logging
。
我仍然建议学习使用调试器。调试器可以执行很多操作,例如在抛出异常时暂停程序执行,并允许您在程序执行的任何时刻检查变量和字段的值。如果您使用Eclipse或Netbeans或IntelliJ或其他IDE,则它们具有调试器。如果使用命令行,则有jdb
命令行java调试器。
答案 3 :(得分:1)
我建议编辑代码生成模板来执行此操作
catch ( $ExceptionClass e )
{
// TODO: Autogenerated catch block
e.printStackTrace();
throw new RuntimeExcepton( e );
}
这样你就有了一个TODO提醒,stdout上的一个barf,如果你没有提供正确的异常处理程序,你可以确保你的程序会爆炸。