微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

即使我们不处理 Frame 构造函数抛出的已检查异常,程序也能遵守吗?

如何解决即使我们不处理 Frame 构造函数抛出的已检查异常,程序也能遵守吗?

根据 Oracle 文档 https://docs.oracle.com/javase/7/docs/api/java/awt/Frame.html#Frame()

Frame 构造函数抛出 HeadlessException - 当 GraphicsEnvironment.isHeadless() 返回 true 时

但是程序在调用构造函数时没有处理异常就运行了

import java.awt.*;
import java.awt.event.*;
public class MouseDemo extends Frame{
    String msg="";

    MouseDemo()
    {
        super();//not handling HeadlessException
        addMouseListener(new MouseAdapter()
        {
            public void mouseClicked(MouseEvent me)
            {
                msg="Clicked";
                repaint();

            }

        });

        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent we)
            {
                System.exit(0);
            }
        } );
    }
    @Override
    public void paint(Graphics g)
    {
        g.setColor(Color.black);
        g.drawString(msg,50,50);
    }
    public static void main(String agrs[])
    {
        MouseDemo obj=new MouseDemo();
        obj.setSize(new Dimension(300,300));
        obj.setTitle("hello");
        obj.setVisible(true);
    }

    
}

MouseDemo() 既不处理 HeadlessException 也不将其抛出给调用方法,那么为什么我们没有收到编译错误

解决方法

正如 Java 语言规范的 §8.4.6 所说,

允许但不要求在 throws 子句中提及未经检查的异常类(第 11.1.1 节)。

因此,并非您在 throws 子句中看到的所有内容都是已检查异常。实际上,检查异常是在§11.1.1中定义的:

RuntimeException 及其所有子类统称为运行时异常类。

未经检查的异常类是运行时异常类和错误类。

受检异常类是非受检异常类以外的所有异常类。也就是说,被检查的异常类是 Throwable 及其除 RuntimeException 及其子类和 Error 及其子类之外的所有子类。

如果你查看HeadlessException的继承树,你会发现它是RuntimeException的一个子类:

java.lang.Object
  java.lang.Throwable
    java.lang.Exception
      java.lang.RuntimeException
        java.lang.UnsupportedOperationException
          java.awt.HeadlessException

因此,这是一个未经检查的异常,您不需要使用 try...catch 或另一个 throws 子句来处理它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。