异常

在运行时发生的不正常情况 描述不正常情况的类就是异常类 异常就是java通过面向对象的思想将问题封装成对象,用异常类进行描述 不同的问题用不同的描述

问题很多,描述的类也很多,将共性向上抽取,形成了异常体系,最终分成了两大类 Throwable:Thowable及其所有的子类都具有可抛性,throws,throw

  1. 一般不可处理的 Error,子类由Error结尾:是由jvm抛出的严重性问题,一般处理不了,请修改程序
  2. 可处理的 Exception,子类由Exception结尾

throw

throw new NullPointerException();

自定义异常类

public class FushuIndexException extends Exception {
    public FushuIndexException() {
    }
    public FushuIndexException(String message){
        super(message);
    }
}

异常的分类

Java异常可分为3种:

  (1)编译时异常:Java.lang.Exception

  (2)运行期异常:Java.lang.RuntimeException

  (3)错误:Java.lang.Error

error和exception之间的区别:

error表示恢复不是不可能但很困难的情况下的一种严重问题。 比如说内存溢出。不可能指望程序能处理这样的情况。exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

各种异常/错误出现的场景:

编译时异常: 程序正确,但因为外在的环境条件不满足引发。例如:用户错误及I/O问题----程序试图打开一个并不存在的远程Socket端口。这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发者必须考虑并处理这个问题。Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。

运行期异常: 这意味着程序存在bug,如数组越界,0被除,入参不满足规范.....这类异常需要更改程序来避免,Java编译器强制要求处理这类异常。

错误: 一般很少见,也很难通过程序解决。它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而有运行环境处理。

  1. 编译时被检测异常,除RuntimeException其他的 函数头需要throws ..... 这种问题可以针对性处理 直接抛出,交给虚拟机处理
  2. 编译时不检测异常(运行时异常 RuntimeException) 编译时不报错 这种问题一般不处理,直接编译通过,运行时报错,强制程序必须处理的问题

异常输出函数

getMessage():自定义信息 e.toString():异常类名+信息 printStackTrace():打印堆栈,JVM默认异常处理方法

多catch

catch(Exception e){} 父类catch必须放在最后,否则会报错

异常处理的原则

  1. 函数内如果显示抛出异常,函数名上必须要声明异常,否则必须用try扑捉
  2. 如果调用了抛出异常的函数,要么try要么继续抛
  3. 可以解决就catch,不能解决就trows
  4. 抛了几个异常,就必须有几个catch处理

注意

  • 父类抛出了异常,子类可以抛出,也可以不抛出,如果抛出,必须是父类异常的子类
  • 如果父类抛出多个异常,子类只能抛出父类异常的子集
  • 父类没有异常,子类如有异常,必须用try/catch,不能方法抛出
  • 先执行finally,再执行catch里的return
public static void main(String[] args) {
    
    Scanner scanner = new Scanner(System.in);
    try {
        System.out.println("输入除数");
        int num1 = scanner.nextInt();
        System.out.println("输入被除数");
        int num2 = scanner.nextInt();
        double result = num1 / num2;
        System.out.println(num1+"/"+num2+"="+result);
    } catch (Exception e) {
        System.err.println("除数不能为0");
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
    finally {
        System.out.println("finally");
    }
    
}
import java.io.File;
import java.io.IOException;

import javax.imageio.IIOException;
import javax.naming.directory.AttributeInUseException;
import com.sun.org.apache.bcel.internal.classfile.Field;

public class TestExtendExp {
	public static void main(String[] args) {
		Person person = new Person();
		person.fun();
	}
}
class Person{
	
	public void show() throws IOException {
		
	}
	public void method() {
		
	}
	public void fun() {
		throw new ArrayIndexOutOfBoundsException(0);
	}
}
class son extends Person{
	
	//父类抛出了异常,子类可以抛出,也可以不抛出,如果抛出,必须是父类异常的子类
	@Override
	public void show(){ 
		//Exception Exception is not compatible with throws clause in Person.show()
	}
	
	//父类没有异常,子类如有异常,必须用try/catch,不能方法抛出
	@Override
	public void method(){
		////Exception Exception is not compatible with throws clause in Person.show()
		
		try {
			File file = new File("c:/e.txtg");
			file.createNewFile();
			throw new IOException();
		} catch (Exception e) {
			// TODO: handle exception
		}
		
	}
	//抛出运行时异常,什么时候都可以
	@Override
	public void fun() {
		try {
			throw new IOException();
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
}

常见异常

  1. 运行时异常 RuntimeException a) 算术异常 ArithmeticException b) 空指针异常 NullPointerException c) 类型转换异常 ClassCastException d) 数组下标越界 ArrayIndexOutOfBoundsException e) 期 望 的 数 据 类 型 与 实 际 输 入 类 型 不 匹 配 InputMismatchException
  2. 检查时异常 Checked Exception a) SQLException b) IOException c) ParseException

书籍推荐