JAVA中的异常处理和throws语句的使用

JAVA中的异常处理和throws语句的使用,java,exception,exception-handling,try-catch,Java,Exception,Exception Handling,Try Catch,为什么会这样?此代码编译良好,但在运行时引发异常 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 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.045

是的一个子类,它使它成为未检查的异常,不必在
抛出的
子句中处理或声明

是一个选中的异常,因此必须在任何可能抛出它的方法的
throws
子句中捕获或声明它

如果添加throws子句,将编译第二个代码段:

static void method() throws IllegalAccessException
{
    throw new IllegalAccessException();
}
是的子类,使其成为未经检查的异常,不必在
throws
子句中处理或声明

是一个选中的异常,因此必须在任何可能抛出它的方法的
throws
子句中捕获或声明它

如果添加throws子句,将编译第二个代码段:

static void method() throws IllegalAccessException
{
    throw new IllegalAccessException();
}
  • 选中的必须按照try-catch异常处理中的描述显式捕获或传播异常未选中不必捕获或声明抛出异常

  • 选中了Java中的异常扩展了Java.lang.Exception类未选中异常扩展java.lang.RuntimeException

  • 未检查的异常列表:

    ArrayIndexOutOfBoundsException  
    ClassCastException  
    IllegalArgumentException  
    IllegalStateException  
    NullPointerException  
    NumberFormatException  
    AssertionError
    ExceptionInInitializerError 
    StackOverflowError 
    NoClassDefFoundError 
    
    Exception 
    IOException 
    FileNotFoundException 
    ParseException 
    ClassNotFoundException 
    CloneNotSupportedException 
    InstantiationException 
    InterruptedException    
    NoSuchMethodException   
    NoSuchFieldException
    
    检查的异常列表:

    ArrayIndexOutOfBoundsException  
    ClassCastException  
    IllegalArgumentException  
    IllegalStateException  
    NullPointerException  
    NumberFormatException  
    AssertionError
    ExceptionInInitializerError 
    StackOverflowError 
    NoClassDefFoundError 
    
    Exception 
    IOException 
    FileNotFoundException 
    ParseException 
    ClassNotFoundException 
    CloneNotSupportedException 
    InstantiationException 
    InterruptedException    
    NoSuchMethodException   
    NoSuchFieldException
    
  • 选中的必须按照try-catch异常处理中的描述显式捕获或传播异常未选中不必捕获或声明抛出异常

  • 选中了Java中的异常扩展了Java.lang.Exception类未选中异常扩展java.lang.RuntimeException

  • 未检查的异常列表:

    ArrayIndexOutOfBoundsException  
    ClassCastException  
    IllegalArgumentException  
    IllegalStateException  
    NullPointerException  
    NumberFormatException  
    AssertionError
    ExceptionInInitializerError 
    StackOverflowError 
    NoClassDefFoundError 
    
    Exception 
    IOException 
    FileNotFoundException 
    ParseException 
    ClassNotFoundException 
    CloneNotSupportedException 
    InstantiationException 
    InterruptedException    
    NoSuchMethodException   
    NoSuchFieldException
    
    检查的异常列表:

    ArrayIndexOutOfBoundsException  
    ClassCastException  
    IllegalArgumentException  
    IllegalStateException  
    NullPointerException  
    NumberFormatException  
    AssertionError
    ExceptionInInitializerError 
    StackOverflowError 
    NoClassDefFoundError 
    
    Exception 
    IOException 
    FileNotFoundException 
    ParseException 
    ClassNotFoundException 
    CloneNotSupportedException 
    InstantiationException 
    InterruptedException    
    NoSuchMethodException   
    NoSuchFieldException
    

    从用户的角度来看,我想在检查异常和未检查异常之间的差异上加上我的两分钱

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

    让我们先来看看检查过的异常。如果用户在名称字段中输入12312,则应用程序应抛出已检查的异常。同样,如果用户输入angelo作为电话号码,则应用程序应再次抛出已检查的异常。因为12312和angelo都不是一个人的有效名字,也不是一个电话号码。在这种情况下,我们使用检查异常。因为这基本上是一个用户错误,并有适当的反馈,用户可以纠正这种错误

    另一方面,未经检查的异常不是用户异常。对于这种情况,用户完全无能为力。例如,与数据库的连接可能会丢失。或者,当开发人员为上述示例创建数据库字段时,他可能会将数据库中的名称字段定义为布尔字段。(我在这里有点夸张)


    我希望这也能有所帮助。

    从用户的角度来看,我想在检查的异常和未检查的异常之间加上我的两分钱

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

    让我们先来看看检查过的异常。如果用户在名称字段中输入12312,则应用程序应抛出已检查的异常。同样,如果用户输入angelo作为电话号码,则应用程序应再次抛出已检查的异常。因为12312和angelo都不是一个人的有效名字,也不是一个电话号码。在这种情况下,我们使用检查异常。因为这基本上是一个用户错误,并有适当的反馈,用户可以纠正这种错误

    另一方面,未经检查的异常不是用户异常。对于这种情况,用户完全无能为力。例如,与数据库的连接可能会丢失。或者,当开发人员为上述示例创建数据库字段时,他可能会将数据库中的名称字段定义为布尔字段。(我在这里有点夸张)


    我希望这也能有所帮助。

    ,IOException是否也会发生同样的情况???@RajMalhotra check。您将发现(直接)继承自
    RuntimeException
    @RajMalhotra的所有类是的,IOException也是一个已检查的异常,就像任何不是RuntimeException子类的异常子类一样。IOException???@RajMalhotra check是否也会发生同样的情况。您将发现(直接)继承自
    RuntimeException
    @RajMalhotra的所有类是的,IOException也是一个选中的异常,就像任何不是RuntimeException子类的异常子类一样。