文章目录
Java常见的异常:
(1)编译时异常:Java.lang.Exception
(2)运行期异常:Java.lang.RuntimeException
Java.lang.Exception和Java.lang.Error继承自Java.lang.Throwable;
Java.lang.RuntimeException继承自Java.lang.Exception.
编译时异常:
程序正确,但因为外在的环境条件不满足引发。例如:用户错误及I/O问题----程序试图打开一个并不存在的远程Socket端口。这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发者必须考虑并处理这个问题。Java编译器强制要求处理这类异常(必须处理),如果不捕获这类异常,程序将不能被编译。
运行期异常:
这意味着程序存在bug,如数组越界,0被除,入参不满足规范…这类异常需要更改程序来避免,(可以不处理)。
异常的好处 :
(1) 提高程序健壮性。
异常的体系:
异常的发生过程:
(1)当异常发生时,jvm会封装一个异常对象给调用该方法的对象。如果该对象不能处理该异常,该对象就会向上一层调用该对象的对象进行汇报,如果也解决不了,逐级上报,最终上报到jvm,如果jvm也解决不了,就显示在控制台上,出现异常。
异常的处理方式:
(1) 异常的声明: throws Exception 告诉调用者该方法可能会出现的问题。
①throws
格式 : 权限修饰符 修饰符 返回值类型 方法名称(参数) throws 异常的名称{
}
(2) 异常的捕获(三种形式):try-catch异常的处理
1.try-catch-catch
格式 :
try{
}catch(){
...
}catch(){
...
}
catch可以1个或多个
一般对于不同的异常 最好是使用不同的catch块进行处理。
注意:如果使用父类异常进行捕获,需要子类异常在上,父类异常在下。
要先抓子类异常,子类异常抓不到,再扩大范围抓,或者其他的一把抓。
执行顺序:
从try块开始执行,遇到异常发生,就直接转入catch执行,如果 没有异常发生,只执行try块中的内容,对于try和catch来说,只执行其中的一个。
两个catch只走一个
public class TestTryCatch2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
try {
System.out.println("请输入数字:");
int input = sc.nextInt();
System.out.println(input);
break;
} catch (InputMismatchException e) {
sc.nextLine();
System.out.println("子类异常");
} catch(Exception e) {
System.out.println("父类异常");
}
}
}
}
try和catch只走一个
public static void main(String[] args) {
try {
System.out.println("这是try块----1");
System.out.println("执行结果:"+5/1);
//System.out.println(5/0);
System.out.println("这是try后代码的执行.....4");
}catch (Exception e) {
System.out.println("这是catch块----2");
System.out.println("不能为0-----3");
}
}
没有异常结果:
除数是0时,有异常时结果:
2.try-catch-finally
try{
...
}catch(多个){
...
}finally{
**无论是try 还是catch被执行,最终都会执行finally里的内容**。
}
注意细节1
当 finally块中,也存在return的时候,无论try-catch中是否有return,都需要执行finally里的return,finally中的return会先执行并返回,不建议在finally中加return。
public static void main(String[] args) {
System.out.println(fun());
}
public static int fun() {
try {
return 1;
}catch (Exception e) {
return 2;
}finally {
return 3;
}
}
结果: 3
3.try-finally
格式:
try{
}finally{
最终执行的内容
}
异常的使用,throw 异常对象
throw new 异常对象(参数)
public class TestThrowExc {
public static void main(String[] args) {
try {
fun(1,0);
} catch (Exception e) {
System.out.println(e.getMessage());//返回异常信息的详细消息字符串
e.printStackTrace();//打印堆栈信息
}
}
public static void fun(int a , int b) throws Exception{
if(b == 0) {
//当我创建异常之后,会报错,因为我没有声明。等我抛出异常之后,调用它要处理异常或也声明异常。
//但是创建运行时异常,可以不声明
throw new Exception("我自己创建的 除0 异常。");
// throw new RuntimeException("");
}
}
}
结果:
异常体系
1.编译期异常:Exception 在编译时,不处理就不能执行。
2.运行期异常:RuntimeException 在编译时,可以处理也可以不处理,但是运行期有可能报异常。
自定义异常类
要继承Exception类或者RuntimException。
public class newException extends Exception {
private static final long serialVersionUID = 1L;
// 无参构造
public new Exception() {
}
public MyException(String message) {
super(message);// 可以显示自定义信息
}
}
总结
处理异常有两种方式,一种是在方法上throws
异常,一种是抓异常,try-catch
。
使用异常可以在想抛异常的地方,或者想改自定义异常信息的地方 throw new Exception("message")
; 注意throw
了之后就要处理异常,需要try-catch
或者在方法上throws 异常
。
运行时异常(RunTimeException)可以不处理。不强制要求处理,看自己需求。