Java面向对象学习笔记-4

这篇具有很好参考价值的文章主要介绍了Java面向对象学习笔记-4。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

当编写Java程序时,了解如何处理异常是至关重要的。异常处理可以帮助我们在程序执行过程中处理各种错误情况,以确保程序能够正常运行或者 graceful 地退出。本文将介绍一些关于Java异常处理的基本概念和最佳实践,包括自定义异常类、用户输入的处理、异常捕获与处理、打印异常信息、使用 try-catch-finally 结构、异常捕获的顺序、抛出异常、使用 throws 声明异常、递归导致堆栈溢出,以及自定义异常。
Java面向对象学习笔记-1
Java面向对象学习笔记-2
Java面向对象学习笔记-3

1. 自定义异常类

首先,让我们看看如何创建自定义异常类。在Java中,我们可以继承内置的Exception类来创建我们自己的异常类。这个自定义异常类可以用于抛出和捕获自定义异常。

package cn.dfjy.demo;

public class MyException extends Exception {

    public MyException(String msg) {
        super(msg);
    }
}

2. 基本用户输入

用户输入是大多数Java应用程序的一部分。下面是如何使用Scanner类从控制台读取用户输入的整数的示例。

package cn.dfjy.demo;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        //System.out.println(args[0]);
        Scanner scanner = new Scanner(System.in);

        /*
        异常也是一个类
        java.util.InputMismatchException
        java.lang.NullPointerException
        java.lang.ArrayIndexOutOfBoundsException
        java.lang.ArithmeticException
         */
        System.out.println("请输入一个数字:");
        int number = scanner.nextInt();
        System.out.println("数字是:" + number);

        System.out.println("程序结束");
    }

}

3. 异常处理基础

在处理用户输入时,我们需要验证用户是否提供了正确的数据类型。这可以使用hasNextInt()方法来实现。

package cn.dfjy.demo;

import java.util.Scanner;

public class Test02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        /*
            解决异常的思路:
                使用if判断
         */
        System.out.println("请输入一个数字:");
        if (scanner.hasNextInt()) { // 判断是否缓冲区(键盘)接收到一个数字
            int number = scanner.nextInt();
            System.out.println("数字是:" + number);
        } else {
            System.out.println("请输入正确的数字!");
        }

    }

}

4. 使用 Try-Catch 处理异常

异常是可能发生的错误的标志,我们可以使用try-catch块来处理异常,以确保程序在遇到问题时不会崩溃。

package cn.dfjy.demo;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test03 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        /*
            解决异常的思路:
                使用异常机制 try catch
         */
        try {
            System.out.println("请输入一个数字(分子):");
            int number1 = scanner.nextInt();
            System.out.println("请输入一个数字(分母):");
            int number2 = scanner.nextInt();
            System.out.println(number1 + "/" + number2 + "=" + number1/number2);
        } catch (InputMismatchException ex) {
            System.out.println("请输入正确的数字!");
        } catch (ArithmeticException ex) {
            System.out.println("分母不能为零!");
        }
    }

}

5. 打印异常信息

在异常处理中,我们通常希望能够记录或打印异常的详细信息,以便进行调试和追踪问题。

package cn.dfjy.demo;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test04 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        /*
            解决异常的思路:
                使用异常机制 try catch
         */
        try {
            System.out.println("请输入一个数字(分子):");
            int number1 = scanner.nextInt();
            System.out.println("请输入一个数字(分母):");
            int number2 = scanner.nextInt();
            System.out.println(number1 + "/" + number2 + "=" + number1/number2);
        } catch (InputMismatchException ex) {
            ex.printStackTrace(); // 打印异常的栈信息
            // System.out.println(ex.getMessage()); // 打印异常的信息:null
        } catch (ArithmeticException ex) {
            // ex.printStackTrace(); // 打印异常的栈信息
            System.out.println(ex.getMessage()); // 打印异常的信息:/ by zero
        }

        System.out.println("程序结束");
    }

}

6. 使用 Try-Catch-Finally 处理异常

在某些情况下,我们需要确保资源得到正确释放,即使发生异常也不例外。这时,我们可以使用try-catch-finally结构。

package cn.dfjy.demo;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test05 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        /*
            解决异常的思路:
                使用异常机制 try catch finally
                面试:
                1. finally代码块不执行的唯一条件
                   虚拟机结束
         */
        try {
            System.out.println("请输入一个数字(分子):");
            int number1 = scanner.nextInt();
            System.out.println("请输入一个数字(分母):");
            int number2 = scanner.nextInt();
            System.out.println(number1 + "/" + number2 + "=" + number1/number2);
            System.exit(0); // Terminates the currently running Java Virtual Machine 结束当前java虚拟机
            System.out.println("return");
            return; // 也挡不住 finally 的执行
        } catch (InputMismatchException ex) {
            System.out.println(ex.getMessage()); // 打印异常的信息:null
        } catch (ArithmeticException ex) {
            System.out.println(ex.getMessage()); // 打印异常的信息:/ by zero
        } finally {
            // 最终
            System.out.println("try块中涉及的资源释放");
        }

        System.out.println("程序结束");
    }

}

7. 异常捕获顺序

Java允许我们捕获多个异常,但需要注意它们的顺序。Java会选择第一个匹配的catch块执行,因此catch块的顺序很重要。

package cn.dfjy.demo;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test06 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        /*
            解决异常的思路:
                使用异常机制 try catch finally
                catch顺序
                1. 没有继承关系的,谁先谁后,都可以
                2. 有继承关系的,记住父亲在后 Exception 兜底
         */
        try {
            System.out.println(args[0]);
            System.out.println("请输入一个数字(分子):");
            int number1 = scanner.nextInt();
            System.out.println("请输入一个数字(分母):");
            int number2 = scanner.nextInt();
            System.out.println(number1 + "/" + number2 + "=" + number1/number2);
        } catch (ArithmeticException ex) {
            System.out.println(ex.getMessage()); // 打印异常的信息:/ by zero
        } catch (InputMismatchException ex) {
            System.out.println(ex.getMessage()); // 打印异常的信息:null
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            // 最终
            System.out.println("try块中涉及的资源释放");
        }

        System.out.println("程序结束");
    }

}

8. 抛出异常

在Java中,我们可以使用throw关键字在方法中抛出异常。

package cn.dfjy.demo;

import java.util.Scanner;

public class Test07 {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);

        /*
            解决异常的思路:
                使用异常机制 try catch finally throw throws

                throw,用于方法体内代码行
                throws,用于方法声明上,跟在方法的后面一点
         */
        throw new Exception();
    }

}

9. 使用 throws 声明异常

在方法中,我们可以使用throws关键字来声明可能抛出的异常,这样调用者就知道需要处理这些异常。
Java中的异常,可以被分为两大类:必检异常(checked exceptions)和运行期异常(unchecked exceptions)。

  1. 必检异常(Checked Exceptions)

    • 这些异常是在编译时强制要求处理的异常,必须要么使用 try-catch 块捕获,要么在方法签名中使用 throws 关键字声明抛出异常。
    • 通常用于表示程序可能遇到的外部因素导致的问题,如文件不存在、网络连接问题等。
    • 例子:IOException, SQLException, ClassNotFoundException等。
  2. 运行期异常(Unchecked Exceptions)

    • 这些异常通常是由程序逻辑错误引起的,不需要在编译时强制处理。
    • 通常用于表示编程错误,如空指针异常、数组越界异常等。
    • 例子:NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException等。

要选择使用哪种异常类型取决于异常的性质。如果异常是由于无法控制的外部因素引起的,应该使用必检异常。如果异常是由于程序错误引起的,通常使用运行期异常。这有助于提高代码的可读性和维护性,并帮助开发人员更好地处理异常情况。

package cn.dfjy.demo;

import java.util.Scanner;

public class Test08 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        /*
            解决异常的思路:
                使用异常机制 try catch finally throw throws

                throw,用于方法体内代码行
                throws,用于方法声明上,跟在方法的后面一点
         */
        try {
            f01(-100);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        f02(-100);

        System.out.println("代码正常走完");
    }

    public static void f01(int cj) throws Exception {
        if (cj < 0) throw new Exception("成绩不能为负数!"); // 必检异常(排除掉RuntimeException或它的子类)
        System.out.println("成绩:" + cj);
    }

    public static void f02(int cj) {
        if (cj < 0) throw new RuntimeException("成绩不能为负数!"); // 运行期异常
        System.out.println("成绩:" + cj);
    }

}

当你编写Java程序时,有时候会出现一些问题或错误,这些问题被称为异常。异常可能有不同的类型,而这两个函数 f01f02 就是在处理异常时有所不同的例子。

  1. f01 函数抛出的是一个叫做 “必检异常” 的问题。这就像你在写作业时,如果有一个问题你必须解决它,否则你的作业就不会通过。在这个情况下,你必须处理这个异常,要么使用特殊的代码(try-catch),要么告诉其他人(方法签名中的 throws)这个问题可能会出现。

  2. f02 函数抛出的是一个叫做 “运行期异常” 的问题。这就像你在玩游戏时,如果你犯了一个小错误,游戏不会立刻停止,但会给你一个警告。在这个情况下,你可以选择处理这个问题,但不是必须的,程序不会因为这个问题而立刻停止。

所以,主要区别是对待这些异常的方式。必检异常需要你在代码中明确处理,而运行期异常则是可选择性的。你可以根据问题的性质选择使用哪种异常类型。

10. 递归导致堆栈溢出

递归是一种有用的编程技巧,但如果没有正确的终止条件,它可能导致堆栈溢出。

package cn.dfjy.demo;

public class Test09 {
    public static void main(String[] args) {
        main(args); // java.lang.StackOverflowError
        System.out.println("结束!");
    }

}

11. 自定义异常

最后,我们可以创建自己的自定义异常,并在方法中抛出它,然后在main方法中捕获和处理它。

package cn.dfjy.demo;

public class Test10 {
    public static void main(String[] args) {
        try {
            f01("公");
        } catch (MyException e) {
            System.out.println(e.getMessage());
        }

        System.out.println("正常结束");
    }

    public static void f01(String sex) throws MyException {
        if (!"男".equals(sex) && !"女".equals(sex)) throw new MyException("性别必须是男或女");
        System.out.println("性别正确");
    }

}

总结

这些示例提供了关于Java异常处理的基本概念和实际应用。通过学习这些示例,你可以更好地理解如何使用异常处理来构建健壮的Java程序。异常处理是编写高质量、可维护的代码的关键部分,因此确保掌握这些概念是很有价值的。文章来源地址https://www.toymoban.com/news/detail-707331.html

到了这里,关于Java面向对象学习笔记-4的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java面向对象学习笔记-3

    本文将介绍Java编程中的一些基本概念和用法,包括类、接口、抽象类、继承、多态和组合等。通过代码示例,我们将深入探讨这些概念,帮助读者更好地理解如何使用Java进行面向对象编程。 Java面向对象学习笔记-1 Java面向对象学习笔记-2 我们首先来看纸张和墨盒类,它们是

    2024年02月09日
    浏览(39)
  • 【狂神说Java】Java零基础学习笔记-面向对象

    面向过程思想 步骤清晰简单,第一步做什么,第二步做什么.... 面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚, 分类 的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。

    2024年02月12日
    浏览(39)
  • 【Java】小白友好的面向对象编程学习笔记

    目录 OOP介绍 类和对象 方法参数 静态 包和import 构造方法 多态 访问权限 内部类 抽象 接口 枚举 匿名类 bean类 作用域 Java 是一种面向对象的编程语言,面向对象编程(Object-Oriented Programming,简称 OOP)是一种程序设计思想,它将现实世界中的事物抽象为对象,通过封装、继承

    2024年01月20日
    浏览(46)
  • 8.面向对象编程(中级部分)|Java学习笔记

    删除当前行, 默认是 ctrl + Y 自己配置 ctrl + d 复制当前行, 自己配置 ctrl + alt + 向下光标 补全代码 alt + / 添加注释和取消注释 ctrl + / 【第一次是添加注释,第二次是取消注释】 导入该行需要的类 先配置 auto import , 然后使用 alt+enter 即可 快速格式化代码 ctrl + alt + L 快速运行程序

    2024年02月08日
    浏览(47)
  • 7.面向对象编程(基础部分)|Java学习笔记

    java 设计者 引入 类与对象(OOP) ,根本原因就是现有的技术,不能完美的解决新的新的需求. 类是抽象的,概念的,代表一类事物,比如人类,猫类…, 即它是数据类型. 对象是具体的,实际的,代表一个具体事物, 即 是实例. 类是对象的模板,对象是类的一个个体,对应一个实例

    2024年02月08日
    浏览(48)
  • 《Java面向对象程序设计》学习笔记——CSV文件的读写与处理

    ​笔记汇总: 《Java面向对象程序设计》学习笔记 笔记记录的不是非常详实,如果有补充的建议或纠错,请踊跃评论留言!!! CSV 是英文 comma-separated values 的缩写,翻译为 “逗号分隔值“。 CSV 文件可以理解为以带逗号分隔(也可以是其他简单字符分割)的纯文本形式存储

    2024年02月10日
    浏览(52)
  • 《Java面向对象程序设计》学习笔记——第 12 章 输入流与输出流

    ​笔记汇总: 《Java面向对象程序设计》学习笔记 File 对象主要用来获取文件本身的一些信息,例如文件所在的目录、文件的长度和文件的读/写权限等,不涉及对文件的读/写操作。 创建 File 对象的构造方法有以下 3 个: 其中, filename 是文件名字 ,directoryPath 是文件的路径,

    2024年02月11日
    浏览(41)
  • 【从零开始学习JAVA | 第十五篇】 多态

    本篇我们来解释一下什么是多态关系,多态关系属于面向对象三大特征的最后一个,可以说面向对象的重点就在多态,因此我们要学好面向对象编程思想,就要学好多态。         Java中的多态是指 同一类对象在不同情况下可能表现出不同的形态和行为。 它包括了 方法重

    2024年02月10日
    浏览(65)
  • 【从零开始学习JAVA | 第二十五篇】泛型

    目录 前言: 泛型: 额外拓展: 总结:         本文将详细介绍之前我们在JAVA 中一直在讲的泛型,各位感兴趣的同学可以点击进来观看。         泛型是一种编程概念, 它允许在定义类、接口或方法时使用类型参数,这样可以在使用时指定实际的类型。 通过使用泛

    2024年02月16日
    浏览(43)
  • 【从零开始学习JAVA | 第三十篇】方法引用

    目录 前言: 方法引用: 方法引用基本概念: 方法可以被引用的条件: 方法引用的种类: 方法引用的优点: 总结: 方法引用作为一个重要的知识点,虽然他使用起来很复杂,而且会降低代码的可读性,但是如果用好了方法引用,我们也会获得不错的效率,因此我们在今天

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包