-1

我已经学习了java的基础知识。我想了解异常处理。

1) 可以使用吗

try{............
}catch(Exception ex){
........
}

而不是更具体的东西

try{............
}catch(FileNotFoundException ex){
........
}

这样我不知道会抛出什么类型的异常。

2)如何决定代码的哪一部分在try块内。如果我将整个代码放在“try”中并转过脸,会不会很糟糕。

3)如果我必须具体说明 catch 块,那么我怎么知道可以抛出什么类型的异常?

4

5 回答 5

1

这是一个糟糕的变体。一个例子:

socket.send(data); // sending data via socket. This may cause IOException

但也可以有另一个Exception,例如NullPointerException。如果您将捕获所有异常,则将更难发现错误:

Socket socket = null;
socket.send(data); // sending data via socket. This will cause NullPointerException

在此示例中,您会看到您将拥有一个NullPointerException,但您会认为这是一个IOException

最好的变体是:

try {
    Socket socket = null;
    socket.send(data);
} catch(IOException ex) {
    ex.printStackTrace();
} catch(NullPointerException ex) {
    ex.printStackTrace();
}
// or in java 7 you can write catch(IOException | NullPointerException ex)

如果你想捕获一些异常,或者如果没有,就不要写第二个catchnull,你会发现你所有的错误,这是不必要的。

对不起我的英语不好

于 2012-06-16T14:12:30.733 回答
1
  1. 如果可以的话,而不是更具体的东西是更好的选择
  2. 如果您将整个代码放在“尝试”中,则您不能针对异常,甚至您的处理(应该如何处理异常)也会受到限制

正如我所说,如果可以的话,而不是更具体的东西是更好的选择,但如果你不确定,那么可以使用这种方式

try{............
}catch(FileNotFoundException ex){
........
}catch(Exception ex){
........
}

意味着一般要求应该排在最后。

于 2012-06-16T14:12:48.827 回答
0

Java有两种异常

1已检查异常

2未经检查的异常

所以你的问题是How to decide what part of code be inside try block.

Java 强制您在 try 块中编写代码块,这可能会导致第一种异常。

您可以写信e.printStackTrace();以了解有关导致异常的原因的详细信息。

于 2012-06-16T14:13:14.733 回答
0

答案是......这取决于

如果您希望您的应用程序针对不同的异常类型表现出不同的行为,那么您的try块应该很短,并且您应该分别捕获异常。

但是,如果您决定应以通用方式处理代码故障,则可以在一个catch块中捕获所有异常,例如,执行以下操作:

try {

    // large block of code, throwing lots of exceptions

} catch (Throwable t) {

    // This way you, and your admin will know what really happened.
    logger.log(Level.SEVERE, "Error in my awesome block of code", t);


    // This way you're hiding error details from your users
    someGUI.showErrorMessage("Unexpected error during processing. Contact your local IT");
}

在现实生活中,这通常比这更复杂,您应该决定单独处理哪些错误,以及以单一、通用的方式处理哪些错误。

于 2012-06-16T14:15:43.397 回答
-1

1) 使用 try{..}catch(Exception e) {..} 使您的代码更加紧凑,并且能够在一个地方管理异常。您还可以连接 catch 块以管理多种类型的异常:

try {
    ..
} catch(FileNotFoundException fe) {
    //manage here this kind of exception
} catch(NullPointerException ne) {
    //you missed a check on nulls! But the file has been found...
} catch(Exception e) {
    //file has been found and no nulls are left...
}

请注意,块的顺序是相关的:在示例中,如果同时存在 FileNotFoundException 和 NullPointerException,您将在 FileNotFoundException catch 块中被重定向。

2)try-catch 块显然会对代码的性能产生影响,所以我认为您只需要放置以下代码: - 不受您控制(例如第三方库等) - 使用不可靠的媒体(例如套接字连接、文件 IO 等) - 利用异常处理来指示特定行为(例如 GoogleAppEngine 超时异常等)

于 2012-06-16T14:20:08.120 回答