[英]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.