有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

实现方法中的java异常处理

下面的代码为throws Exception提供了一个已检查的错误:

import java.io.IOException;

interface some {
    void ss99() throws IOException;
}

public class SQL2 implements some {
    @Override
    public void ss99 () throws Exception {}
// ...
}

而下面的一个编译得很好:

import java.io.IOException;

interface some {
    void ss99() throws IOException;
}

public class SQL2 implements some {
    @Override
    public void ss99 () throws NullPointerException {}
// ...
}

Java做这件事的逻辑是什么——有什么想法吗

蒂娅


共 (1) 个答案

  1. # 1 楼答案

    throws关键字表示方法或构造函数可以抛出异常,尽管它不一定要抛出异常

    让我们从你的第二个片段开始

    interface some {
        void ss99() throws IOException;
    }
    
    public class SQL2 implements some {
        @Override
        public void ss99 () throws NullPointerException {}
    }
    

    考虑

    some ref = getSome();
    try {
        ref.ss99();
    } catch (IOException e) {
        // handle
    }
    

    你只需要使用你的界面some。我们(编译器)不知道它引用的对象的实际实现。因此,我们必须确保处理任何可能抛出的IOException

    SQL2 ref = new SQL2();
    ref.ss99();
    

    您正在处理实际的实现。这个实现保证它不会抛出IOException(通过不声明它)。因此,你不必处理它。您也不必处理NullPointerException,因为它是一个未经检查的异常


    关于你的第一个片段,稍有改变

    interface some {
        void ss99() throws IOException;
    }
    
    public class SQL2 implements some {
        @Override
        public void ss99 () throws Exception { throw new SQLException(); }
    }
    

    考虑

    some ref = new SQL2();
    try {
        ref.ss99();
    } catch (IOException e) {
        // handle
    }
    

    因此,尽管您正在处理接口中声明的异常,但您将允许选中的异常SQLException未经处理地转义。编译器不允许这样做

    必须声明重写的方法以引发相同的异常(作为父类)或其子类之一