package test1;
import java.util.Scanner;
import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
//https://blog.csdn.net/qq_38080370/article/details/87880511
public class 异常类 {
//所有的异常类是从 java.lang.Exception 类继承的子类
public static void main(String[] args) throws FileNotFoundException, MyException {
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
int num2 = sc.nextInt();
try{
System.out.println(num1 / num2);
}catch(ArithmeticException e){
System.out.println("除数不能为0");
}
String username = sc.next();
if(username.length()<3){
throw new MyException("用户名小于三位Exception");
}
else{
System.out.println("用户名格式正确");
}
test();
}
public static void test() throws FileNotFoundException{
File file = new File("abc");
if(!file.exists())
{
throw new FileNotFoundException("该文件不存在");
}
else {
FileInputStream fs = new FileInputStream(file);
}
}
}
class MyException extends Exception{
public MyException(){
}
public MyException(String msg){
super(msg);
}
}
异常处理:
1.try—catch—finally语句
(1) 异常监控的程序段放在try中;
(2) try发生异常,捕获异常;
(3) 抛出的异常用catch捕获,然后用某种合理的方法处理该异常。
try{
while(i<=3){
System.out.println(str[i]);
i++; } //i = 3时抛出异常,catch捕获异常
}catch(java.lang.ArrayIndexOutOfBoundsException e){
System.out.println("数组下标越界异常!");//合理方法处理异常 (隐式异常)
}finally{
System.out.println("finally i="+i);
}
System.out.println("程序正常结束");
try语句基本格式:
//有一个 try 语句,至少要有一 个 catch 或者 finally 和它相配合。
try{
//可能发生异常的语句块
}catch(ExceptionType1 e){
//处理 ExceptionType1 异常的语句块
}catch(ExceptionType2 e){
//处理 ExceptionType2 异常的语句块
}catch( „„ ){
//处理其它异常的语句块
}finally{
//无论异常是否发生都一定执行的语句块
}
当 try 语句块中的代码执行时发生异常,程序的正常运行便中断,并抛出异常对象,然后在 try 块后面的各个 catch()中找出与异常对象相匹配的类。
满足二个中的一个就认为这个异常对象与对应的异常类相匹配
1.异常对象所属的类是 catch()中参数类的子类或者和其参数类相同;
2.catch()中参数类是一个接口时,发生的异常对象类实现了这一接口。
有多个 catch 子句时,最多只会执行其中一个 catch 语句块中的异常处理代码;
finally 子句为异常处理提供一个统一的出口,使得在控制流转到其它部分以前(即使有 return,break 语句),能够对程序的状态作统一的管理。
throw 和 throws的区别:
Throw:
1.作用在方法内,表示抛出具体异常,由方法体内的语句处理。
2.具体向外抛出的动作,所以它抛出的是一个异常实体类。若执行了Throw一定是抛出了某种异常。
Throws:
1.作用在方法的声明上,表示如果抛出异常,则由该方法的调用者来进行异常处理。
2.主要的声明这个方法会抛出会抛出某种类型的异常,让它的使用者知道捕获异常的类型。
3.出现异常是一种可能性,但不一定会发生异常。
//throws异常存在,但不一定发生
void testException(int a) throws IOException,{
try{
......
}catch(Exception1 e){
throw e;
}catch(Exception2 e){
System.out.println("出错了!");
}
//当存在时,一定会发生
if(a!=b)
throw new Exception3("自定义异常");
}
UnsupportedOperationExceotion 如果应用程序试图创建大小为负的数组,则抛出异常!
NullPointerException 当应用程序试图访问空对象时,则抛出异常!
SQLException 提供关于数据库访问错误或其他错误信息的异常!
ArithmeticException——由于除数为0引起的异常;
ArrayIdexOutOfBoundsException—一访问数组元素下标越界,引起异常;
ArrayStoreException——由于数组存储空间不够引起的异常;
NegativeArraySizeException—一数组长度是负数,则产生异常;
IndexOutOfBoundsExcention——由于数组下标越界或字符串访问越界引起异常;
ClassCastException—一当把一个对象归为某个类,但实际上此对象并不是由这个类 创建的,也不是其子类创建的,则会引起异常;
IllegalMonitorStateException——监控器状态出错引起的异常;*********
SecurityException——由于访问了不应访问的指针,使安全性出问题而引起异常;******
IOException——由于文件未找到、未打开或者I/O操作不能进行而引起异常;
ClassNotFoundException——未找到指定名字的类或接口引起异常;******
CloneNotSupportedException——一程序中的一个对象引用Object类的clone方法,但 此对象并没有连接Cloneable接口,从而引起异常;******
InterruptedException—一当一个线程处于等待状态时,另一个线程中断此线程,从 而引起异常,有关线程的内容,将在下一章讲述;
NoSuchMethodException一所调用的方法未找到,引起异常;
IllegalAccessExcePtion—一试图访问一个非public方法;
StringIndexOutOfBoundsException——访问字符串序号越界,引起异常;
NumberFormatException——字符的UTF代码数据格式有错引起异常;
IllegalThreadException—一线程调用某个方法而所处状态不适当,引起异常;****
FileNotFoundException——未找到指定文件引起异常;
EOFException——未完成输入操作即遇文件结束引起异常。******