当前位置: 首页 > 知识库问答 >
问题:

异常处理:Java中投掷与投掷的区别

诸葛卜霸
2023-03-14

有人可以解释我什么时候使用关键字 throw new 有用.而不是在方法的签名旁边使用抛出?

我知道当方法抛出Checked Exception时。Java迫使我们通过将Exception处理到try-catch块中,或者通过在签名旁边的关键字throws指定将在其他地方完成,从而直接在方法中处理它。

然而,我很难理解何时使用关键字throw new是有用的,以及为什么。它与处理未选中的异常有关吗?

例如在此示例中。为什么我们不在方法计算中抛出新的 ArithmeticException()?由于算术异常是一个未经检查的异常?我们不应该添加类似的东西吗:

private static int compute(int i) { 
    if(i == 0) {
        throw new ArithmeticException();
    }
    return 1/i; 
}

.

public class Main {
  public static void main(String[] args) {
     for (int i = -2; i < 2; i++) { 
        try { 
           System.out.println(i+" -> "+compute(i)); 
        
        } catch (ArithmeticException e) {
             System.out.println(i+" -> undefined")
        }
     }
  }

   
 private static int compute(int i) { 
      return 1/i; 
  }

}

共有1个答案

封飞
2023-03-14

< code>throws告诉其他人这个方法可以抛出异常。就当是文档吧。被检查的异常必须是方法签名的一部分。

< code>throw实际上会抛出异常。(< code >抛出新的异常();首先创建一个新的异常实例,然后引发该实例。您可以使用两个单独的语句:< code > Exception ex = new Exception();扔ex;)您可以使用< code>throw关键字引发已检查和未检查的异常。

void checked() throws Exception { // required, Exception is a checked exception
  throw new Exception();
}

void unchecked() {
  throw new RuntimeException(); // throws not required, RuntimeException is not checked
}

void checkedCall() throws Exception {
  checked(); // throws required, because "checked" can throw a checked exception
}

void caught() {
  try {
    checked();
  } catch (final Exception ex) {
    // throws is no longer required, because the (checked) exception is handled within the method itself. It never leaves the method.
  }
}

关于您更新的问题:您没有< code >抛出新的ArithmeticException,因为它是由JVM在尝试应用< code>/操作符时抛出的。如果你愿意,可以手动抛出,但那只是多余的代码

 类似资料:
  • 无法弄清楚这是怎么回事-试图设置一个路由,只看到cxf连接到soap web服务(我不关心实际数据,也不期望数据实际“工作”,但它不断引发一个我不理解的异常: 我想知道我是否正确配置了它。我想这可能是一个丢失的jar,但当我尝试引入其他jar时,导致了依赖冲突 我正在使用maven依赖项“camel-cxf”来加载我所有的jar配置 “原因:org.apache.cxf.bus.extension

  • 当变量d1和d2不是正确的数据类型时,我总是得到默认的NumberFormatExctive消息。 当使用throw语句条件捕捉到这些异常时,我想打印自定义异常消息。 } 这是输入值格式不正确时打印的消息示例。 输入一个数值:$Exception in thread“main”java。lang.NumberFormatException:用于java的输入字符串:“$”。base/jdk。内部的

  • 我在视图中有一个ImageView,并尝试用它显示一个WritableImage实例。我正在外线程中绘制它,并通过侦听ObjectProperty的更改事件将其传递给视图。 imageView应该准备好接收图像,它由我的主视图显示。但是这是一个不合法的例外 线程“Thread-4”Java . lang . illegalstateexception中的异常:不在FX应用程序线程上;当前线程=线程

  • 我正在用python运行下面的代码 我每次都会遇到下面的错误-有人能帮忙吗! OpenCV错误:未指定的错误(该函数未实现。使用Windows、GTK 2.x或Carbon支持重建库。如果您在Ubuntu或Debian上,请安装libgtk2.0-dev和pkg config,然后重新运行cmake或configure脚本),位于cvShowImage、file/Users/travis/buil

  • 我有两个类(SimManager和Sim),我想为它们创建模拟对象,然后使用存根方法。 测试在上面第9行抛出这两个错误跟踪。 第一: Java语言lang.VerifyError:org/mockito/cglib/core/reflectils at org。莫基托。cglib。果心KeyFactory$发电机。在org上生成Class(KeyFactory.java:167)。莫基托。cgli

  • 我有下面的代码,它按照预期工作: 我想知道是否有一种方法,只有一个orElseThrow-Part,或做它更少的冗余?