所以刚刚介绍了java中try-catch语句的基础知识。我仍然对语法中的一些差异感到困惑。这是我试图分析和理解的代码。另外,使用try then 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;
}
}
答案 0 :(得分:8)
[尝试块]包含一个或多个合法 可以抛出异常的代码行。 (抓住了,最后 在接下来的两个小节中解释了这些块。)
异常是一种特殊的对象。当您编写new Exception()
时,您正在创建一个新的异常对象。当您编写throw new Exception()
时,您正在创建一个新错误,然后将其抛给最近的try-catch块,中止其余的代码。
当您抛出异常时,它会被嵌入的try-catch块抓住(内部) )。也就是说,假设注册了该异常的正确catch块。如果代码没有包装在try-catch块中,则程序会在抛出错误时自动关闭。在任何可能引发错误的代码或方法周围使用try-catch,尤其是因为用户输入(在合理范围内)。
必须捕获一些例外,其他例外是可选的。 (checked vs. unchecked).
当您向方法签名添加throws
时,您会向其他方法宣布,如果他们调用该方法,则可能会抛出已检查异常(未选中则无需)。请注意throws
throw
不是public CircleWithException() throws InvalidRadiusException {
this(1.0);
}
。它没有采取行动,它描述了它有时会采取行动。
如果您不想捕获该方法中的错误,但希望允许调用方法的方法自行捕获错误,则可以使用此功能。
异常是一种让程序对意外或无效情况做出一致反应的方法,在需要用户输入时特别有用,尽管它在其他情况下也很有用,例如文件输入/输出。
CircleWithException()
这里,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
}
有可能抛出InvalidRadiusException(可能,这个(1.0)有时会抛出InvalidRadiusException。)
调用此方法的代码应该具有:
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;
}
}
throw new InvalidRadiusException(1.0);
上面的代码定义了一种特定于您的程序/应用程序的新类型的Exception。 Java标准库中有许多预定义的异常,但通常需要创建自己的异常。
要抛出此异常,首先要创建一个InvalidRadiusException对象,然后抛出它:
{{1}}
答案 1 :(得分:3)
如果您无法(或者它不方便)处理方法内的异常,您可以声明一种抛出异常的方法
在您的情况下,您在构造函数中调用方法setRadius
。如果您认为在构造函数中处理异常(由setRadius
抛出)很方便,则可以使用try-catch
子句:
public CircleWithException(double newRadius) throws InvalidRadiusException {
try {
setRadius(newRadius);
numberOfObjects++;
} catch (InvalidRadiusException e) {
setRadius(0); // for example
}
}
catch
块包含抛出异常时要执行的操作。在这种情况下,我将半径设置为0
,但您可以更改此值。
请记住它取决于您的类实现以及您希望它们如何工作。如果您不希望构造函数处理此异常,您可以抛出它(正如您已经在做的那样)并在其他方法中处理它。
答案 2 :(得分:2)
"的引发强>"是声明方法将抛出某些异常。这是由java编译器强制执行的已检查异常,而不是错误或未经检查的异常。
" 抛出新的" java中有两个关键字,所以我们可以将其分解......
" 尝试" block允许你执行声明它们抛出异常的方法,这就是你使用" catch"条款,以捕获那些抛出的异常。
此外,还有 try-with-resources 块,您可以使用try块操作实现 AutoCloseable 的可消耗资源(例如,流) ,然后关闭它。
还有" 终于" 尝试块的子句,允许您执行清理或在尝试块之后必须执行的任何其他方法,无论是否发生异常。
答案 3 :(得分:2)
有两种类型的例外
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
块。实际上,即使您在return
或try
内进行了catch
,也会调用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();
}
}