Java常见的异常(这个不知道面试官直接Pass)

本文详细讲解Java中异常的分类(检查异常、运行时异常和错误)、常用异常类、处理方式(try-catch-finally),以及自定义异常的创建和使用。涵盖IOException、NullPointerException等常见异常,并演示如何通过throws和throw关键字处理和抛出异常。

        Java中所有的异常类都是是从 java.lang.Exception 类继承的子类。Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。

检查异常:

        用户错误或问题引起的异常,这是程序员无法预见的。是除了Error, RuntimeException的其它异常。

运行时异常:

        运行时异常是可能被程序员避免的异常。Error 和 RuntimeException 以及他们的子类。

错误:

        错误不是异常,而是脱离程序员控制的问题。通常的做法是通知用户并中止程序的执行。

常见异常

  • 输入输出异常:IOException
  • 算术异常类:ArithmeticExecption
  • 空指针异常类:NullPointerException
  • 类型强制转换异常:ClassCastException
  • 文件未找到异常:FileNotFoundException
  • 数组下标越界异常:ArrayIndexOutOfBoundsException
  • 字符串索引越界异常:StringIndexOutOfBoundsException
  • 转码异常:UnsupportedEncodingException
  • 读取网络异常:SocketException
  • 非法参数异常:IllegalArgumentException
  • 输入类型不匹配异常:InputMisMatchException
  • 数组负下标异常:NegativeArrayException
  • 文件已结束异常:EOFException
  • 字符串转换为数字异常:NumberFormatException
  • 方法未找到异常:NoSuchMethodException
  • 操作数据库异常:SQLException

常用异常方法

  • getMessage():获取异常的详细信息。
  • toString():使用getMessage()的结果返回类的串级名字。
  • printStackTrace():错误输出流。

异常处理

        对检查异常处理的方式:使用 try…catch…finally 语句块处理;在函数定义中使用 throws 声明。

语法:

try{
    // try 块中放可能发生异常的代码。
}catch(ArithmeticException arithexception){
    // 1.每一个 catch 块用于捕获并处理一个特定的异常,或者异常类型的子类。
    // 2.catch 后面括号中定义了异常类型和异常参数。
    // 3.在 catch 块中可以使用这个块的异常参数来获取异常的相关信息。
    // 4.如果 try 块中发生的异常在所有catch中都没捕获到,则去执行finally,然后到这个函数的外部 caller 中去匹配异常处理器。
    // 5.如果 try 中没有发生异常,则所有的catch块都不执行。
}catch(Exception exception){
    // 捕获异常
}finally{
    // 1.finally 块是可选的。
    // 2.无论异常是否发生,finally 都会执行。
    // 3.一个 try 至少要有一个 catch 块,或者至少要有一个 finally 块。
    // 4.finally 块主要做一些关闭清理工作,如关闭文件,关闭数据库连接等。 
}

示例:

package com.exception;
public class test {
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		compute();
	}

	public static void compute() {
		try {
			double num = 10 / 0;
			System.out.println(num); 
		}catch(ArithmeticException exp){
			System.out.println(exp.getMessage().toString());
		}finally {
			System.out.println("执行finally块");
		}
	}
}

关键字 throws/throw

        如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明,throws 关键字放在定义方法的尾部。

也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

throws 语法:

        修饰符 返回值类型 方法名(参数) throws 异常类名1, 异常类名2, ... { 代码块 }

package com.exception;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class test {

	public static void main(String[] args) throws FileNotFoundException {
		// TODO 自动生成的方法存根
		readFile();
	}
 
	public static  void readFile() throws FileNotFoundException {
        InputStream file = new FileInputStream("E:/test.txt");
    }
}

throw 语法:

        throw new xxxException();

        其中 xxxException 必须是 Exception 的派生类。

        注意:throw 出的是1个异常对象,所以 new 不能省略。

自定义异常

        除了JDK定义好的异常类外,我们可以根据自身业务情况自定义异常处理类。

        编写自定义异常类注意点:

                1.所有异常都必须是 Throwable 的子类。

                2.如果写检查性异常类,则需要继承 Exception 类。

                3.如果写运行时异常类,则需要继承 RuntimeException 类。

        语法:修饰符 class 类名 extends Exception { 代码块 }

package com.exception;
/**
 * 自定义异常类
 * 登录失败异常信息类
*/
public class LoginFailException extends RuntimeException {
	public LoginFailException() {
        super();
    }
    public LoginFailException(String message) {
        super(message);
    }
    public void printStackTrace(){ 
    	//overwrite  
        super.printStackTrace();  
        System.out.printf("This is a LoginFailException excetpion\n");    
    }  
}
public class test {

	public static void main(String[] args){
		// TODO 自动生成的方法存根
		Boolean isLogin = false;
		if(!isLogin) {
            // 登录失败,抛出异常
			throw new LoginFailException("Login is fail");
		}
	}
}

 小结:

注意finally有几个特点:

​​​​​​        1.finally语句不是必须要写的,可写可不写。

        2.finally总是最后执行。

         3.如果没有发生异常,就正常执行try{...}语句块,然后执行finally。如果发生了异常,就中断执行try{...}语句块,然后跳转执行匹配的catch语句块,最后执行finally,可见finally是用来保证一些代码必须执行的。

        4.多个catch语句的匹配顺序非常重要,子类必须放在前面。

        5. finally语句保证了有无异常都会执行,它是可选的。

        6.一个catch语句也可以匹配多个非继承关系的异常。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小陈呀~

您的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值