异常
一,生活中的异常
二,什么是异常
异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
什么是异常处理
Java编程语言使用异常处理机制为程序提供了错误处理的能力
Java中如何进行异常处理
Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws
异常的分类
Throwable:是所有异常(Exception)和错误(Error)的父类Error:错误,程序本身无法解决的问题:比如断电,运行内存不足,电脑坏了,程序不要去处理 Exception:所有异常的父类 分类: 1.运行时异常RuntimeException :代码运行运行之后才会出现的异常 2.非运行时异常CheckedException: 在编译时期就会出现的异常 FileInputStream ins=new FileInputStream("");
常见的异常类型
异 常 类 型 | 说 明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算术错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问 null 对象成员空指针(空指针异常) |
ClassNotFoundException | 不能加载所需的类 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把"abc"转换成数字 |
三,异常处理
1.捕获异常
使用try-catch块捕获异常,分为三种情况:
package com.sk.test;
import java.util.Scanner;
/**
* ClassName: Dome01 <br/>
* Description: <br/>
* date: 2021/12/10 8:20<br/>
*
* @author 斑马<br />
*/
public class Dome02 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
try{//try中放的是 有可能出现异常的代码
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1 + "/" + num2 + "=" + (num1 / num2));
}catch (ArithmeticException e){//catch出现异常之后怎么去处理
//()中放的是有可能出现的异常类型
e.printStackTrace();//打印出现的异常,和异常发生的位置
}
System.out.println("感谢使用本程序!");
}
}
解决异常不匹配:多重catch块
引发多种类型的异常 排列catch 语句的顺序:先子类后父类 发生异常时按顺序逐个匹配 只执行第一个与异常类型匹配的
package com.sk.test;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
* ClassName: Dome01 <br/>
* Description: <br/>
* date: 2021/12/10 8:20<br/>
*
* @author 斑马<br />
*/
public class Dome02 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
try{//try中放的是 有可能出现异常的代码
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1 + "/" + num2 + "=" + (num1 / num2));
}catch (ArithmeticException e){//catch出现异常之后怎么去处理
//()中放的是有可能出现的异常类型
e.printStackTrace();//打印出现的异常,和异常发生的位置
}catch (InputMismatchException e){
e.printStackTrace();
}
System.out.println("感谢使用本程序!");
}
}
tyr catch finally
无论有没有异常都会执行finally块的代码,除非遇见强制退出虚拟机
package com.sk.test;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
* ClassName: Dome01 <br/>
* Description: <br/>
* date: 2021/12/10 8:20<br/>
*
* @author 斑马<br />
*/
public class Dome02 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
try{//try中放的是 有可能出现异常的代码
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1 + "/" + num2 + "=" + (num1 / num2));
}catch (ArithmeticException e){//catch出现异常之后怎么去处理
//()中放的是有可能出现的异常类型
e.printStackTrace();//打印出现的异常,和异常发生的位置
}catch (InputMismatchException e){
e.printStackTrace();
}finally {
System.out.println("感谢使用本程序!");
}
}
}
面试题:
try-catch块中存在return语句,是否还执行finally块,如果执行,说出执行顺序
答:finally会执行,无论是否发生异常都会先执行finally,再去执行return
package com.sk.test;
import java.util.Scanner;
/**
* ClassName: Dome03 <br/>
* Description: <br/>
* date: 2021/12/10 10:13<br/>
*
* @author 斑马<br />
*/
public class Dome03 {
public static int a(){
Scanner sc=new Scanner(System.in);
try{
System.out.println("请输入数字:");
int a=sc.nextInt();
return a;
}catch (Exception e){
e.printStackTrace();
return 0;
}finally {
System.out.println("执行");
}
//报错,永远执行不到
//System.out.println("as");
}
public static void main(String[] args) {
System.out.println(a());
}
}
2.声明异常throws
throws声明某个方法可能抛出的各种异常
package com.sk.test;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
* ClassName: Dome04 <br/>
* Description: <br/>
* date: 2021/12/10 10:23<br/>
*
* @author 斑马<br />
*/
public class Dome04 {
public static int a() throws Exception {//声明了一个异常
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个数字:");
int a=sc.nextInt();
return a;
}
//第一种解决办法 :继续声明,下一个调用者还是要处理,不建议
public static void b() throws Exception {
a();
}
//第二中解决办法:处理异常(捕获) 主动解决
public static void c() {
try {
b();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
c();//c()中已经对异常进行了处理,所有后续的调用者不需要再次处理
}
}
谁调用,谁处理
3.抛出异常 throw
抛出异常之后,必须声明
调用者需要去处理异常
package com.sk.test;
/**
* ClassName: Persion <br/>
* Description: <br/>
* date: 2021/12/10 10:46<br/>
*
* @author 斑马<br />
*/
public class Person {
private String name;
public String getName() {
return name;
}
//抛出异常之后,必须声明
public void setName(String name) throws Exception {
if(name.equals("男")||name.equals("女")){
this.name = name;
}else {
throw new Exception("性别错误");
}
}
public static void main(String[] args) {
Person p=new Person();
try {
p.setName("a");
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getStackTrace());
System.out.println(e.getMessage());
}
}
}