Java 基础知识——异常处理

Java 基础知识——异常处理

回顾:
Java 基础知识——基础语法
Java 基础知识——类与对象
Java 基础知识——抽象类、接口和内部类
Java 基础知识——泛型


一、 异常分类

错误: Error类以及他的子类的实例,代表了 JVM 系统内部错误、资源耗尽等严重情况。是脱离程序员控制的问题。因此,程序员应该关注Exception为父类的分支下的各种异常类。错误在代码中通常被忽略。例如:

当栈溢出时,一个错误就发生了,它们在编译是检查不到的。

运行时异常: 是指 编译器不要求强制处置的异常, 可以在编译时被忽略。运行时异常是可能被程序员避免的异常。示例:

空指针访问异常、除以 0 溢出异常、数组下标越界异常、错误类型转换异常。

检查型异常: 是指 编译器要求必须处置的异常, 最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。示例:

访问不存在文件的异常、找不到指定名称类的异常、操作数据库时异常、操作文件时异常。

Exception以及子类。
在这里插入图片描述

二、 异常捕获处理 (try-catch-finally)

Java的异常处理是通过5个关键字来实现的:try监视检测、catch捕获处理、 finally总要被执行、throwthrows(抛出异常)。

捕获异常

try:执行可能产生异常的代码。
catch:捕获异常。
finally:无论是否发生异常,代码总能执行。

public void method(){
    
     
	try {
    
           
		// 代码段 1       
		// 产生异常的代码段 2       
		// 代码段 3 
	} catch (异常类型 ex) {
    
    
	    // 对异常进行处理的代码段4 
	} 
   // 代码段5 
} 

在这里插入图片描述

1、异常的处理
import java.util.Scanner;
/**
 * 使用try-catch-finally进行异常处理。
*/
public class Test4 {
    
    
    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        System.out.print("请输入被除数:");
        try {
    
    
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(String.format("%d / %d = %d",
                    num1, num2, num1/ num2));
        } catch (Exception e) {
    
    
            System.err.println("出现错误:被除数和除数必须是整数," +
                    "除数不能为零。");
            System.out.println(e.getMessage());
            //System.exit(1); // finally语句块不执行的唯一情况
        } finally {
    
    
            System.out.println("感谢使用本程序!");
        }
    }
}
2、多重 catch 异常处理

多重catch异常要求:子类在前、父类在后、平级均可。

import java.util.Scanner;
import java.util.InputMismatchException;
/**
 * 多重catch块。
*/
public class Test7 {
    
    
  public static void main(String[] args) {
    
    
      Scanner in = new Scanner(System.in);
      System.out.print("请输入被除数:");
	  	try {
    
    
          int num1 = in.nextInt();
          System.out.print("请输入除数:");
          int num2 = in.nextInt();
          System.out.println(String.format("%d / %d = %d", 
                  num1, num2, num1/ num2));
      } catch (InputMismatchException e) {
    
    
          System.err.println("被除数和除数必须是整数。");
      } catch (ArithmeticException e) {
    
    
          System.err.println("除数不能为零。");
      } catch (Exception e) {
    
    
          System.err.println("其他未知异常。");
      } finally {
    
    
          System.out.println("感谢使用本程序!");
      }
   }
}
3、嵌套异常处理
try {
	try {
	 	......
	} catch {
		......
	}
} catch { 
	......
}
4、finally 关键字

finally 关键字必须和 try 结合使用,不可单独使用。表示无论成功与否都要执行的代码,常用使用方法有: try-finallytry-catch-finally

public void method(){
    
     
	try {
    
           
		// 代码段        
		// 产生异常的代码段       
		// 代码段 
	} catch (异常类型 ex) {
    
    
	    // 对异常进行处理的代码段
	} finally {
    
    
		// 总要执行的代码段
	}
} 
三、 声明抛出异常 (throws、throw)

throws 声明抛出异常: 声明方法可能要抛出的各种异常。

不知道目前如何处理所出现的异常,可在定义方法时,声明抛出(throws)异常。即一个方法可能引发异常,而它本身不对该异常处理,那么该方法必须声明将这个异常抛出,使得程序能够继续执行下去。

public static void throwChecked(int a) throws Exception // 抛出异常
	{
    
    
		if (a > 0)
		{
    
    
			// 自行抛出Exception异常
			// 该代码必须处于try块里,或处于带throws声明的方法中
			throw new Exception("a的值大于0,不符合要求");
		}
	}

throw 手动抛出异常

throw 用来明确地抛出一个异常。用户必须得到一个 Throwable 类或其他子类产生的对象引用。

示例:

public class Person {
    
    
	private String name = "";   // 姓名
	private int age = 0;   // 年龄
	private String sex = "男";  // 性别
	public void setSex(String sex) throws Exception {
    
    
		if ("男".equals(sex) || "女".equals(sex))
			this.sex = sex;
		else {
    
    
			throw new Exception(“性别必须是\"男\"或者\"女\"!");
		}
	}
}

在实际应用中,一般需要 throw throws 语句组合应用,可在捕获异常后,抛出一个明确的异常给调用者。throws 语句编写在方法签名之后,throw 语句编写在方法之中。且 throws抛出异常的范围要大于等于throw异常的范围。

四、 自定义异常

猜你喜欢

转载自blog.csdn.net/qq_46201146/article/details/125919771
今日推荐