Java基础(basis)-----异常与错误处理

时间:2023-03-09 19:23:37
Java基础(basis)-----异常与错误处理

1.编译型异常和运行时异常

      编译时异常是指程序正确 而由外界条件不满足而产生的异常 java 中要求必须去捕捉住这类异常 不然无法通过编译

运行时异常是指程序存在着bug 如空指针异常 数组下标越界 都属于 运行时异常

2.Error和Exception

      Exception:是程序本身可以处理的异常

Error:是程序无法处理的错误,这些错误标识故障发生于虚拟机自身或者发生在虚拟机试图执行应用时,一般不需要程序处理,例如:内存空间不足,栈溢出

Java基础(basis)-----异常与错误处理

3.throws  在方法的声明处,显式的抛出该异常对象的类型 

package com.exception;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * throws 在方法的声明处,显式的抛出该异常对象的类型
 * 不推荐
 * @author yyx 2019年2月21日
 */
public class ExceptionThrows {

    public static void main(String[] args) throws FileNotFoundException, IOException {
        String filepath = "D:" + File.separator + "exception.txt";
        FileOutputStream fos = new FileOutputStream(filepath);
        String content = "今天是2018/4/8,天气很好";
        byte[] array = content.getBytes();
        fos.write(array);
        fos.close();
    }
}

4.throw  在方法内抛出异常对象

package com.exception;

/**
 * throw 在方法内抛出异常对象 不推荐
 *
 * @author yyx 2019年2月21日
 */
public class ExceptionThrow {
    public static void main(String[] args) {
        try {
            int i = 3;
            if (i > 4) {
                System.out.println("恭喜你,答对了!");
            } else {
                throw new MyException("对不起,算数错误");
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

class MyException extends Exception {
    private static final long serialVersionUID = 1L;

    public MyException(String msg) {
        super(msg);
    }
}

5.try.....catch....finally......

package com.exception;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 * 推荐
 * @author yyx
 * 2019年2月21日
 */
public class ExceptionTryCatch {
    public static void main(String[] args) {
        String filepath = "D:" + File.separator + "exception.txt";
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(filepath);
            String content = "今天是2018/4/8,天气很好";
            byte[] array = content.getBytes();
            fos.write(array);
        } catch (IOException e) {
            e.printStackTrace();// 一般此处写入日志
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        ReturnExceptionDemo reDemo=new ReturnExceptionDemo();
        try {
            reDemo.methodA();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        int i = reDemo.methodB();
        System.out.println(i);
    }
}

class ReturnExceptionDemo {
    void methodA() {
        try {
            System.out.println("进入方法A");
            throw new RuntimeException("制造异常");
        } finally {
            System.out.println("用A方法的finally");
        }
    }

    int methodB() {
        try {
            System.out.println("进入方法B");
            return 1;
        } finally {
            System.out.println("调用B方法的finally");
            return 2;
        }
    }
}

6.throws和throw的区别

  • 位置不同:throws用在函数上,后面跟的是异常类,可以跟多个;而throw用在函数内,后面跟的是异常对象 
  • 功能不同:throws用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方式;throw抛出具体的问题对象
  •  throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象
  • 两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理