【day14】异常处理与Object类深入解析

【day13】回顾

在深入探讨异常处理与Object类之前,让我们回顾一下【day13】中的关键内容:

  1. 权限修饰符

    • public:最广的访问范围,任何地方都可以访问。
    • protected:在同包和子类中可以访问。
    • 默认(无修饰符):仅在同包内可以访问。
    • private:仅在定义它的类内部可以访问。
  2. final关键字

    • 修饰类:不能被继承。
    • 修饰方法:不能被重写。
    • 修饰变量:值不可改变。
    • 修饰对象:对象引用不可变,但对象内部状态可变。
  3. 代码块

    • 构造代码块:在对象构造时执行。
    • 静态代码块:在类加载时执行。
  4. 匿名内部类

    • 一种无需显式声明类名的内部类,常用于简化代码和实现接口。

模块十三重点

本模块我们将深入学习异常处理机制和Object类:

  1. 理解编译时期异常与运行时期异常的区别。
  2. 掌握两种异常处理方式:throwstry...catch
  3. 了解finally关键字的使用场景。
  4. 了解Object类及其中的toStringequals方法。
  5. 掌握重写toStringequals方法的重要性。

第一章:API文档

API文档是程序员的“字典”,它详细描述了Java中预定义的类和接口,以及它们的方法和属性,方便我们查询和使用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二章:异常

1. 异常介绍

异常是程序运行过程中出现的不正常现象。在Java中,异常都是类的实例。
在这里插入图片描述
在这里插入图片描述

public class Demo01Exception {public static void main(String[] args) throws ParseException {//错误Error -> StackOverflowError//method();//运行时期异常 -> ArrayIndexOutOfBoundsExceptionint[] arr1 = new int[3];//System.out.println(arr1[4]);/*编译时期异常:注意看:编译时期异常是我们代码写错了嘛?不是,当我们调用方法的时候该方法底层给我们抛了一个编译时期异常,所以导致我们一调用此方法一编译,就爆红了当我们一旦触发了这个异常,jvm就会将异常信息打印到控制台上,给程序员们看*/SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = "2000-10-10 10:10:10";Date date = sdf.parse(time);System.out.println(date);}public static void method(){method();}
}

2. 异常处理方式

2.1 throws关键字

用于在方法签名中声明该方法可能抛出的异常,将异常往上抛

public class Demo04Exception {public static void main(String[] args)throws FileNotFoundException {String s = "a.txt1";add(s);//添加功能delete();//删除功能update();//修改功能find();//查询功能}private static void add(String s)throws FileNotFoundException {if (!s.endsWith(".txt")) {//故意创建异常throw new FileNotFoundException("文件找不到");}System.out.println("我要执行了");}private static void find() {System.out.println("查询功能");}private static void update() {System.out.println("修改功能");}private static void delete() {System.out.println("删除功能");}
}

在这里插入图片描述

2.2 try...catch语句

用于捕获和处理异常。

  try{可能出现异常的代码}catch(异常 对象名){处理异常的代码-> 将来开发会将异常信息保存到日志文件中}
public class Demo06Exception {public static void main(String[] args){String s = "a.txt1";try{//int[] arr = null;//System.out.println(arr.length);//NullPointerExceptionadd(s);//添加功能}catch (FileNotFoundException e){System.out.println(e);}delete();//删除功能update();//修改功能find();//查询功能}private static void add(String s)throws FileNotFoundException {if (!s.endsWith(".txt")) {//故意创建异常throw new FileNotFoundException("文件找不到");}System.out.println("我要执行了");}private static void find() {System.out.println("查询功能");}private static void update() {System.out.println("修改功能");}private static void delete() {System.out.println("删除功能");}}
2.3 finally关键字

无论是否发生异常,finally块中的代码都会执行。

特殊情况:如果之前执行了System.exit(0)终止当前正在执行的java虚拟机

public class Demo08Exception {public static void main(String[] args){String s = "a.txt";try {add(s);//添加功能} catch (FileNotFoundException e) {e.printStackTrace();}finally {System.out.println("我必须滴执行");}}private static void add(String s)throws FileNotFoundException {if (!s.endsWith(".txt")) {//故意创建异常throw new FileNotFoundException("文件找不到");}System.out.println("我要执行了");}
}
public class Demo09Exception {public static void main(String[] args) {int result = method();System.out.println(result);}public static int method() {try {String s = null;System.out.println(s.length());//空指针异常return 2;} catch (Exception e) {return 1;} finally {System.out.println("我一定要执行");//return 3;}}
}

finally的使用场景: 关闭资源
原因: 对象如果没有用了,GC(垃圾回收器)回收,用来回收堆内存中的垃圾,释放内存,但是有一些对象GC回收不了。比如:连接对象(Connection),IO流对象Socket对象,这些对象GC回收不了,就需要我们自己手动回收,手动关闭

将来不能回收的对象new完之后,后续操作不管是否操作成功,是否有异常,我们都需要手动关闭,此时我们就可以将关闭资源的代码放到finally中

public class Test {public static void main(String[] args) {FileWriter fw = null;try {fw = new FileWriter("day13_exception_object\\1.txt");fw.write("哈哈哈");//假如这里写失败或者写成功了} catch (IOException e) {throw new RuntimeException(e);}finally {if (fw!=null){try {fw.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}
2.4 try...catchthrows的使用时机
  1. 如果处理异常之后,还想让后续的代码正常执行,我们使用try…catch
  2. 如果方法之间是递进关系(调用),我们可以先throws,但是到了最后需要用try…catch做一个统一的异常处理
    在这里插入图片描述

3. 自定义异常

可以通过继承Exception类来创建自定义异常。

需求:键盘录入一个用户名,实现登录功能,如果登录失败,抛出LoginUserException

public class LoginUserException extends Exception{public LoginUserException() {}public LoginUserException(String message) {super(message);}
}
public class Demo11Exception {public static void main(String[] args) throws LoginUserException {//1.定义一个用户名,代表已经注册的用户String username = "root";//2.创建Scanner对象,录入用户名Scanner sc = new Scanner(System.in);System.out.println("请您输入要登录的用户名:");String name = sc.next();//3.判断用户名是否和已经存在的用户名一致if (name.equals(username)){System.out.println("登录成功了");}else{throw new LoginUserException("登录失败了,用户名或者密码有问题");}}
}
  1. 定义一个类

  2. 如果继承Exception 就是编译时期异常

  3. 如果继承RuntimeException,就是运行时期异常

4. 打印异常信息的方法

  • toString():输出异常类型和信息。
  • getMessage():输出异常信息。
  • printStackTrace():打印异常的详细信息,包括异常类型、信息和堆栈跟踪。
public class Demo11Exception {public static void main(String[] args) {//1.定义一个用户名,代表已经注册的用户String username = "root";//2.创建Scanner对象,录入用户名Scanner sc = new Scanner(System.in);System.out.println("请您输入要登录的用户名:");String name = sc.next();//3.判断用户名是否和已经存在的用户名一致if (name.equals(username)) {System.out.println("登录成功了");} else {try {throw new LoginUserException("登录失败了,用户名或者密码有问题");}catch (Exception e){//System.out.println(e.toString());//System.out.println(e.getMessage());e.printStackTrace();}}}
}

第三章:Object类

Object类是Java中所有类的根类,提供了一些基础方法,如toStringequalshashCode

1. toString方法

  • 用于返回对象的字符串表示形式。
  • 如果没有重写toString方法,直接输出对象会默认调用Object中的toString方法,输出地址值。
  • 如果直接输出对象名不想输出地址值,就重写Object中的toString方法
public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}
public class Test01 {public static void main(String[] args) {Person p1 = new Person("金莲", 26);System.out.println(p1);//com.atguigu.b_object.Person@4eec7777System.out.println(p1.toString());//com.atguigu.b_object.Person@4eec7777System.out.println("==============");ArrayList<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");System.out.println(list);//[张三, 李四, 王五]System.out.println(list.toString());//[张三, 李四, 王五]}
}

2. equals方法

  • 用于比较两个对象的地址值是否相等。
  • 如果重写了equals方法,应该比较对象的内容。

3. clone方法

用于复制一个属性值相同的新对象。

示例代码

public class Person {private String name;private int age;@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age && Objects.equals(name, person.name);}
}public class TestObject {public static void main(String[] args) {Person p1 = new Person("John", 30);System.out.println(p1.toString());System.out.println(p1.equals(new Person("John", 30)));}
}

第四章.经典接口

1.java.lang.Comparable

我们知道基本数据类型的数据(除boolean类型外)需要比较大小的话,之间使用比较运算符即可,但是引用数据类型是不能直接使用比较运算符来比较大小的。那么,如何解决这个问题呢?

Java给所有引用数据类型的大小比较,指定了一个标准接口,就是java.lang.Comparable接口:

package java.lang;public interface Comparable{int compareTo(Object obj);
}

那么我们想要使得我们某个类的对象可以比较大小,怎么做呢?步骤:

第一步:哪个类的对象要比较大小,哪个类就实现java.lang.Comparable接口,并重写方法

  • 方法体就是你要如何比较当前对象和指定的另一个对象的大小

第二步:对象比较大小时,通过对象调用compareTo方法,根据方法的返回值决定谁大谁小。

  • this对象(调用compareTo方法的对象)减 指定对象(传入compareTo()的参数对象)大于0,返回正整数
  • this对象(调用compareTo方法的对象)减 指定对象(传入compareTo()的参数对象)小于0 返回负整数
  • this对象(调用compareTo方法的对象)减 指定对象(传入compareTo()的参数对象)等于0 返回零

代码示例:

public class Student implements Comparable{private String name;private int score;public Student() {}public Student(String name, int score) {this.name = name;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +'}';}/*this:代表students[i]o:代表students[i+1]如果students[i].getScore()-students[i+1].getScore()>0证明数组中的前面一个对象比后面一个对象的分数高*/@Overridepublic int compareTo(Object o) {Student s = (Student) o;return this.getScore()- s.getScore();}
}

测试类

public class Test01 {public static void main(String[] args) {//创建一个数组Student[] students = new Student[3];Student s1 = new Student("张三", 100);Student s2 = new Student("李四", 60);Student s3 = new Student("王五", 80);students[0] = s1;students[1] = s2;students[2] = s3;for (int j = 0; j<students.length-1;j++){for (int i = 0;i<students.length-1-j;i++){//如果students[i]比students[i+1]大,就排序换位置if (students[i].compareTo(students[i+1])>0){Student temp = students[i];students[i] = students[i+1];students[i+1] = temp;}}}//遍历for (int i = 0; i < students.length; i++) {System.out.println(students[i]);}}
}

2.java.util.Comparator

思考:

(1)如果一个类,没有实现Comparable接口,而这个类你又不方便修改(例如:一些第三方的类,你只有.class文件,没有源文件),那么这样类的对象也要比较大小怎么办?

(2)如果一个类,实现了Comparable接口,也指定了两个对象的比较大小的规则,但是此时此刻我不想按照它预定义的方法比较大小,但是我又不能随意修改,因为会影响其他地方的使用,怎么办?

JDK在设计类库之初,也考虑到这种情况了,所以又增加了一个java.util.Comparator接口。

package java.util;public interface Comparator{int compare(Object o1,Object o2);
}

那么我们想要比较某个类的两个对象的大小,怎么做呢?步骤:

第一步:编写一个类,我们称之为比较器类型,实现java.util.Comparator接口,并重写方法

  • 方法体就是你要如何指定的两个对象的大小

第二步:比较大小时,通过比较器类型的对象调用compare()方法,将要比较大小的两个对象作为compare方法的实参传入,根据方法的返回值决定谁大谁小。

  • o1对象减o2大于0返回正整数
  • o1对象减o2小于0返回负整数
  • o1对象减o2等于0返回零
public class Student implements Comparator {private String name;private int score;public Student() {}public Student(String name, int score) {this.name = name;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +'}';}/*o1代表students[i]o2代表students[i+1]如果o1的分数大于o2的分数-> compare方法返回正整数如果o1的分数小于o2的分数-> compare方法返回负整数如果o1的分数等于o2的分数-> compare方法返回0*/@Overridepublic int compare(Object o1, Object o2) {Student s1 = (Student) o1;Student s2 = (Student) o2;return s1.getScore()-s2.getScore();}}
public class Test01 {public static void main(String[] args) {//创建一个数组Student[] students = new Student[3];Student s1 = new Student("张三", 100);Student s2 = new Student("李四", 60);Student s3 = new Student("王五", 80);students[0] = s1;students[1] = s2;students[2] = s3;Student student = new Student();for (int j = 0; j<students.length-1;j++){for (int i = 0;i<students.length-1-j;i++){//如果students[i]比students[i+1]大,就排序换位置if (student.compare(students[i],students[i+1])>0){Student temp = students[i];students[i] = students[i+1];students[i+1] = temp;}}}//遍历for (int i = 0; i < students.length; i++) {System.out.println(students[i]);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/494711.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题解 洛谷 Luogu P1135 奇怪的电梯 广度优先搜索 BFS C/C++

题目传送门&#xff1a; P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/problem/P1135思路&#xff1a; 一道比较裸的 BFS&#xff0c;就是把走迷宫每次搜周围相邻四格&#xff0c;改成了楼层每次搜上下方向的某层而已 感觉这个题难度只有普及- …

苏黎世联邦理工学院与加州大学伯克利分校推出MaxInfoRL:平衡内在与外在探索的全新强化学习框架

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ

Q1、统计符合条件长度为3的子数组数目 1、题目描述 给你一个整数数组 nums &#xff0c;请你返回长度为 3 的子数组&#xff0c;满足第一个数和第三个数的和恰好为第二个数的一半。 子数组 指的是一个数组中连续 非空 的元素序列。 2、解题思路 我们需要在给定的数组 nums…

【RAG实战】Prompting vs. RAG vs. Finetuning: 如何选择LLM应用选择最佳方案

在构建基于大型语言模型&#xff08;LLM&#xff09;的应用时&#xff0c;通常不可能立即使用模型而无需任何调整。为了保持高实用性&#xff0c;我们可以选择以下几种方法之一&#xff1a; Prompt Engineering&#xff08;提示工程&#xff09;Fine-tuning&#xff08;微调&a…

Odoo:免费开源ERP的AI技术赋能出海企业电子商务应用介绍

概述 伴随电子商务的持续演进&#xff0c;客户对于便利性、速度以及个性化服务的期许急剧攀升。企业务必要探寻创新之途径&#xff0c;以强化自身运营&#xff0c;并优化购物体验。达成此目标的最为行之有效的方式之一&#xff0c;便是将 AI 呼叫助手融入您的电子商务平台。我们…

如何打造用户友好的维护页面:6个创意提升WordPress网站体验

在网站运营中&#xff0c;无论是个人博主还是大型企业网站的管理员&#xff0c;难免会遇到需要维护的情况。无论是服务器迁移、插件更新&#xff0c;还是突发的技术故障&#xff0c;都可能导致网站短暂无法访问。这时&#xff0c;设计维护页面能很好的缓解用户的不满&#xff0…

定位方式:css

使用相对路径 div ul #div下的所有ul&#xff0c;空格表示相对路径&#xff08;这个实际中用的多一些&#xff09; 绝对路径-一般不用绝对路径 html>head>div&#xff0c;“>”表示根路径 使用class名称定位 使用.表示 使用id定位 使用#表示 使用属性定位 [属性名…

【YashanDB知识库】jdbc查询st_geometry类型的数据时抛出YAS-00101错误

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7802956.html?templateId1718516 问题现象 某客户的业务在通过YashanDB jdbc驱动查询含有st_geometry列的数据时&#xff0c;报如下异常&#xff1a;YAS-00101 cannot allocate 0 byte…

[Unity]Unity集成NuGet-连接mysql时的发现

本次使用软件信息&#xff1a; Unity&#xff1a;2022.3.34f1c1。 mysql&#xff1a;mysql 8.0 安装于远程服务器。 使用插件&#xff1a;NuGetForUnity4.1.1.unitypackage 点击名称可前往下载界面。 一、导入插件 打开Unity的时候可直接双击导入道assets。导入后如下图&…

重温设计模式--外观模式

文章目录 外观模式&#xff08;Facade Pattern&#xff09;概述定义 外观模式UML图作用 外观模式的结构C 代码示例1C代码示例2总结 外观模式&#xff08;Facade Pattern&#xff09;概述 定义 外观模式是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供了一个统一…

HDR视频技术之十一:HEVCH.265 的 HDR 编码方案

前文我们对 HEVC 的 HDR 编码优化技术做了介绍&#xff0c;侧重编码性能的提升。 本章主要阐述 HEVC 中 HDR/WCG 相关的整体编码方案&#xff0c; 包括不同应用场景下的 HEVC 扩展编码技术。 1 背景 HDR 信号一般意味着使用更多比特&#xff0c;一般的 HDR 信号倾向于使用 10…

shardingsphere分库分表项目实践1-让shardingsphere运行起来

学习新技术最快的方式就是&#xff1a; 1. 先找一个比较完善的demo跑起来 2. 弄清楚用法&#xff1a;配置、原理、使用场景 3. 移植到自己项目上&#xff0c;按照自己需求进行修改优化。 找demo项目的方法&#xff1a;优先去官方git库找&#xff0c;如果没有或者过于简单那么…

【QSS样式表 - ⑥】:QPushButton控件样式

文章目录 QPushBUtton控件样式QSS示例 QPushBUtton控件样式 常用子控件 常用伪状态 QSS示例 代码&#xff1a; QPushButton {background-color: #99B5D1;color: white;font-weigth: bold;border-radius: 20px; }QPushButton:hover {background-color: red; }QPushButton:p…

layui动态拼接生成下拉框验证必填项失效问题

利用 jQuery 动态拼接下拉框时&#xff0c;lay-verify"required" 失效了&#xff0c;有以下几种原因。 1. <form></form>标签 加入 layui 类&#xff0c;class"layui-form" 。提交按钮上加自动提交&#xff0c;lay-submit ""; 。需…

Vue 92 ,Element 15 ,Vue + el-upload 实现图片上传与管理

目录 前言 一. 文章背景 二. 项目结构 三. 核心代码解析 1. 页面结构 2. 属性介绍 3. 必要参数 4. 函数逻辑 四. 相关样式布局 五. 关键功能解释 六. 注意事项 七. 本文总结 前言 在这篇博客中&#xff0c;我们将深入探讨如何使用 Vue 和 el-upload 构建一个图片上…

安宝特应用 | 美国OSHA扩展Vuzix AR眼镜应用,强化劳动安全与效率

随着工业技术的进步&#xff0c;如何在保障员工安全的同时提高生产效率成为现代企业面临的重要挑战。 美国劳工部职业安全与健康管理局&#xff08;OSHA&#xff09;于2024年12月2日宣布对Vuzix M400智能眼镜进行扩大部署&#xff0c;代表AR技术正为工业环境下的劳动保护开辟了…

linux socket编程之udp_dict_serve服务端--引入配置文件

注意&#xff1a;本篇博客只是对上一篇博客功能的增加 1.创建配置文件(翻译) Dict.txt apple: 苹果 banana: 香蕉 cat: 猫 dog: 狗 book: 书 pen: 笔 happy: 快乐的 sad: 悲伤的 run: 跑 jump: 跳 teacher: 老师 student: 学生 car: 汽车 bus: 公交车 love: 爱 hate: 恨 hell…

HTML基础学习(1)

目录 第一章、基础知识介绍1.1&#xff09;基础知识介绍1.1.1&#xff09;计算机介绍&#xff1a;硬件和软件1.1.2&#xff09;架构介绍1.1.3&#xff09;网站介绍 1.2&#xff09;HTML基础介绍1.2.1&#xff09;HTML创建网页文件与标签1.2.2&#xff09;标签1.2.3&#xff09;…

Android修行手册 - 移动端几种常用动画方案对比

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

MySQL 数据库优化详解【Java数据库调优】

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…