选择排序
原理:
使用两个for嵌套循环,比较第一个索引位置的数据和其他所有数据,找最大(小),最大(小)的放索引一位置,再比较第二个索引和除第一个索引位置的数据,,比较最大(小),将最(大)小的数据放在索引二位置,依此类推.
代码实现:
public static void main(String[] args) {
int[] arr = {8, 20, 7, 5, 13,2,54,342,543,425,4};
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if(arr[i] > arr[j]){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
}
System.out.println(Arrays.toString(arr));
}
二分查找
作用:
在一个排序的数组中,查找一个数
使用前提:
数组一定要是排序的;表必须采用顺序存储结构
原理:
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
代码实现:
public static void main(String[] args) {
int[] arr = {9, 12, 20, 30, 50, 60};
int findNum = 50;
int start = 0;
int end = arr.length - 1;
int mid = (start + end) / 2;
boolean flag = false;
while (start <= end){
int n = arr[mid];
if(findNum > n){
start = mid + 1;
}else if(findNum < n){
end = mid - 1;
}else{
flag = true;
break;
}
mid = (start + end) / 2;
}
if (flag) {
System.out.println("找到,位置:" + mid);
}else{
System.out.println("数字:" + findNum + " 没找到");
}
}
异常
概念:
异常本身是个类,异常处理是一个语法
是我们的程序在产生异常的情况下,会让jvm跳过异常,继续运行,异常是一个跳过异常的处理方式的语法
分类:
java.lang.Throwable(所有异常的父类)
Error:JVM遇到的非常严重的错误,也不希望我们程序捕获,程序必须结束
Exception异常:jvm遇到的可以处理的异常情况
RuntimeException:运行时异常:指一些小病,可以通过一些验证,避免一些异常
非RuntimeException外其他的类,编译器异常:指一些意外的异常,程序无法通过判断避免的异常
注意事项:
if判断比异常处理的方式要好,占用的资源少,尽量使用if判断
异常的处理
异常产生到识别到执行的过程:
1)jvm执行到有异常的代码
2)jvm识别异常
3)jvm回到类库中找到描述这个异常的异常类,并创建异常类对象
4)JVM查看我们的代码中是否有"希望捕获这种异常"
有,执行对应trycatch,程序继续向下运行
没有,打印异常输出
格式:
try{可能出现异常的代码}catch(异常类名){异常处理信息}
try{可能出现异常的代码}catch(异常类名){异常处理信息}catch(异常类名){异常处理信息}
try{可能出现异常的代码}catch(异常类名){异常处理信息}finally{释放资源等动作}
throw new 异常类名("异常传递信息,一般使用e.getMessage()调用,也可使用e.toString调用")
throws 异常类名,异常类名//抛出给调用者
异常有关方法:
exception.getMessage();返回异常信息
exception.toString();异常类名:异常信息,一般是给程序员做测试用的,一般不可以给用户看
注意事项:
try{}catch(){}:异常类名,通常不要使用Exception,不具体,要具体写明触发异常.可以使用一个大的trycatch包裹具体异常trycatch,来实现预防线上安全的问题,一般使用两层
try{}catch(){}catch(){}:最后一个catch放Exception e,作为预防线上安全问题,
try{}catch{}finally{}:当catch方法体中return返回值,finally中也有return返回值操作(基本类型和引用类型),finally先返回,平时不会这么使用,finally方法体的作用就是释放资源
throw:在main()方法中也可以throw一个异常对象,但抛给JVM,JVM会打印到控制台,然后结束程序,没有意义
throws:再类后抛出异常,如果出异常,让JVM抛给调用者,但是getMessage的返回值是JVM创建的,不完全,但是简便.
这几个异常抛出方法可以同时存在,
try catch>throw>throws运行顺序
throw和throws区别:
1).throw:
1).用在“方法内部”,真实的抛出一个“异常对象”;
2).throw + 一个异常对象
3).一个方法中throw了一个:
a).运行时异常(RuntimeException):调用的代码可以不try...catch...,而且语法上也能编译通过。
b).编译期异常:调用的代码必须继续抛出,或者使用try...catch...捕获。
2).throws:
1).用在“方法的声明处”,表示:此方法中如果出现这种异常,请JVM将这个异常对象抛给调用的代码。
2).throws + 异常类名1+ 异常类名2......
3).如果throws声明抛出的是:
a).运行时异常:调用的代码可以不try...catch...,而且语法上也能编译通过。
b).编译期异常:调用的代码必须继续抛出,或者使用try...catch...捕获。
子类重写父类方法时的异常声明:
1).重写的规则:子类定义跟父类一模一样(返回值类型、方法名、形参列表)的方法。
2).重写时,抛出异常的规则:
前提:无论父类方法是否抛出异常:
1).子类重写时,都可以不抛出异常;
2).子类重写时,可以抛出任何的“运行时异常”;
3).子类重写时,不能抛出“跟父类不同的编译期异常”;
4)子类重写时,可以抛出父类异常的子类异常,不能抛出父类异常的父类异常
自定义异常
使用时注意事项:
1)需要继承一个父异常类,
a)自Exception,属于编译期异常
b)继承自RuntimeException,属于运行时异常
2)需要重写构造方法:无参和有参
遇到的问题:
可不可以同时抛出两个异常,或者在两个异常存在的情况下,怎么同时抛出?