java中排序算法、异常

选择排序

选择排序概述:选中数组中的某个元素,后面的元素依次和它进行比较,将较大的数据放在后面,依次从前到后选中每个元素,直到所有的数据按要求完成排序即可

选择排序的图解形式:

在这里插入图片描述
特点:选择排序,5个数字,需要排4次即可,所以如果是N个数字进行排序,那么需要排N-1次

   代码实现:
 public static void main(String[] args) {
        int[] arr = {5, 2, 1, 6, 7, 9};
        //外层循环控制选中的元素
        for (int i = 0; i < arr.length - 1; i++) {
            //外层循环控制和哪个元素进行比较
            for (int j = i + 1; j < arr.length; j++) {
                //比较arr[i] arr[j]
                if (arr[i] > arr[j]) {
                    //交换
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;

                }

            }
        }
        System.out.println(Arrays.toString(arr));
    }

二分查找

概念:给定的数组必须是有自然顺序的(比如,从小到大),然后和要查找的元素进行比对,如果相同就返回索引

代码实现:

public static void main(String[] args) {
        //定义数组,必须是有序的
        int key = 5;
        int[] arr = {1, 5, 9, 12, 16, 75};
        //调用方法
        int index = find(arr, key);
        System.out.println(index);
    }

    public static int find(int[] arr, int key) {
        //定义两个变量
        int left = 0;
        int right = arr.length - 1;
        while (left <= right) {
            //获取中间索引元素和目标值比较
            int middle = (left + right) / 2;
            if (arr[middle] > key) {
                right = middle - 1;
            } else if (arr[middle] < key) {
                left = middle + 1;
            } else {
                return middle;
            }
        }
        return -1;
    }

异常

什么是异常:在写程序或者运行程序时出现的非正常情况

异常的继承体系:所有异常的根类:Throwable ;子类有:Error(错误类)、Exception(异常类)

在这里插入图片描述

异常中常用的三个方法:

printStackTrace();打印异常的详细信息(包括异常的类型、原因及位置)【最常用】
getMessage();获取异常的原因
toString();获取异常信息和描述

异常(Exception)的分类

编译时异常:写好代码后,运行代码之前出现的异常。
编译时异常是**Exception以及Exception的子类**。(RuntimeException除外)
运行时异常:运行代码时出现的异常。
运行时异常是**RuntimeException以及RuntimeException的子类**

异常处理

五个关键字(throw、throws、try…catch、finally)

throw是一个关键字,想要向上抛出时使用

格式: throw 异常对象; throw new 异常类();

代码案例:

public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int i = get(arr);
        System.out.println(i);
    }

    public static int get(int[] arr) {
        //自己判断,数组是否有3索引
        if (arr.length < 4) {
            //抛出异常
            throw new ArrayIndexOutOfBoundsException("越界");
        }
        //获取数组中索引为3的元素
        int num = arr[3];
        //返回num
        return num;
    }
}

Objects中非空判断方法

objects是一个工具类,其中 Objects.requireNonNull();方法内部帮助我们判断是否为null。

throws声明抛出异常

throws关键字是给方法使用的,是为该方法做出声明,声明该方法内部编译时有异常,调用者需要处理该异常。
格式:public void 方法名(参数列表)throws XxxException{
一堆代码(如果这堆代码有编译时异常)
}

代码实现:

public static void main(String[] args) throws FileNotFoundException {
        //调用方法
        read("1.txt");
    }

    //定义一个方法,读取硬盘上的文件
    public static void read(String name) throws FileNotFoundException {
        if ("1.txe".equals(name)) {
            //可以读取
            System.out.println("读取成功");
        } else {
            //抛出异常
            throw new FileNotFoundException("读取失败");
        }
    }

try…catch捕获异常

格式:try{ //可能出现的代码块 }catch (XxxException e){ //处理异常 e.printStackTrace();//打印异常 }

代码实现:

 public static void main(String[] args) {
        //调用方法
        try {
            read("1.txt");
        } catch (FileNotFoundException e) {
            //处理异常
            System.out.println("出现异常");
            e.printStackTrace();//打印异常
        }
        System.out.println("程序继续执行");
    }

    //定义一个方法,读取硬盘上的文件
    public static void read(String name) throws FileNotFoundException {
        if ("1.txe".equals(name)) {
            //可以读取
            System.out.println("读取成功");
        } else {
            //抛出异常
            throw new FileNotFoundException("读取失败");
        }
    }

finally代码块

finally一般不能单独使用,配合try…catch使用
格式:try{ //可能出现的代码块 }catch (XxxException e){ //处理异常 e.printStackTrace();//打印异常 }finally { //写在finally的代码,无论是否异常,都会执行!! }
作用:一般用于写释放资源,关闭连接等代码

自定义异常

概述

我们自定义一个异常类,在适当的时候创建异常对象,并抛出。

步骤

第一步:创建一个类,必须叫XxxException的形式
第二步:继承Exception或者RuntimeException
第三步:一般需要提供两个构造,无参构造+带有String参数的构造
代码实现:

public class MyException extends RuntimeException {
    //无参构造
    public MyException() {

    }
    //带有异常信息的构造
    public MyException(String message) {
        //一定要把message保存下来
        super(message);
    }
}

案例

要求:我们模拟注册操作,如果用户名已存在,则抛出异常,提示该用户名已被注册。

pException.java

public class pException extends Exception {
    public pException() {
    }

    public pException(String message) {
        super(message);
    }
}

测试类:

public class PTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String user = scanner.nextLine();
        try {
            register(user);
        } catch (pException e) {
            //异常处理
            e.printStackTrace();
        }
    }

    public static void register(String user) throws pException {
        ArrayList<String> users = new ArrayList<>();
        users.add("Tom");
        users.add("jack");
        if (users.contains(user)) {
            //如果存在,则抛出异常提示已存在
            throw new pException("用户已存在");
        } else {
            System.out.println(user + "用户名注册成功");
        }
    }
}

总结

排序

主要针对面试!
排序最优解:Arrays.sort(array);

异常

关于Interger类的方法:将一个字符窜转成int类型的数据!

public static int parseInt(String s) throws NumberFormatException

针对这个方法:如果这个字符串s里面不是数字,那么它在进行转换的过程中就会出现问题!异常它是在你执行某个功能的时候可能出现的问题!!!【一旦发生,我们程序是需要去处理的】

异常的处理

抛出异常throw【方法内部】
声明异常throws【在方法上面】
捕获异常try【方法内部】

提示

如果你的异常类继承了RuntimeException,那么在方法里面不用声明异常 throws 【当然也可以!】
如果你的异常类继承了Exception,那么在方法里面就需要声明异常 throws

发布了34 篇原创文章 · 获赞 9 · 访问量 1289

猜你喜欢

转载自blog.csdn.net/weixin_43616750/article/details/104851301
今日推荐