持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
哈喽,各位小伙伴们好,我是喵手。
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流 学习,互相学习,才能成长的更快,对吧。
我是一名java开发,所以日常接触到最多的就是java啦,所以我趁自己有空,就来好好回忆,把自己学到的会的,进行输出,不图什么有回报,只想能帮助到更多的小伙伴,就好。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对喵手我创作道路上最好的鼓励与支持!
一、前言
论前几期啊,我们是分别讲了Object类、Date类、FormDate类、Calendar类、System类及StringBuilder类,不知道大家掌握的如何,如果没有及时巩固的同学,可以看我这里,我给大家罗列了下,快速学习通道,只希望能帮助到大家更好的学习与成长,这就是我写作的初衷。
- java之Date类讲义
- java之DateFormat类讲义
- java之Calendar类讲义
- java之System类讲义
- java之StringBuilder类讲义
- java之Collection类
- java之包装类
- java之Iterator迭代器
- java之List集合
在上一期,我们是重点学习了异常如何声明、如何捕获、finally如何使用?以及对于多个异常怎么处理,然后处理异常的注意方式等,想必对此也有了一定的了解,接下来我们要学的,就是对异常如何自定义了?这也是在日后项目实战中有一定使用的。系统自带的异常肯定是兼容所有的业务场景的,这就需要使用到自定义异常。
说完这个,应该还剩些时间,我就要给大家科普下进程与线程吧,这也是重中之重,如果你都分不清,那肯定日后是要被同事嘲笑的。
二、本期教学目标
- 掌握如何自定义异常。
- 自定义异常实战练习。
- 掌握进程/线程的概念及区别。
- 理解并发与并行的区别。
- 掌握如何创建线程。
三、自定义异常
1、概述
自定义异常?顾名思义,DIY异常嘛,我们都知道,java中不同的异常类,分别表示着某一种具体的异常情况,那么在日常业务开发中,我们总会碰到一些jdk内部没有定义的异常,比如年龄为负、考试成绩为负等,那对于这些业务场景,要进行异常处理,那我们应该怎么办?实际开发中对于这些业务想的异常,我们就得自定义它们了。
说到为啥自定义异常,这我已经给大家解释了,那再问大家个问题,什么是自定义异常?这么问肯定大家都清楚啊,不就是在日常业务开发中,根据自己的业务情况来定异常类。比如我们一个常见的场景,用户注册异常类--若用户名已存在,则进行自定义异常类抛出。
那么接下来,我们就来讲讲该业务场景,先定义一个自定义异常。
- 自定义一个编译期的异常:自定义类,并继承于
java.lang.Exception。 - 自定义一个运行期的异常:自定义类,并继承于
java.lang.RuntimeException。
接下来我就给大家具体演示一下,如何自定义异常吧。
2、实例演示
比如对于用户注册异常类,要求:模拟登录注册,如果对于用户名重名,则抛出异常,“用户名已被使用!”。
首先,我们先来定义一个异常类RegisterException。
public class RegisterException extends Exception {
//空参构造函数
public RegisterException() {
}
//有参构造
public RegisterException(String message) {
super(message);
}
}
接着我们来模拟登陆操作,使用数组模拟数据库中存储的数据,并提供当前注册账号是否存在方法用于判断。
public class Register {
private static String[] names = {"a", "b", "c", "d"};
public static void main(String[] args) {
try {
checkUserName("a");
System.out.println("注册成功!");//如果没有异常就是注册成功
} catch (RegisterException e) {
//处理异常
e.printStackTrace();
}
}
}
如下是实现一个模拟登录注册判断用户名是否重复的方法。我这里就不接入实际业务从数据库查询用户信息再进行判重处理了啊。
private static String[] names = {"a", "b", "c", "d"};
/**
* 校验用户名是否重复
*
* @param uname 用户名
*/
private static boolean checkUserName(String uname) throws RegisterException {
for (String name : names) {
if (uname.equals(name)) {
throw new RegisterException("该" + name + "名字已经被注册了!");
}
}
return true;
}
接下来我们就来执行一下该main函数。我们先调用checkUserName(),然后入参一个重复的用户名,再入参一个不重复的用户名,看看分别有啥情况出现。
接着我们来入参不在names数组中的名字,看看是否还进行异常抛出。
总而言之,自定义异常也是为了业务服务,一切仅仅围着业务出发。
四、多线程
如上是结束了异常相关的所有知识点了。接着还剩点时间,我就给大家科普一个新概念--多线程。带着大家回忆一下,学习的程序在没有的跳转语句的情况下,语句是从上依次往下执行,对吧,那现在要设计一个程序,要它边打游戏并听歌?同时进行,现实场景手机电脑都支持的操作,对吧,那么对于真正的程序实现,它是怎么样的,这你有真正去了解过么?
1、并发与并行
提出两个概念,并发与并行。这在操作系统上,也是很好用来解释的,单核或多核
- 并发:表示两个或多个事情在同一个时间段内发生。
- 并行:表示指两个或多个事情在同一刻发送(同时发生)。
2、线程与进程
何为线程?何为进程?这两概念,你们也是需要知道的。
- 进程:表示指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。
- 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程。
... ...
好啦,以上就是本期内容的全部教学内容啦,如果对文中的任何知识点有疑问,欢迎评论区评论留言呀,我看见都会一一解答的。
五、文末
教学是结束了,但是有些话不知我但讲不当讲,啊哈哈, 可我还是想说给你们听听。如下是我很喜欢的一句话,我打算送给你们,希望我们都能变得更好更优秀。
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
-------------------------------------------
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
-------------------------------------------