[英]Using try-catch java
所以剛剛進入 Java 中 try-catch 語句的基礎知識,我仍然對語法中的一些差異感到有些困惑。
這是我試圖分析和理解的代碼。 與只說throws
或throw new
相比,使用try
then catch(Exception e)
什么區別?
根據我的理解, try
和catch
基本上是一種通過輸出消息或傳遞給另一個方法來處理錯誤的方法。 但是,我認為我被困在它的語法方面。
任何澄清此概念的建設性評論或簡單示例以及我書中的示例代碼都將不勝感激。
/* Invalid radius class that contains error code */
public class InvalidRadiusException extends Exception {
private double radius;
/** Construct an exception */
public InvalidRadiusException(double radius) {
super("Invalid radius " + radius);
this.radius = radius;
}
/** Return the radius */
public double getRadius() {
return radius;
}
}
public class CircleWithException {
/** The radius of the circle */
private double radius;
/** The number of the objects created */
private static int numberOfObjects = 0;
/** Construct a circle with radius 1 */
public CircleWithException() throws InvalidRadiusException {
this(1.0);
}
/** Construct a circle with a specified radius */
public CircleWithException(double newRadius) throws InvalidRadiusException {
setRadius(newRadius);
numberOfObjects++;
}
/** Return radius */
public double getRadius() {
return radius;
}
/** Set a new radius */
public void setRadius(double newRadius)
throws InvalidRadiusException {
if (newRadius >= 0)
radius = newRadius;
else
throw new InvalidRadiusException(newRadius);
}
/** Return numberOfObjects */
public static int getNumberOfObjects() {
return numberOfObjects;
}
/** Return the area of this circle */
public double findArea() {
return radius * radius * 3.14159;
}
}
從Java 文檔:
[ try塊] 包含一個或多個可能引發異常的合法代碼行。 (catch 和 finally 塊將在接下來的兩個小節中解釋。)
一個例外是一種特殊的對象。 當您編寫new Exception()
,您正在創建一個新的異常對象。 當您編寫throw new Exception()
您正在創建一個新錯誤,然后將其拋出到最近的 try-catch 塊,從而中止其余代碼。
當您拋出異常時,它會被它嵌套在(內部)的 try-catch 塊捕獲。 也就是說,假設注冊了該異常的正確 catch 塊。 如果代碼未包含在 try-catch 塊中,則程序會在拋出錯誤后立即自動關閉。 在任何可能引發錯誤的代碼或方法周圍使用 try-catch,尤其是由於用戶輸入(在合理范圍內)。
一些異常必須被捕獲,其他異常是可選的。 (選中與未選中)。
當您向方法簽名中添加throws
,您向其他方法宣布,如果他們調用該方法,則有可能拋出已檢查的異常(對於未檢查的異常則沒有必要)。 注意它是如何throws
而不是throw
。 它不是在做一個動作,而是在描述它有時會做一個動作。
當您不想捕獲該方法中的錯誤,但希望允許調用您的方法的方法本身捕獲錯誤時,您可以使用此功能。
異常是一種使您的程序對意外或無效情況做出一致響應的方法,在需要用戶輸入時特別有用,盡管它在其他情況下也很有用,例如文件輸入/輸出。
public CircleWithException() throws InvalidRadiusException {
this(1.0);
}
在這里, CircleWithException()
有可能拋出 InvalidRadiusException (大概,this(1.0) 有時會拋出 InvalidRadiusException。)
調用此方法的代碼應具有:
try {
new CircleWithException(); // This calls the method above
} catch (InvalidRadiusException e) { // The object "e" is the exception object that was thrown.
// this is where you handle it if an error occurs
}
正如我之前所說,異常只是擴展Exception
的特定類型的對象
/* Invalid radius class that contains error code */
public class InvalidRadiusException extends Exception {
private double radius;
/** Construct an exception */
public InvalidRadiusException(double radius) {
super("Invalid radius " + radius);
this.radius = radius;
}
/** Return the radius */
public double getRadius() {
return radius;
}
}
上面的代碼定義了一種特定於您的程序/應用程序的新型異常。 Java 標准庫中有許多預定義的異常,但通常您需要創建自己的異常。
要拋出這個異常,你首先創建一個 InvalidRadiusException 對象,然后拋出它:
throw new InvalidRadiusException(1.0);
如果您不能(或不方便)處理方法內部的異常,您可以聲明一個方法來拋出異常。
在您的情況下,您正在調用構造函數中的setRadius
方法。 如果您認為在構造函數中處理異常(由setRadius
拋出)很方便,您可以使用try-catch
子句:
public CircleWithException(double newRadius) throws InvalidRadiusException {
try {
setRadius(newRadius);
numberOfObjects++;
} catch (InvalidRadiusException e) {
setRadius(0); // for example
}
}
如果拋出異常, catch
塊包含您想要執行的操作。 在這種情況下,我將半徑設置為0
,但您可以更改它。
請記住,這取決於您的類實現以及您希望它們如何工作。 如果您不希望構造函數處理此異常,您可以拋出它(正如您已經在做的那樣)並在其他方法中處理它。
“ throws ”是一個方法將拋出某些異常的聲明。 這是由 Java 編譯器針對已檢查異常強制執行的,而不是針對錯誤或未檢查異常強制執行的。
“ throw new ”是Java中的兩個關鍵字,因此我們可以將其分解...
“ try ”塊允許您執行聲明它們拋出異常的方法,這就是您使用“catch”子句的地方,以捕獲那些拋出的異常。
此外,還有try-with-resources塊,您可以在其中使用 try 塊對實現AutoCloseable的可消耗資源(例如流)進行操作,然后關閉它。
try塊還有一個“ finally ”子句,它允許您執行清理或任何其他必須在try塊之后執行的方法,無論是否發生異常。
有兩種類型的異常
1) 未選中。 它們由Error
和RuntimeException
類及其所有子類定義。 Java 不會強制您以任何方式處理這些異常。
2)檢查。 這些被定義為Throwable
類及其所有不屬於 (1) 中定義的類別的子類。 Java 強制您使用 try/catch 處理這些異常。 如果您在 try 塊之外調用可以拋出此類異常(使用throws
關鍵字定義)的方法,您的代碼將無法編譯。
throws
:這是一種聲明方法可能會拋出必須用 try/catch 捕獲的異常的方法。 例如
public void doSomething() throws MyException { ... }
是可能拋出MyException
實例的方法的聲明。
try
/ catch
/ finally
:這是一種處理可能由某種代碼產生的異常的方法。 您嘗試運行的 cody 進入try
塊,錯誤處理代碼進入catch
塊。 可選的finally
塊是無論是否拋出異常都會執行的塊。 實際上,即使您在try
或catch
執行return
也會調用 finally 塊。 例如
try {
doSomething();
} catch (MyException exception) {
exception.printStackTrace();
}
或使用finally
的示例:
MyResource myResource = getMyResource();
try {
myResource.open();
doStuffWithMyResource(myResource);
} catch (Exception exception) {
exception.printStackTrace();
} finally {
if (myResource.isOpen()) {
myResource.close();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.