异常
1.异常处理
1.1 try-catch
try 尝试,表示将可能出现异常的代码存放在try中
try不能单独出现,必须结合catch或者finally使用
catch 捕获,表示捕获对应的异常在catch代码块中处理
情况1:
捕获的异常和出现的异常相同,可以捕获到异常,不会中断程序
public static void main(String[] args) {
try {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1+"/"+ num2 +"="+ num1/ num2);
}catch(InputMismatchException e) {
e.printStackTrace();
// System.err.println("异常捕获到了,出现了输入不匹配异常");
}
System.out.println("感谢使用本程序!");
}
情况2:出现的异常和捕获的异常不同,依然会中断程序
public static void main(String[] args) {
try {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1+"/"+ num2 +"="+ num1/ num2);
}catch(InputMismatchException e) {
e.printStackTrace();
// System.err.println("异常捕获到了,出现了输入不匹配异常");
}
System.out.println("感谢使用本程序!");
}
情况3:如果一段代码中有可能出现多个异常,我们可以使用多个catch块处理
public static void main(String[] args) {
try {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1+"/"+ num2 +"="+ num1/ num2);
}catch(InputMismatchException e) {
e.printStackTrace();
// System.err.println("异常捕获到了,出现了输入不匹配异常");
}catch(ArithmeticException e) {
e.printStackTrace();
System.err.println(e.getMessage());
}
System.out.println("感谢使用本程序!");
}
情况4:可以统一写一个异常父类,来对应所有的异常
异常catch块书写顺序:先子类,后父类
public static void main(String[] args) {
try {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1+"/"+ num2 +"="+ num1/ num2);
}catch(InputMismatchException e) {
e.printStackTrace();
}catch(ArithmeticException e) {
e.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("感谢使用本程序!");
}
1.2 finally
finally 最终,表示最终不管是否出现异常,以及异常是否被捕获到,都将执行的代码
finally不能单独出现,必须结合try或者try-catch使用
public static void main(String[] args) {
try {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1+"/"+ num2 +"="+ num1/ num2);
}catch(InputMismatchException e) {
e.printStackTrace();
}finally {
System.out.println("感谢使用本程序!");
}
}
finally不执行的唯一情况:在finally执行前退出JVM虚拟机
System.exit(int status); //状态码 0 表示正常退出,非 0 表示非正常退出
目前写哪个数值都可以退出,没有任何区别
public static void main(String[] args) {
try {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1+"/"+ num2 +"="+ num1/ num2);
System.exit(1);
}catch(InputMismatchException e) {
e.printStackTrace();
}finally {
System.out.println("感谢使用本程序!");
}
}
finally结合try使用
public static void main(String[] args) {
try {
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1+"/"+ num2 +"="+ num1/ num2);
}finally {
System.out.println("感谢使用,程序结束");
}
}
以下代码 在finally中对返回值的操作 不会影响返回值
实际开发中 不推荐在finally中对返回值做操作
执行顺序:先执行try中return 再执行finally 最后再次执行finally中的代码,还使用最初确定的返回值
public static void main(String[] args) {
System.out.println(m1()); //11
}
public static int m1() {
int num = 10;
try {
num ++;
return num;
} catch (Exception e) {
e.printStackTrace();
}finally {
num ++;
}
return num;
}
1.3 throw和throws
throw表示抛出异常
抛出的异常分为两大类:
1.检查异常 CheckedException 调用者必须处理,要么try-catch,要么继续往后声明
2.运行时异常 RuntimeException 调用者不是必须处理
throws 表示声明异常
throw和throws的区别
| throw | throws |
| ---- | ---- |
| 生成并抛出异常 | 声明方法内抛出了异常 |
| 位于方法体内部,可作为单独语句使用 | 必须跟在方法参数列表后边,不能单独使用 |
| 抛出一个异常对象,且只能是一个 | 声明抛出异常对象,可以跟多个异常 |
import java.io.FileNotFoundException;
public static void main(String[] args) throws ClassNotFoundException, FileNotFoundException {
m1(10);
m2(10);
}
public static void m1(int num){
if(num % 3 == 1) {
throw new ClassCastException("类转换异常");
// System.out.println(); 不可达代码
}else {
throw new ArithmeticException("算数运算异常");
}
}
public static void m2(int num) throws ClassNotFoundException, FileNotFoundException {
if(num % 3 == 1) {
throw new ClassNotFoundException("类没有找到");
}else {
throw new FileNotFoundException("文件没有找到");
}
}
2.自定义异常
当JDK中的异步类型不能满足程序的需要时,可以自定义异常类
public class Student {
private String name;
private int age;
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
if(sex.equals("男") || sex.equals("女")) {
this.sex = sex;
}else {
throw new SexNotFoundException("sex error!");
}
}
// alt + s + r
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws InputAgeException {
if(age >= 0 && age <= 130) {
this.age = age;
}else {
throw new InputAgeException("年龄不合适");
}
}
public static void main(String[] args) {
Student stu = new Student();
stu.setName("赵四");
try {
stu.setAge(130);
} catch (InputAgeException e) {
e.printStackTrace();
}
stu.setSex("母");
}
}
public class InputAgeException extends Exception{
private static final long serialVersionUID = -5819204170683788513L;
public InputAgeException(String message) {
super(message);
}
}
public class SexNotFoundException extends RuntimeException{
private static final long serialVersionUID = 1L;
// alt + s 选择从父类生成构造方法
public SexNotFoundException(String message) {
super(message);
}
}