异常 学习笔记

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)可以不处理。不强制要求处理,看自己需求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值