使用try-catch-java
因此,我刚刚了解了Java中try-catch语句的基本知识,对于语法中的一些差异,我仍然有点困惑 下面是我试图分析和理解的代码。使用使用try-catch-java,java,try-catch,Java,Try Catch,因此,我刚刚了解了Java中try-catch语句的基本知识,对于语法中的一些差异,我仍然有点困惑 下面是我试图分析和理解的代码。使用try然后使用catch(异常e)与只说抛出或抛出新的有什么区别 根据我的理解,try和catch基本上是一种通过输出消息或传递到另一个方法来处理错误的方法。然而,我想我还是停留在语法方面 任何有建设性的意见或简单的例子,澄清这个概念,以及如何与我的书中的样本代码进行将不胜感激 /* Invalid radius class that contains error
try
然后使用catch(异常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;
}
}
解释
从:
[try块]包含一个或多个合法文件
可能引发异常的代码行。(渔获量最终
在接下来的两个小节中对块进行了说明。)
异常是一种特殊类型的对象。编写newexception()
时,您正在创建一个新的异常对象。编写throw new Exception()
时,您正在创建一个新错误,然后将其抛出到最近的try-catch块,中止其余代码
当抛出异常时,它会被嵌套在中的try-catch块捕获(在内部)。也就是说,假设为该异常注册了正确的catch块。如果代码没有包装在try-catch块中,则带有的程序会在抛出错误时自动关闭。对任何可能引发错误的代码或方法使用try-catch,特别是由于用户输入(在合理范围内)而导致的错误
某些异常必须捕获,其他异常是可选的
当您将抛出
添加到方法签名时,您向其他方法宣布,如果调用该方法,则可能抛出选中的异常(不必取消选中)。注意它是如何抛出的
而不是抛出的
。它不是在做动作,而是在描述它有时会做动作
当您不希望捕获该方法内部的错误,但希望允许调用您的方法的方法本身捕获错误时,可以使用此功能
异常是使程序对意外或无效情况作出一致响应的一种方法,在需要用户输入时特别有用,但在其他情况下(如文件输入/输出)也很有用
例子
在这里,CircleWithException()
有可能引发InvalidRadiuseException(推测,this(1.0)有时会引发InvalidRadiuseException)
调用此方法的代码应具有:
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
}
正如我之前所说,异常只是扩展异常的特定类型的对象
/* 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标准库中有许多预定义的异常,但通常需要创建自己的异常
要引发此异常,请首先创建InvalidRadiuseException对象,然后引发它:
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
,但您可以更改此设置
记住这取决于类的实现以及您希望它们如何工作。如果您不希望构造函数处理此异常,可以抛出它(正如您已经在做的那样)并在其他方法中处理它。“抛出”“是一个方法将抛出某些异常的声明。这是由java编译器对检查的异常强制执行的,而不是错误或未检查的异常
“throw new”是java中的两个关键字,因此我们可以将其分解
- “throw”是引发异常的运算符
- “new”是创建对象新实例的操作符
try块中还有“finally”子句,它允许您执行清理或在try块之后必须执行的任何其他方法,无论是否发生异常。有两种类型的异常 1) 未经检查。它们是由
Error
和RuntimeException
类及其所有子类定义的。Java不会强迫您以任何方式处理这些异常
2) 检查过了。这些被定义为可丢弃的
类及其所有不属于(1)中定义的类别的子类。Java强制您通过try/catch来处理这些异常。如果您调用的方法可以在try块之外抛出这样一个异常(用throws
关键字定义),那么您的代码将无法编译
抛出
:这是一种声明方法可能抛出必须通过try/catch捕获的异常的方法。前
public CircleWithException(double newRadius) throws InvalidRadiusException {
try {
setRadius(newRadius);
numberOfObjects++;
} catch (InvalidRadiusException e) {
setRadius(0); // for example
}
}
public void doSomething() throws MyException { ... }
try {
doSomething();
} catch (MyException exception) {
exception.printStackTrace();
}
MyResource myResource = getMyResource();
try {
myResource.open();
doStuffWithMyResource(myResource);
} catch (Exception exception) {
exception.printStackTrace();
} finally {
if (myResource.isOpen()) {
myResource.close();
}
}