异常:指的是程序在运行的过程中发生的不正常事件
注意:针对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();
}
}
}
这个代码是只要输入的值不是"男",就会抛出这个异常,感觉用得挺少的,不过这也可以避免在工作中碰到有一些人为定义的异常,就比如性别,这个东西虚拟机不会认为是一个异常,需要人为定义,这样对用户比较友好.