抛出(throw)异常,声明异常(throws)和捕获异常(try...catch)

异常:指的是程序在运行的过程中发生的不正常事件

注意:针对java应用程序抛出的错误,我们通常会使用try-catch语句块对该错误进行捕获

预计下面的代码有可能会抛出一个算术异常
         try-catch语句块的格式:
          try{
             预计会抛出异常的代码块:
          }catch(异常类型 异常变量){
             如果捕获到异常,那么对异常进行处理的异常块
             (一般都是给一段提示语)
          }


          注意:

          1.一旦在try里面抛出了异常,那么抛出的异常的语句块下面的代码
             就不会继续执行了
          2.try-catch结构中,可以有多个catch语句块,代表着可以精确地捕获多种异常,
             但是要注意,越往后面的catch,捕获的异常类型一定要比前面的异常类型大
          3.通常情况下,我们使用try-catch并不是主动的,而是被动的
          4.try-catch语句块是可以没有catch的,但是必须在try的后面加上
            finally语句块

finally是一个一定都会执行的语句块,return都不能阻止它的执行,唯一能让这个语句块不运行的方法是System.exit(1);这个是直接退出.

常见异常类型:
      NullPointerException:空指针异常
      ArrayIndexOutOfBoundsException:数组下标越界异常
      ClassNotFoundException:没有找到类异常(路径异常)
      InputMismatchException:输入不匹配异常
      ClassCastException:类型转换异常(强制转换)
    NumberFormatException:数字转换异常
    IllegalArgumentException:接收到非法参数异常

 另外还有两句话是常用的,写在catch语句中

e.printStackTrace();//调用程序自带的异常信息提示

 String str = e.getMessage();//获取异常的详细信息

下面给出一段try...catch的常见应用场景

        int a=10;
        int b=0;
try {
			//System.exit(1);//唯一能让finally不执行语句
			num=a/b;
			System.out.println("123"+num);//这句话就不会执行了
		} catch (Exception e) {
			//日志打印
			e.printStackTrace();//调用程序自带的异常信息提示
			String str = e.getMessage();//获取异常的详细信息
			System.out.println("除数为0了");//catch里面通常都是一句输出语句
		}finally{
			System.out.println("一定会执行的代码块");//这句话一定会执行,遇到return也会执行
		}
		
			

注意:一般情况下,有throw就必定会有throws,但是当我们throw 的异常对象是RuntimeException
        或者是他的子类异常对象的时候,我们是可以省略掉throws的

thows和thow的几种情况

throws是一种声明,作用是声明这个方法中有什么样的异常,

1.一般来说,方法中抛出什么异常就声明什么异常,

2.但是如果声明的异常跟抛出的异常不一样且不是它的父类,就会报错.

3.如果有thow没有thows这种情况只有抛出的异常是RuntimeException的子类才不会报错.

4.如果有thows没有throw,那么就可以看做事隐藏了thow,实际抛出什么异常就按照有thow的情况处理.

RuntimeException和Checked


     RuntimeException:运行时异常
     Checked:非运行时异常

try{
					print();
				}catch(ArithmeticException e){
					System.out.println("我有病");
				}
				
			
	}
	
	public static int print() throws RuntimeException{
		int a=10;
		int b=1;
		if(b!=0){//这个抛出异常的条件可以自己定,这里是只要b不为0就抛出异常,所以即使这个语句本身没 
                    //有异常,也抛出了一个异常
			throw new ArithmeticException();
		}
		return a/b;
	}
}


今天还讲了一个自定义异常的方法:

1.创建一个自定义的异常类
  2.继承Exception异常类
 3.重写里面的所有方法(需要进入到Exception类中复制,改名字)

以下是自定义的一个SexException异常

public class SexException extends Exception{

	private static final long serialVersionUID = -3585885198028832020L;

	public SexException() {
        super();
    }

    public SexException(String message) {
        super(message);
    }

    public SexException(String message, Throwable cause) {
        super(message, cause);
    }

    public SexException(Throwable cause) {
        super(cause);
    }

    protected SexException(String message, Throwable cause,
                        boolean enableSuppression,
                        boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

这是捕获异常的代码

import java.util.Scanner;

public class Demo2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		try{
			String str = sc.next();
			print(str);
			
		}catch(SexException e){
			System.out.println("性别异常");
			e.printStackTrace();
		}
	}
	
	public static void print(String str) throws SexException{
		
		
		if(!("男".equals(str))){
			throw new SexException();
		}
}
}

这个代码是只要输入的值不是"男",就会抛出这个异常,感觉用得挺少的,不过这也可以避免在工作中碰到有一些人为定义的异常,就比如性别,这个东西虚拟机不会认为是一个异常,需要人为定义,这样对用户比较友好.

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值