public class Main {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method() {
int [] arr = {1 , 2 , 3};
System.out.println(arr[3]);
}
/*
* Exception in thread "main" 开始 java.lang.ArrayIndexOutOfBoundsException: Index
* 3 out of bounds for length 3 at project01/抽象类.Main.method(Main.java:15) at
* project01/抽象类.Main.main(Main.java:9)
*
*
*
* ArrayIndexOutOfBoundsException //异常的类名
* Index 3 out of bounds for length 3 //异常的原因
* at project01/抽象类.Main.method(Main.java:15) project01/抽象
类.Main.main(Main.java:9) //异常的位置
*/
}
异常:就是程序出现了不正常的情况
JVM的默认处理办法
如果程序出现了问题,我们没有做任何处理,最终JVM会做默认处理:
把异常的名称,异常的原因及异常出现的位置等信息输出在了控制台
程序停止运行
异常处理之try...catch
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}
执行流程:
程序从try里面的代码开始执行
出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统
当Java运行时系统接受到异常的对象时,会到catch中去找匹配的异常类,找到后进行异常的处理
执行完毕之后,程序还可以继续往下执行
public static void method() {
try {
int [] arr = {1 , 2 , 3};
System.out.println(arr[2]);
}catch(ArrayIndexOutOfBoundsException e) { //e可以变 前面很长的部分就是错误的名字
System.out.println("你访问的索引不存在");
}
}
以上即是没有处理异常时运行的结果
Throwable的成员方法
Throwable是所有错误和异常的祖宗类
try {
int [] arr = {1 , 2 , 3};
System.out.println(arr[3]);
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage()); //返回出现异常的原因
System.out.println(e.toString()); //输出异常的原因和类名
e.printStackTrace(); //将错误信息输出在控制台
}
编译时异常与运行时异常
也成为受检异常和非受检异常
RuntimeException类及其子类被称为运行时异常,其他异常都成为编译时异常
异常处理之throws
因为try...catch 对于所有异常并不是都有权限处理
格式:
thows 异常类名;
这种格式是跟在方法的括号后面
public static void method2() throws ParseException {
String s = "2021-10-7";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}
这样程序就可以往下执行
import java.util.Date;
public class Main {
public static void main(String[] args) {
System.out.println("开始");
method();
try {
method2();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("结束");
}
编译异常时必须进行处理,两种方案,一种是try...catch,一种是throws,如果采用throws,则将来谁调用谁处理
运行时异常,可以不处理,需要我们返回来修改代码
自定义异常
class ScoreException extends Exception{
public ScoreException (){
}
public ScoreException(String message) {
super(message);
}
}
以上就是自定义的一个异常
class teacher {
public void score (int score) throws ScoreException{ //抛出异常
if(score < 0 || score > 100) {
throw new ScoreException (); //注意此处的新知识 , 括号里面可以增加信息,会作为输出结果
} else {
System.out.println("分数正常");
}
}
}
class teacher {
public void score (int score) throws ScoreException{
if(score < 0 || score > 100) {
throw new ScoreException ("你给的分数不在0-100之间");
} else {
System.out.println("分数正常");
}
}
}
throw和throws的区别
throws
用在方法声明后面,跟的是异常类名
表示抛出异常,由该方法的调用者来处理
表示出现异常的一种可能性,并不一定会发生这些异常
throw
用在方法体内,跟的是异常对象名
表示抛出异常,由方法体内的语句处理
执行throw一定抛出了某种异常