2015-06-30 42 views
1

这是为什么?此代码编译正常,但在运行时抛出在JAVA中的异常处理和抛出语句的使用

public class Except 
{ 
    public static void main(String args[]) 
    { 
     System.out.println("Hey, I am under main"); 
     method(); 
    } 
    static void method() 
    { 
     throw new NullPointerException(); 
    } 
} 

异常但这个代码不编译

public class Expect 
{ 
    public static void main(String args[]) 
    { 
     System.out.println("Hey, I am under main"); 
     method(); 
    } 
    static void method() 
    { 
     throw new IllegalAccessException(); 
    } 
} 

为什么会是这样?那变化异常的类型,第二个代码不编译。有人请解释,并且我已经在第一个代码中使用了throw语句,并且由于它的编译正确,那么使用方法声明来写入throws语句有什么用处。 我使用JDK 1.8.0_45

回答

6

NullPointerException是一个子类的RuntimeException,这使得它未经检查的异常,它没有在throws条款进行处理或声明。

IllegalAccessException是一个检查异常,所以它必须被捕获或在任何可能抛出它的方法的throws子句中声明。如果添加了一个throws子句

第二个片段将编译:

static void method() throws IllegalAccessException 
{ 
    throw new IllegalAccessException(); 
} 
+0

,IOException是否发生? –

+1

@RajMalhotra检查[此链接](https://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html)。您将找到所有类,它们(直接)从'RuntimeException'继承。 – Turing85

+1

@RajMalhotra yes,IOException也是一个检查异常,就像异常的任何子类不是RuntimeException的子类一样。 – Eran

1
  1. 经过例外必须明确捕获或传播中的try-catch异常处理说明。 未检查异常不必被捕获或声明抛出。

  2. 检查 Java中的异常扩展了java.lang.Exception类。 未检查异常扩展java.lang.RuntimeException。

unchecked异常列表:

ArrayIndexOutOfBoundsException 
ClassCastException 
IllegalArgumentException 
IllegalStateException 
NullPointerException 
NumberFormatException 
AssertionError 
ExceptionInInitializerError 
StackOverflowError 
NoClassDefFoundError 

经过例外列表:

Exception 
IOException 
FileNotFoundException 
ParseException 
ClassNotFoundException 
CloneNotSupportedException 
InstantiationException 
InterruptedException  
NoSuchMethodException 
NoSuchFieldException 
1

我想补充我的两分钱的检查,检查异常的区别,从用户的观点。

想象一个简单的应用程序,其中用户注册到提供姓名,姓氏和电话号码的系统。

让我们先看看检查的例外。如果用户输入名称字段12312312,应用程序应该抛出一个检查的异常。类似地,如果用户输入angelo作为电话号码,应用程序应该再次抛出一个检查的异常。因为12312312既不是一个有效的名字,也不是一个电话号码。在这种情况下我们使用检查的异常。因为它基本上是一个用户错误和正确的反馈,用户可以纠正这种错误。

在另一方面,unchecked异常没有用户异常。对于这种情况,用户根本无所作为。例如,连接到数据库可能会丢失。或者当开发人员为上述示例创建数据库字段时,他可能会将数据库中的名称字段定义为布尔字段。 (我在这里夸大了一点)。

我希望这也有帮助。

相关问题