1

我有一些代码不起作用(这对我来说很常见),但是因为我没有收到错误,所以它只是继续使用错误数据运行。我认为的问题是它一直告诉我将部分代码包装在 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();
    }
4

4 回答 4

4

发生此错误时,您是否试图让您的程序崩溃?如果是这样,您应该能够将您的包裹IOException在 a 中RuntimeException,然后将其扔掉。它们未经检查,因此您无需声明它们,它应该会很好地杀死您的程序。

于 2012-04-18T01:13:12.803 回答
2

如果您希望您的代码抛出适当的异常,我建议您根本不要使用 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());
}
于 2012-04-18T01:20:41.617 回答
1

正如我在评论中提到的,您可以使用一揽子 catch 语句捕获 Java 中的所有异常:

try {
    // code
} catch (Exception e) {
    e.printStackTrace();
}

这将捕获块Exception中的每个抛出,try唯一不会捕获的东西是Errors。

在实践中,您会希望限制捕获的异常类型,并捕获更具体的异常,因此您可以将异常链如下:

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 调试器。

于 2012-04-18T01:40:40.823 回答
1

我建议编辑您的代码生成模板来执行此操作

catch ( $ExceptionClass e )
{
  // TODO: Autogenerated catch block
  e.printStackTrace();
  throw new RuntimeExcepton( e );
}

这样你就有了一个 TODO 提醒,一个标准输出上的 barf,并确保如果你不提供正确的异常处理程序,你的程序将会崩溃。

于 2012-04-18T01:42:52.820 回答