异常:
定义:异常通俗来讲,其实就是你写出bug来了,编译器给你报错了。
public static void main(String[] args)throws Exception {int z=10/0;}
这个代码虽然说是可以运行,但是编译器会报错。
因为10不能去除以0。
异常分为两种,一种是运行时异常,另一种时编译时异常(就是运行到那就不会再运行了),然后异常都是一个类异常new出来的对象我们去接收就行了。
首先我们要知道异常类最大的爹是Exception,然后往下细分出很多,这里不举例api文档有。
编译时异常:
跟这个差不多。
捕获异常:
我们一个是发现了异常并解决异常(温柔的方式)。另一种是直接让你编译时异常(暴力的方式),让你程序直接崩掉,有点像c++中的assert。
温柔的方式:
我们需要将可能出现异常的代码写在try里边然后再用catch去捕获异常
try {int i=10/0;//出现异常会去new一个异常类}catch (RuntimeException e) //e去捕获了new出来的异常类{System.out.println("10不能去除以0");//打印为什么错了}
这个方法不会让你的程序停止,会继续运行。
暴力的方式:
暴力的方式就是我们向上抛出异常
这个图应该很形象,但是这是编译器自己弄识别的,但是我们也可以自己去创建一个异常。
我们就来举个栗子:首相我们来个场景,我们需要去获取一个0-120的年龄,由用户自己输入,然后如果输入错了就直接抛出异常并终止程序。
public static void get(int a)throws Exception//2.去获取到异常{if(a>=0&&a<=120){}else {throw new Exception("请输入0-120的数字");//1.创建一个异常向上抛出}}public static void main(String[] args) throws Exception{ //4.获取主方法代码存在的异常Scanner sc=new Scanner(System.in);get(sc.nextInt());//3.获取到了异常并且抛出异常}
因为这个异常时一级一级传的,最终要到jvm里边,所以我们需要这样写。这就是另一种场景,但是作为用户你不想让程序崩掉,想以温柔的方式提醒,并且改正,这时候需要怎么办呢?
我们就可以这样设计:
public static void get(int a)throws Exception{if(a>=0&&a<=120){}else {throw new Exception("请输入0-120的数字");}}public static void main(String[] args){Scanner sc=new Scanner(System.in);while(true){try {get(sc.nextInt());//去get一个年龄break; //get到了就退出循环} catch (Exception e) {System.out.println("请重新输入");}}}
这种方法还是非常喵~的。最简单的两种方法就搞好了。
常见异常方法:
getMessage:
就是返回你带参构造的那串字符,所以我们就可以这样用了
打印的就是你传入的字符。
printStackTrace:
就是打印原本的异常(就是红字的那种异常),并且不让你的程序崩掉。举个栗子:
还需运行下面的代码
自定义异常:
我们其实也可以去写一个异常类,比如我们在get年龄的时候我们可以自己去造一个,这样也可以提高代码的可读性。
class getageException extends RuntimeException//继承运行异常类
{public getageException() {}public getageException(String message) {super(message);}
}public class exception {public static void get(int a)throws Exception{if(a>=0&&a<=120){}else {throw new getageException("请输入0-120的数字");}}public static void main(String[] args) throws Exception{Scanner sc=new Scanner(System.in);while(true) {try {get(sc.nextInt());break;} catch (getageException e) {System.out.println(e.getMessage());}}}
}
其实我感觉有点鸡肋在这种场景,写法上有点装b,你为什么不直接用个循环呢?
比如这样写:
但是你不得不承认,他在z=10/0;这种场景很好用!~