Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用try-catch-java_Java_Try Catch - Fatal编程技术网

使用try-catch-java

使用try-catch-java,java,try-catch,Java,Try Catch,因此,我刚刚了解了Java中try-catch语句的基本知识,对于语法中的一些差异,我仍然有点困惑 下面是我试图分析和理解的代码。使用try然后使用catch(异常e)与只说抛出或抛出新的有什么区别 根据我的理解,try和catch基本上是一种通过输出消息或传递到另一个方法来处理错误的方法。然而,我想我还是停留在语法方面 任何有建设性的意见或简单的例子,澄清这个概念,以及如何与我的书中的样本代码进行将不胜感激 /* Invalid radius class that contains error

因此,我刚刚了解了Java中try-catch语句的基本知识,对于语法中的一些差异,我仍然有点困惑

下面是我试图分析和理解的代码。使用
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”块允许您执行声明抛出异常的方法,这就是使用“catch”子句捕获抛出异常的地方

此外,还有try with resources块,您可以使用try块对实现自动关闭的可消费资源(例如流)进行操作,然后将其关闭


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();
    }
}