Java异常处理及LeetCode

异常类的继承

1.Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),他们都继承Throwable父类.Error错误,一般是指与虚拟机相关的问题,这种错误无法恢复,将导致程序中断,不能用catch块来捕获Error对象.在定义该方法时,不用在throws中声明可能抛出的Error及其任何子类.
2.Java运行时的异常处理逻辑可能有如下几种情况:
(1)如果运行该程序时输入的参数不够,将会发生数组越界异常,Java运行时将调用IndexOutOfBoundsException对应的catch块处理该异常.
(2)如果运行该程序时输入的参数不是数字,而是字母,将会发生数字格式异常,Java运行时将调用NumberFormatException对应的catch块处理该异常.
(3)如果运行该程序时输入的第二个参数是0,将发生除0异常,Java运行时将调用ArithmeticException对应的catch块处理该异常.
如果运行程序时出现其他异常,该异常的对象总是Exception类或其子类的实例,java运行时将调用Exception对应的catch块处理该异常.
3.例子:

 public class Exception{
    public static void main(String[] args){
        try{
          int a=Interger.parseInt(args[0]);
          int b=Interger.parseInt(args[1]);
          int c=a/b;
          System.out.println("你输入的两个数相除的结果是:" +c);
        }
        catch(IndexOutOfBoundsException ie){
            System.out.println("数组越界:运行程序的参数不够");
        }
        catch(NumberFormatException ne){
            System.out.println("数字格式异常:程序只能接收整数参数");
        }
        catch(ArithmeticException ae){
            System.out.println("除0异常");
        }
        catch(Exception e){
            System.out.println("其他异常");
        }
    }
}

finally(回收资源)

1.异常处理与法结构中只有try是必须的,catch和finally至少有其一,捕获父类异常的catch必须位于捕获子类异常的后面,finally必须位于所有的catch后面.
2.例子:

public class FinallyTest {
    public static void main(String[] args){
        System.out.println(get());
    }
    private static int get(){
        try{
            System.out.println("Try");
        }catch (Exception e){
            System.out.println("Catch");
        }finally {
            System.out.println("Finally");
            //在finally中尽量不要使用return和throw这些导致方法终止的语句
        }
		return 0;
    }
}

LeetCode1122讲解

题目:给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中.
对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同.未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾.

示例:
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]

提示:
arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2 中的元素 arr2[i] 各不相同
arr2 中的每个元素 arr2[i] 都出现在 arr1 中
思路:新建一个数组将arr1中各元素出现的个数记录下来,此时arr1中元素只是新数组的角标,然后遍历arr2,把arr1中所有的arr2中拥有的元素排序,然后利用新数组记录该操作,每改变一个arr1中元素顺序,新数组中对应角标上的元素减去一,最后只剩下arr2中没有的元素,然后按照顺序再把角标上元素还不是0的对应的角标的值赋给arr1后面.
题解:

class Solution {
    public int[] relativeSortArray(int[] arr1, int[] arr2) {
       int[] count = new int[1001];
       // 遍历arr1中的元素并计数,执行完成后此时count中只拥有arr1中各元素的出现次数
       for (int num : arr1) {
       count[num]++;
       }
       int index = 0;
       // 处理arr2中的元素,执行完成后此时count中还不为0的值只剩下arr2中没有的
        for (int num : arr2) {
          while (count[num] > 0) {
            arr1[index++] = num;
            count[num]--;
          }
        }
        // 处理剩余不是arr2中的元素
        for (int i=0; i<count.length; i++) {
          while (count[i] > 0) {
            arr1[index++] = i;
            count[i]--;
          }
       }
     return arr1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值