2022-07-29 day18第一小组 王鸣赫

异常处理

1.下标越界
2.空指针
3.类型转换异常
4.数字格式化
5.算术异常(数学异常)

当一个程序抛出异常时,抛异常后面的语句不再执行,类似于return的功能,终止方法的执行

编译期异常(checked)异常: 在编译时期,就会检查,如果没有处理异常,则编译失败
都是Excetion类及其子类

运行期异常(runtime)异常: 在运行时期,检查异常,在编译时期不会报错
都是RuntimeException类及其子类

throw

在Java中,提供一个throw关键字,它用来抛出异常对象
创建一个异常对象 throw new 异常对象
需要将这个异常通知给调用者,怎么告诉对方,通过throw就可以完成。

捕获异常 try...catch
点击查看代码
 public static void main(String[] args) { 
 int[] arr={2,3,5,6}; 
 int index=8; 
 try{  int ele=getElement(arr,index); 
 System.out.println(ele);
}
 catch (ArrayIndexOutOfBoundsException e){ 
 e.printStackTrace();  
}
 System.out.println("over");
}

 private static int getElement(int[] arr, int index) {
 int ele=arr[index];
 return ele;
}
声明异常throws

如果一个方法内部的代码会抛出检查性异常(checked exception),而方法自己又没有对这些异常完全处理掉,则java的编译器会要求你必须在方法的签名上使用 「throws」 关键字声明这些可能抛出的异常,否则编译不通过。

throws 是另一种处理异常的方式,它不同于try…catch…finally…,throws 关键字仅仅是将方法中可能出现的异常向调用者抛出,而自己则不具体处理。

采取这种异常处理的原因可能是:方法本身不知道如何处理这样的异常,或者说让调用者处理更好,调用者需要为可能发生的异常负责。

finally代码块

finally块不是必须的,通常是可选的。
无论异常是否发生,异常是否匹配被处理,finally中的代码都会执行。
一个try至少要有一个catch块,否则, 至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获和处理异常,处理异常的只能是catch块。
finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
finally块不管异常是否发生,只要对应的try执行了,则它一定也执行。只有一种方法让finally块不执行:「System.exit()」 。

自定义异常

Java 的异常机制中所定义的所有异常不可能预见所有可能出现的错误,某些特定的情境下,则需要我们自定义异常类型来向上报告某些错误信息。

而自定义异常类型也是相当简单的,你可以选择继承 Throwable,Exception 或它们的子类,甚至你不需要实现和重写父类的任何方法即可完成一个异常类型的定义。
public class MyException extends RuntimeException{ }

public class MyException extends Exception{ }

异常的注意事项

1、当子类重写父类的带有 throws声明的函数时,其throws声明的异常必须在父类异常的可控范围内——用于处理父类的throws方法的异常处理器,必须也适用于子类的这个带throws方法 。这是为了支持多态。

例如,父类方法throws 的是2个异常,子类就不能throws 3个及以上的异常。父类throws IOException,子类就必须throws IOException或者IOException的子类。

2、Java程序可以是多线程的。每一个线程都是一个独立的执行流,独立的函数调用栈。如果程序只有一个线程,那么没有被任何代码处理的异常 会导致程序终止。如果是多线程的,那么没有被任何代码处理的异常仅仅会导致异常所在的线程结束。

也就是说,Java中的异常是线程独立的,线程的问题应该由线程自己来解决,而不要委托到外部,也不会直接影响到其它线程的执行。

Throw 和 throws 的区别

位置不同

  1. throws 用方法上,后面跟的是异常类,可以跟多个; 而 throw 用在方法内,后面跟的 是异常对象。 throw new ...
    功能不同:
    throws 声明 异常,表示出现异常的一种可能性,并不一定会发生这些异常;throw 则是抛出 了异常, 执行 throw 则一定抛出了某种异常对象
posted @   404notfond  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示