Java 为什么异常类型会影响什么将和赢得';t、 编译?

Java 为什么异常类型会影响什么将和赢得';t、 编译?,java,exception-handling,Java,Exception Handling,我有两个版本的代码。在第一个版本中,异常类型在方法()中抛出-NullPointerException,在第二个版本中-exception。不过,第一个版本将编译,但第二个版本不会编译。为什么会这样 public class Demo { static void Method() { try { throw new NullPointerException("error"); } catch(

我有两个版本的代码。在第一个版本中,异常类型在方法()中抛出-
NullPointerException
,在第二个版本中-
exception
。不过,第一个版本将编译,但第二个版本不会编译。为什么会这样

public class Demo
{
    static void Method()
    {
        try
        {
            throw new NullPointerException("error");
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }
    public static void main(String argv[])
    { 
        try
        {
            Method();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
这是第二个版本

public class Demo
{
    static void Method()
    {
        try
        {
            throw new Exception("error");
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }
    public static void main(String argv[])
    { 
        try
        {
            Method();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
第一个版本的堆栈跟踪:

java.lang.NullPointerException: error
    at Demo.Method(Demo.java:7)
    at Demo.main(Demo.java:18)

这是因为
NullPointerException
是所谓的“未检查”异常。您不需要在
throws
子句中声明它们

但是,不定期的
异常
不会被取消选中,您确实需要在
声明中声明抛出
声明。您需要在第二个代码段中创建
Method()
throw
Exception


未检查的异常包括
RuntimeException
Error
和派生类
NullPointerException
派生自
RuntimeException

NullPointerException
是一种
RuntimeException
(或未选中),不必在编译时处理<但是,代码>异常被视为已检查的异常,必须由遇到它的任何方法捕获或抛出

可以通过如下更改方法声明来修复第二个代码段:

static void Method() throws Exception

由于您的方法“method()”引发
异常
,您必须在方法签名上声明它:

static void Method() throws Exception
它将编译。
干杯

将此作为第二个示例:

public class Demo
{
    static void Method() throws Exception
    {
        try
        {
            throw new Exception("error");
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }
    public static void main(String argv[])
    { 
        try
        {
            Method();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

这应该可以很好地编译,

版本1的代码没有在java版本6或更低版本中编译,我猜您使用的是java 7


Java7查看编译器时,会抛出确切的异常类型。在案例1中,它是一个运行时异常,不会出现在方法的签名中。

两个版本都是相同的@NormallyCity OP说“在两者都相同之前,他没有修正它。也修正了标题。我最初误解了意图。我知道
抛出
。我对不同的权利感兴趣!我对fge的答案投了赞成票,这比我更能解释你想要什么:)