day05-面向对象-异常Lambda算法正则

2024-09-02 09:52

本文主要是介绍day05-面向对象-异常Lambda算法正则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、⭐异常⭐

1.1 异常

1.2 异常处理

1.2.1 抛出异常(throws)

在Java的方法调用中,如果一个方法中出现了异常,本方法自己不处理,默认是会抛给调用方法去处理的此时要注意的是,如果发生的是非运行时异常,需要在方法上明确使用throws关键字声明抛出
​
格式public void 方法名 throws 异常1 ,异常2 ,异常3 ..{方法体throw new Exception()}
public class Demo2 {
​public static void main(String[] args) throws Exception {print();}public static void print() throws Exception {new SimpleDateFormat("yyyy-MM-dd").parse("2019");}
}

throws只抛出并不处理,使得代码能够继续编译(即继续写代码),但运行报错,上面代码运行结果如下:

1.2.2 捕获异常(try...catch)

直接在当前方法,发生异常的代码外使用try--catch--结构捕获并处理异常异常处理后,后续的代码是可以继续执行的
​
格式public void 方法名{try{// 方法体}catch(异常类型1 变量){// 处理异常}catch(异常类型2 变量){// 处理异常}}
public class Demo3 {public static void main(String[] args) {print();}public static void print(){//1.运行时异常String srt = null;//System.out.println("字符串长度:" + srt.length());
​try {//java代码,jdk会监控try中的代码,一旦出现指定类型的错误,会进入到catch中做容错处理System.out.println("字符串长度:" + srt.length());}catch (Exception e){System.out.println("字符串为空,长度为0");}
​}
}

 

1.2.3 自定义异常

自定义异常Java无法为这个世界上全部的问题都提供异常类来代表,如果以后我们自己写的代码中的某种问题,想通过异常来表示,以便用异常来管理该问题,那就需要自己来定义异常类了。
​
自定义运行时异常1、定义一个异常类,继承RuntimeException2、在类中提供构造函数3、在需要抛出异常的地方使用throw关键字 抛出异常类的对象自定义编译时异常1、定义一个异常类,继承Exception2、在类中提供构造函数3、在需要抛出异常的地方使用throw关键字 抛出异常类的对象
注意编译时异常,在编写代码的过程中必须手动处理
异常的作用1、异常是用来查找系统bug 的关键参考信息2、异常可以作为方法内部一种特殊的返回值,以便通知上层调用者,代码底层的执行情况

 

public class Demo4 {public static void main(String[] args) {//模拟用户登录,用户名:admin,密码123456System.out.println(login("admin","123456"));}
​//设置登录的方法public static String login(String username,String password) {
​if (!username.equals("admin")) {//1.用户名错误,用户登录失败throw new LoginException("用户名错误,用户登录失败");} else if (!password.equals("123456")) {//2.用户密码错误,用户登录失败throw new LoginException("用户密码错误,用户登录失败");} else {//3.用户登录成功,返回用户信息return "用户登录成功,用户名" + username;}
​}
​
}
​
//自定义运行时异常类
class LoginException extends RuntimeException{//有参构造public LoginException(String message) {super(message);}
}
public class Demo5 {public static void main(String[] args) throws LoginException2{//模拟用户登录,用户名:admin,密码123456System.out.println(login("admin","1023456"));}
​//设置登录的方法public static String login(String username,String password) throws LoginException2 {
​if (!username.equals("admin")) {//1.用户名错误,用户登录失败throw new LoginException2("用户名错误,用户登录失败");}else if (!password.equals("123456")) {//2.用户密码错误,用户登录失败throw new LoginException2("用户密码错误,用户登录失败");}else {//3.用户登录成功,返回用户信息return "用户登录成功,用户名" + username;}}
​
}
​
//自定义编译时异常类
class LoginException2 extends Exception {public LoginException2(String message) {super(message);}
}

二、⭐Lambda表达式⭐

Lambda表达式是JDK8开始新增的一种语法形式,主要用来简化匿名内部类代码的书写
​
Lambda格式(被重写方法的参数列表)->{被重写方法的方法体;}
​
Lambda使用前提Lambda只能操作函数式接口(有且仅有一个抽象方法的接口,被FunctionalInterface注解修饰)(接口才有Lambda,父子关系没有)
public class Demo1 {public static void main(String[] args) {//匿名内部类操作接口Person person = new Person() {@Overridepublic void eat() {System.out.println("吃饭");}};person.eat();//Lambda简化Person person1 = () -> {System.out.println("吃软饭");};person1.eat();System.out.println("===========================================");
​//匿名内部类操作抽象类Animal animal = new Animal() {@Overridevoid eat() {System.out.println("狗吃肉脯");}};//无法使用Lambda简化animal.eat();
​
​}
​
}
​
​
//接口
interface Person {void eat();
}
​
//抽象类
abstract class Animal {abstract void eat();
}

 

三、方法引用

JDK8新特性,方法引用主要用来简化、替换Lambda表达式
​
方法引用分类1、静态方法的引用2、实例方法的引用3、特定类型方法的引用4、构造器引用
​
小提示先写匿名内部类,发现能化再化(写的多了就热练了)
​
​
1、静态方法的引用:某个Lambda只是调用一个静态方法,并且前后参数一致,即可使用  类名::静态方法
​
2、实例方法的引用:某个Lambda只是调用一个实例方法,并且前后参数一致,即可使用  对象名::实例方法
3、特定类型方法的引用:如果某个Lambda只是调用一个实例方法,并且前面参数列表中第一个参数作为主调,后面的参数作为入参,即可使用  类型::方法
4、构造器引用如果某个Lambda表达式里只是在创建对象,并且前后参数情况一致,就可以使用构造器引用   类名::new 

四、⭐常见算法⭐

4.1 冒泡排序

冒泡排序相邻的两个元素进行比较,小的放左边大的放右边,完成升序排列
​
实现步骤确定总共需要做几轮: 数组长度-1每轮比较几次: 轮数从0计数的话, 就是数组长度-1-当前轮数比较规则: 相邻两个元素比较,大的放在右边

 

4.2 选择排序

选择排序每轮选择当前位置,开始找后面的最小值,与当前位置交换
​
关键点分析确定总共需要做几轮: 数组长度-1每次的基准位:轮数从0计数的话, 就是基准位索引敲好就是轮数比较规则: 以每次的第一个为基准做比较,谁小谁来基准位

 

public class Demo2 {public static void main(String[] args) {int[] arr = {5, 2, 3, 1};selectionSort(arr);System.out.println(Arrays.toString(arr));}
​
​private static void selectionSort(int[] arr) {// 控制轮数:确定总共需要做几轮: 数组长度-1for (int i = 0; i < arr.length-1; i++) {// 每次的基准位:轮数从0计数的话, 就是基准位索引恰好就是轮数(i+1)for (int j = i+1; j < arr.length; j++) {if(arr[i] > arr[j]){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}}
}
​

4.3 折半查找(二分查找)

二分查找/折半查找前提是数组有序特点是每一次查找完成,会舍去一半元素
​
思路分析1、定义两个指针,指向数组第一个和最后一个索引位置2、循环查找,min小于等max则继续(三个指针可能重叠的)3、每次循环进来,重新计算中间指针4、判断情况1:如果mid指向的元素就是num,则返回mid5、判断情况2:如果要查找的元素,在左半边,舍弃max重新计算6、判断情况3:如果要查找的元素,在右半边,舍弃min重新计算7、循环结束没有找到,则代表不存在,返回-1
public class Demo1 {public static void main(String[] args) {int[] arr = {10, 23, 39, 45, 59, 166, 728, 810, 999};
​System.out.println("索引位置为:" + binarySearch(arr, 166));//索引位置为:5System.out.println("索引位置为:" + binarySearch(arr, 200));//索引位置为:-1
​}
​//二分查找private static int binarySearch(int[] arr, int num) {//1.设置返回索引int index = -1;//2.设置开始和结束索引int min = 0;int max = arr.length - 1;//3.使用while循环,条件:左侧开始索引 <= 右侧结束索引while (min<=max){//4.计算中间索引int mid = (min + max)/2;//5.使用中间索引的数据和需要查询的num比较//5.1 数据一致,返回索引位置if(num == arr[mid]){index = mid;break;}else if(num < arr[mid]){//5.2 数据小于中间索引的数据,舍弃右侧数据,重新计算max = mid - 1;}else{//5.3 数据大于中间索引的数据,舍弃左侧数据,重新计算min = mid + 1;}}//如果min>max,则代表没有找到,返回-1//6.循环结束,返回索引位置return index;}
}

这篇关于day05-面向对象-异常Lambda算法正则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129633

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费