异常类的继承
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;
}
}