java——内部类和异常处理

2023-11-06


在这里插入图片描述

内部类

Java内部类(Inner Class)是嵌套在其他类中的类,它可以访问外部类的成员变量和方法,同时也可以被外部类访问。Java内部类主要有四种类型:

  1. 成员内部类(Member Inner Class)
  2. 局部内部类(Local Inner Class)
  3. 匿名内部类(Anonymous Inner Class)
  4. 静态内部类(Static Inner Class)

下面我们将分别对这四种内部类进行详解,并且给出相应的示例代码。

成员内部类

成员内部类是定义在另一个类中的类,它通常用于封装一些业务逻辑,只有在创建了外部类的对象之后才能够创建成员内部类的对象。成员内部类在访问外部类的成员变量和方法时,需要通过外部类的实例来访问。

public class Outer {
    private int outerNum = 10;

    public class Inner {
        public void print() {
            System.out.println("Outer Num: " + outerNum);
        }
    }

    public void test() {
        Inner inner = new Inner();
        inner.print();
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.test(); // 输出:Outer Num: 10
    }
}

在上面的代码中,Inner类是成员内部类,它访问了外部类的outerNum成员变量。

局部内部类

局部内部类是定义在方法体内部的类,它只在该方法中有效,因此局部内部类不需要访问外部类的成员变量和方法时使用。与成员内部类不同的是,局部内部类可以访问方法中的final类型的局部变量。

public class Outer {
    public void test(final int x) {
        final int y = 10;

        class Inner {
            public void print() {
                System.out.println("x: " + x + ", y: " + y);
            }
        }

        Inner inner = new Inner();
        inner.print(); // 输出:x: 100, y: 10
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.test(100);
    }
}

在上面的代码中,Inner类是局部内部类,它访问了test方法中的x和y局部变量。

匿名内部类

匿名内部类是没有名称的内部类,它通常用于实现接口或继承抽象类,并且只需要创建一个对象的场景。由于匿名内部类没有名称,因此它无法被其他方法或类所引用,在创建后只能使用一次。

public class Outer {
    public void test() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread is running.");
            }
        });

        thread.start();
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.test(); // 输出:Thread is running.
    }
}

在上面的代码中,我们使用匿名内部类实现了Runnable接口,并创建了一个新的线程。

静态内部类

静态内部类是被声明为static的内部类,它不需要依赖于外部类的实例就可以创建对象。与成员内部类相比,静态内部类只能访问外部类的静态成员变量和方法。

public class Outer {
    private static int outerNum = 10;

    public static class Inner {
        public void print() {
            System.out.println("Outer Num: " + outerNum);
        }
    }

    public static void main(String[] args) {
        Outer.Inner inner = new Outer.Inner();
        inner.print(); // 输出:Outer Num: 10
    }
}

在上面的代码中,Inner类是静态内部类,它访问了外部类的outerNum静态成员变量。

总结一下,Java内部类是嵌套在其他类中的类,它可以访问外部类的成员变量和方法。Java内部类主要有四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。不同类型的内部类适用于不同的场景,能够提高程序的灵活性和可读性。

异常处理

Java异常处理是指在程序运行时可能出现的错误或异常情况进行捕获、处理和抛出。Java语言中的所有异常都继承自Throwable类,其中又分为两种类型:Checked Exception和Unchecked Exception。

  • Checked Exception(受检异常):必须在方法签名中声明或者捕获处理,否则编译不通过,例如IOException、SQLException等。
  • Unchecked Exception(非受检异常):不需要在方法签名中声明或者捕获处理,例如NullPointerException、ArrayIndexOutOfBoundsException等。

下面我们结合示例代码来详解Java异常处理。

异常捕获与处理

Java程序中的异常通常可以通过try-catch-finally语句块进行捕获和处理。try块内包含可能会产生异常的代码,当发生异常时,会跳转到相应的catch块进行处理。

public class ExceptionDemo {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // 抛出ArithmeticException异常
            System.out.println("Result: " + result);
        } catch (ArithmeticException e) { // 捕获ArithmeticException异常
            System.out.println("Divide by zero.");
            e.printStackTrace(); // 打印异常信息
        } finally {
            System.out.println("Finally block executed.");
        }
    }
}

在上面的代码中,我们进行了除以0的操作,抛出了一个算术异常ArithmeticException,然后使用catch块捕获并打印异常信息。最后执行了finally块中的代码。

多重异常捕获和处理

在一个try语句块中,可以使用多个catch语句分别捕获不同类型的异常,并进行相应的处理。

public class ExceptionDemo {
    public static void main(String[] args) {
        try {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]); // 抛出ArrayIndexOutOfBoundsException异常
        } catch (ArrayIndexOutOfBoundsException e) { // 捕获数组下标越界异常
            System.out.println("Array index out of bounds.");
        } catch (Exception e) { // 捕获其他异常
            System.out.println("Other exception.");
        }
    }
}

在上面的代码中,我们使用了两个catch块来分别捕获数组下标越界异常和其他异常。

抛出异常

有时候,在方法内部无法解决某些问题时,需要抛出一个异常,告知调用者该方法无法正常运行,并提供异常信息。在Java中,可以使用throw关键字抛出一个异常对象。

public class ExceptionDemo {
    public static void main(String[] args) throws FileNotFoundException {
        loadFile("test.txt");
    }

    public static void loadFile(String fileName) throws FileNotFoundException {
        File file = new File(fileName);
        if (!file.exists()) {
            throw new FileNotFoundException("File does not exist.");
        }
    }
}

在上面的代码中,我们定义了一个loadFile方法,当文件不存在时,抛出一个FileNotFoundException异常。

总结一下,Java异常处理是在程序运行时可能出现的错误或异常情况进行捕获、处理和抛出。Java语言中的所有异常都继承自Throwable类,其中又分为两种类型:Checked Exception和Unchecked Exception。Java程序中的异常通常可以通过try-catch-finally语句块进行捕获和处理,也可以使用throw关键字抛出一个异常对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java——内部类和异常处理 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s

随机推荐