/*
异常:java程序编译或者运行时遇到的错误
java中的异常分为3种:
Throwable:
Error: 错误
Exception:
编译时期异常(除了运行时期的异常全是编译时期异常)
RuntimeException(运行时期异常)
Throwable中的方法
getMessage() 获取异常信息,返回字符串。
toString() 获取异常类名和异常信息,返回字符串。
printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。最常用,显示的更明显
printStackTrace(PrintStream s) 通常用该方法将异常内容保存在日志文件中,以便查阅。
举例,该例子仅上课使用,如现实生活遇到,概不负责。魏一民想要去大蜀山,骑哈罗电单车去,骑车骑到一半没电了(编译时期异常),应该是在出发
前就应该检查的问题;骑车在大蜀山的路上,遇到了钉子,轮胎漏气了,这个是骑车的过程种遇到的问题(运行时期异常);大蜀山火山喷发了,
挡住了前进的路,这个问题就属于非常严重的问题(Error)。
java遇到程序遇到问题时,默认的处理方案是:结束java进程,报错。
如何处理异常
原则:
如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
区别:
后续程序需要继续运行就try
后续程序不需要继续运行就throws
举例:
感冒了就自己吃点药就好了,try
吃了好几天药都没好结果得了新冠,那就的得throws到医院
如果医院没有特效药就变成Error了
*/
/*
异常的处理方案:
1、try...catch...finally
2、throws
方案1:
try{
可能会出错的代码;
}catch(异常类 参数){
处理的方案逻辑;
}finally{
一般是释放资源的代码
}
try..catch..注意事项:
1、try中定义变量作用域就在try种使用
2、若try中代码没有异常,是不会匹配catch的
3、catch若没有try出现的异常类型的话,就会使用java默认处理异常方案
4、catch可以写多个,也可写一个,但是若多个catch存在继承关系的话,将父亲放在儿子的后面
5、若使用jdk1.8新特性写法,使用一个catch接收多个异常类的话,不允许出现父子关系异常
*/
package com.shujia.day15;
public class ExceptionDemo3 {
public static void main(String[] args) {
try {
int a = 10;
System.out.println(a / 2); // new ArithmeticException()
} catch (ArithmeticException e) {// ArithmeticException e = new ArithmeticException()
// System.out.println(e.getMessage());
// System.out.println(e.toString());
e.printStackTrace();
}finally { // 无论try中的代码是否出现问题,这里的代码都会执行
//一般情况下,finally里面写释放资源的代码
System.out.println("好好学习,天天向上!");
}
System.out.println("hello world");
System.out.println("魏一民真帅!");
}
}
package com.shujia.day15;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
/*
异常处理的第二种方案:throws 实际上并没有处理类似于甩锅,抛出异常给调用者
在方法的定义小括号后面加异常类名。可以同时抛出多个异常类,表示该方法可能会出现某个异常,表示可能性
throw关键字,在方法内部使用,后面跟着是一个具体的异常对象,表示一定会发生某个异常
举例,该故事纯属虚拟,仅供上课案例。徐思远是一个快乐的小矿工,有一天,正常挖矿(java程序运行),突然挖到一颗远古炸弹(遇到了异常)
,开始将炸弹往洞口传递(throw),到了洞口给到了矿场管理者,管理者引爆了炸弹(try..catch)。
throws抛出的若是编译时期异常,调用者必须要进行处理,否则程序无法通过遍历。
若抛出的是运行时期异常,可以不处理,可以运行
*/
public class ExceptionDemo4 {
public static void main(String[] args){
// try {
// fun1();
// }catch (Exception e){
// e.printStackTrace();
// }
//
// System.out.println("oveer");
// fun1();
// try {
// fun2();
// }catch (Exception e){
// e.printStackTrace();
// }
fun1();
// fun2();
}
public static void fun2() throws FileNotFoundException {
FileInputStream fis = new FileInputStream("xxx");
}
public static void fun1() throws ArrayIndexOutOfBoundsException{
int[] arr = {1, 2, 3, 4};
Scanner sc = new Scanner(System.in);
System.out.println("请输入要查询的索引:");
int index = sc.nextInt();
if (index >= 0 && index <= arr.length - 1) {
System.out.println(arr[2]);
} else {
throw new ArrayIndexOutOfBoundsException();
}
System.out.println("hello world");
}
}