簡體   English   中英

嘗試捕獲for循環

[英]try-catch in for loop

我遇到了一些我今天無法向自己解釋的事情。 編寫在線程序可以在某些測試上運行,這是在線資源上的一項小任務。 您能否解釋一下兩種方法之間的區別,以及為什么其中一種方法在某些測試中失敗(我沒有這些方法)?

該任務是編寫一個靜態方法來打開一個連接,然后嘗試通過調用其方法3次來對該連接進行一些抽象的處理。 問題是您使用的任何方法都可能引發異常(開放連接和連接方法)。 您必須嘗試正確執行3次操作(如果所有嘗試均失敗-引發異常),並且另一個條件是必須關閉每個打開的連接。

名為RobotConnection的連接類,它實現AutoCloseable 此類具有方法void moveRobotTo(int x, int y) (這是任務中的“填充方法”)。 您只能通過調用RobotConnectionManager.getConnection()來獲取RobotConnection實例。 這些類的方法可以拋出RobotConnectionException extends RuntimeException

所以這里出現了真正的問題:

這段代碼失敗了(不知道為什么,大概是無限循環):

public static void moveRobot(RobotConnectionManager robotConnectionManager, int toX, int toY) {
    boolean success = false;
    for (int i = 0; !success && (i < 3); ++i) {
        try (RobotConnection connection = robotConnectionManager.getConnection()) {
            connection.moveRobotTo(toX, toY);
            success = true;
        }
    }
    if (!success) {
        throw new RobotConnectionException("3 attempts failed");
    }
}   

並且這個被認為是可行的(我看不出真正的區別=()

public static void moveRobot(RobotConnectionManager robotConnectionManager, int toX, int toY) {
    boolean success = false;
    for (int i = 0; !success && (i < 3); ++i) {
        try (RobotConnection connection = robotConnectionManager.getConnection()) {
            connection.moveRobotTo(toX, toY);
            success = true;
        } catch (RobotConnectionException e) {}
    }
    if (!success) {
        throw new RobotConnectionException("3 attempts failed");
    }
}

在第一種方法中,您不會捕獲RobotConnectionException 因此,它最多只能失敗一次,而不是要求的准確次數是3次

區別在於,在第一種情況下,您說“打開並清理連接,但我不知道如何處理異常:讓它們沿調用鏈傳播到可以處理的異常”:

try (RobotConnection connection = robotConnectionManager.getConnection()) {
  // ...
}

而在第二種情況下,您說“打開並清理連接,但是如果發生異常,我將自己處理;將采取的措施是不執行任何操作”:

try (RobotConnection connection = robotConnectionManager.getConnection()) {
  // ...
} catch (RobotConnectionException e) {}

如果在第一個代碼段中引發了RobotConnectionException,則它可能來自try語句內部。 由於您沒有抓住它,因此您無需進行三次嘗試。

有關Java異常的更多信息: http : //docs.oracle.com/javase/tutorial/essential/exceptions/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM