2017-04-05 61 views
0

我有一个关于java.lang.Exception的问题以及它在throw/throws子句中的考虑方式。异常 - 已选中或未选中的异常类型

我有以下2个例子,我不明白如何处理java.lang.Exception:作为选中或未选中的异常。

下面的方法成功编译:

public double method1() throws Exception { 
    return 0.7; 
} 
  • 在这里,在我看来,该java.lang.Exception的是威胁 了java.lang.RuntimeExceptionjava.lang.Error的。即使你没有处理它,你也可以声明抛出它。
  • 如果不是异常,我们使用了一个检查的异常(这是java.lang.Exception的子类),那么你应该必须在方法体内有一个throw声明(或者调用抛出的方法那个检查异常)。对?

以下不会编译:

private void method2(int age) { 
    if (age > 30) 
     throw new Exception(); 
} 
  • 这里是我的困惑......如果它被扔类型了java.lang.RuntimeExceptionjava.lang中的子类。它会编译错误
  • 为什么在这种情况下它不能编译?我想这是因为它威胁java.lang.Exception作为检查的异常。但如果是这样,那么为什么method1会编译?

谢谢 路易莎

+0

可能重复[Java:checked vs unchecked exception explanation](http://stackoverflow.com/questions/6115896/java-checked-vs-unchecked-exception-explanation) – Burkhard

回答

1

如果它被扔类型了java.lang.RuntimeException或 的子类java.lang.Error的会编过?

是,RuntimeException是未经检查的异常(或Error),所以你不需要声明它的方法签名或catch它明确。就像例如NullPointerException一样,你不能分辨出Runtime中的代码何时会发生(也就是说,因为哪个问题,所以你不需要在代码中的任何地方明确地处理它),如果它由于任何原因在运行时发生,您将看到异常堆栈跟踪。

但是,有一点是,你可以catch(如果你想)RuntimeException(使用catch),并处理它,如果你想以不同的方式在提高该异常处理的事情,你可以看看下面这一点。

try { 
    //some code 
} catch(ArithmeticException exe) { 
    //handle it and you can do things differently how you like 
} 

而且,即使对于throws也适用同样的规则,即,如果你想,你可以在方法签名上指定throwsArithmeticException(或任何RuntimeException),但它对调用者没有任何区别,相反它会混乱代码,这不是最佳实践,你可以看看here就可以了。而当你在方法中指定了throws caluse时,检查异常,则调用者被迫处理它,即调用者方法必须使用catch块或throw再次明确处理它。

为什么在这种情况下它不能编译?我想这是因为它威胁 java.lang.Exception作为检查的异常。但如果是这样的话,为什么 method1会编译?

有,有两个规则来处理检查异常:

(1)catch它使用catch

(2)或从方法throw它(使用throws方法内在方法签名中)

即,如果您的代码块throws选中了exeption,那么无论您是需要在该方法内部捕获它还是该方法需要显式声明第在它抛出Exception

0

的方法必须是这样的编译:

private void method2(int age) throws Exception 
{ 
    if (age > 30) 
     throw new Exception(); 
} 

然而,检查型异常是能够作用于该异常,做一些有意义的事情,如释放资源等办法,你就会知道只有在抛出Exception的实际子类时,该如何处理该异常。

0

在方法2.你错过new关键字在行

throw Exception(); 

Java中的所有检查的异常必须throws声明中声明,并且选中可以不申报。

检查异常是从java.lang.Excetion类继承的异常。但未检查的异常继承java.lang.RuntimeException类。

0

抛出子句中用于声明异常和thow关键字用于显式抛出异常。 所以,当你写

private void method2(int age) { 
    if (age > 30) 
     throw Exception(); 
} 

你被明确,但没有引发异常声明,该方法可以使用throws条款抛出此异常。

所以正确的代码将

private void method2(int age) throws Exception { 
if (age > 30) 
    throw new Exception(); 
    } 
+0

除了不正确的扔或抓住' Exception'。这是允许的,但不正确。 –

1

在这里,在我看来,该java.lang.Exception的是威胁到了java.lang.RuntimeException或java.lang.Error的。即使你没有处理它,你也可以声明抛出它。

如果不是Exception,我们使用一个检查的异常(即java.lang的子类。例外),那么你应该必须在方法体内有一个throw声明(或者调用一个引发检查异常的方法)。对?

不可以。你可以声明你抛出任何异常(选中或不选中)而不抛出任何异常。

例如,当在子类中重写方法并且希望子类能够抛出检查的异常时,这是有意义的。覆盖方法只能抛出父类声明的检查异常。

2

在第一1)的方法,

public double method1() throws Exception 
{ 
    return 0.7; 
} 

您正在传播异常 [即检查异常]到调用方法,这就是为什么你没有看到编译时异常。 让我告诉你一些东西,可以让你更好地理解,

public void call() { 
    method1(); // Because method1() is propagating compile time exception you must need to handle it here. 
    } 

    public double method1() throws Exception { 
    return 0.7; 
    } 

在上面的代码中,()调用你会得到编译时异常。

在第二种方法2)

private void method2(int age) { 
    if (age > 30) 
     throw new Exception(); //I am assuming you forgot to mention new in your code. 
} 

你扔检查的异常,所以你必须要处理它。 相反,如果您将Exception()更改为RuntimeException,以免在编译时看到错误。如下图所示,

private void method2(int age) { 
     if (age > 30) 
      throw new RuntimeException(); // you will not get compile time error. 
    } 

了解更多详情, http://technostepup.com/CoreJava/ExceptionHandling/exception-types.php

0

在你的第一个例子,如果你调用一个方法,你必须处理它引发异常,因为它是一个检查一个。如果该方法抛出未经检查的异常,则不需要处理它。

你的第二个例子不会编译,因为你试图抛出Exception。你必须抛弃它的一个实例。如果在该代码中,您只是将Exception更改为RuntimeExceptionError或它们的子类,它仍然不会编译,出于同样的原因。

相关问题