使用try-catch java

所以,进入java中try-catch语句的基础知识。 我仍然对语法中的一些差异感到困惑。 这是我试图分析和理解的代码。 另外,使用try then catch(Exception e)与说只是抛出…或者抛出new之间的区别是什么…从我的理解,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 block]包含一个或多个可能引发exception的合法代码行。 (catch和finally块将在接下来的两个小节中解释。)

exception是一种特殊的对象 。 编写new Exception() ,您将创建一个新的exception对象。 当您编写throw new Exception()您正在创建一个新错误,然后将其抛出到最近的try-catch块,中止其余的代码。

抛出exception时,它会嵌套在 (内部) 的try-catch块捕获 。 也就是说,假设注册了该exception的正确catch块。 如果代码未包装在try-catch块中,则程序会在抛出错误时自动关闭。 在任何可能引发错误的代码或方法周围使用try-catch,尤其是因为用户输入(在合理范围内)。

必须捕获一些例外,其他例外是​​可选的。 (选中与未选中)。

当你向方法签名添加throws ,你会向其他方法宣布,如果他们调用该方法,它有可能抛出一个已检查的exception(没有必要取消选中)。 请注意它是如何throw 。 它没有做一个动作,它描述它有时会做一个动作。

当您不想捕获该方法中的错误但希望允许调用方法的方法自己捕获错误时,可以使用此function。

exception是一种使程序对意外或无效情况一致响应的方法,在需要用户输入时特别有用,尽管它在其他情况下也很有用,例如文件输入/输出。

例子

 public CircleWithException() throws InvalidRadiusException { this(1.0); } 

这里, CircleWithException()有可能抛出InvalidRadiusException(可能,这个(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只是一种扩展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; } } 

上面的代码定义了一种特定于程序/应用程序的新类型的Exception。 Java标准库中有许多预定义的exception,但通常需要创建自己的exception。

要抛出此exception,首先要创建一个InvalidRadiusException对象,然后抛出它:

 throw new InvalidRadiusException(1.0); 

如果你不能 (或者不方便)处理方法内的exception,你可以声明一个抛出exception的方法。

在您的情况下,您在构造函数中调用方法setRadius 。 如果您认为在构造函数中处理exception(由setRadius抛出)很方便,则可以使用try-catch子句:

 public CircleWithException(double newRadius) throws InvalidRadiusException { try { setRadius(newRadius); numberOfObjects++; } catch (InvalidRadiusException e) { setRadius(0); // for example } } 

catch块包含抛出exception时要执行的操作。 在这种情况下,我将半径设置为0 ,但您可以更改此值。

请记住 ,这取决于您的类实现以及您希望它们如何工作。 如果您不希望构造函数处理此exception,您可以抛出它(就像您已经在做的那样)并在其他方法中处理它。

throws ”是一个声明,方法会抛出某些exception。 这是由java编译器强制执行的已检查exception,而不是错误或未经检查的exception。

throw new ”是java中的两个关键字,所以我们可以将其分解……

  • throw ”是抛出exception的运算符
  • new ”是一个创建对象新实例的运算符

try ”块允许您执行声明它们抛出exception的方法,这是您使用“catch”子句的地方,以便捕获那些抛出的exception。

此外,还有try-with-resources块,您可以使用try块对可实现AutoCloseable的可消耗资源(例如,流)进行操作,然后关闭它。

try块中还有“ finally ”子句,它允许您执行清理或在try块之后必须执行的任何其他方法,无论是否发生exception。

有两种类型的例外

1)未选中。 它们由ErrorRuntimeException类及其所有子类定义。 Java不会强迫您以任何方式处理这些exception。

2)检查。 它们被定义为Throwable类及其所有子类,它们不属于(1)中定义的类别。 Java强制您使用try / catch处理这些exception。 如果在try块之外调用可以抛出此类exception(使用throws关键字定义)的方法,则代码将无法编译。

throws :这是一种声明方法可能抛出必须使用try / catch捕获的exception的方法。 例如

 public void doSomething() throws MyException { ... } 

是一个方法的声明,可能会抛出MyException的实例。

try / catch / finally :这是一种处理某种代码可能产生的exception的方法。 你试图运行的cody进入try块,error handling代码进入catch块。 无论是否抛出exception,都会执行可选的finally块。 实际上,即使你在trycatch 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(); } }