一、异常的概念
-
定义:
异常指的是运行期出现的错误,也就是当程序开始执行以后执行期出现的错误。
-
处理态度:
当捕获到异常以后一定要做出处理,哪怕是把这个异常的错误信息打印出来,这是一种良好的编程习惯。
如果不处理,那就是把这个错误悄悄地隐藏起来了,可是这个错误依然是存在的,只不过看不到了而已。这是一种非常危险的编程习惯,绝对不能这样做,捕获到异常就一定要做出处理,实在处理不了就把异常抛出去,让别的方法去处理。总之就是不能捕获到异常之后却又不做出相应的处理,这是一种非常不好的编程习惯。
二、异常分类
-
异常处理方式:
方法一:方法声明时使用throws把 异常往外抛
throws Exception
Exception类是所有能处理的异常类的根基类,抛出Exception类就会抛出所有能够被处理的异常类里了。
方法二:手动往外抛
throw+异常对象
异常对象抛出去了,然后在方法的声明写上要抛的那种异常。
方法三:
try…cacth…finally
try {
//处理业务代码
} catch (Exception e) {
//抛出异常处理,具体异常具体定
e.printStackTrace();
} finally{
//最终都需执行的代码
//一般做资源清理工作
}
我们一般使用printStackTrace()这个方法来打印异常的信息,使用这个方法打印出来的是所有出错的信息,包括了使用getMessage()方法打印出来的信息。使用这个方法之前要new一个错误对象出来才能调用它。因为它是专属于某个错误对象里面的方法。
- Java异常处理的五个关键字:try、catch、finally、throw、throws
- 异常分类
示例代码:
package com.lixu.javabase.exception;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 异常Demo
*/
public class ExceptionDemo {
/**
* 任何方法往外抛能处理的异常的时候都有一种简单的写法:“throws Exception”
* 因为Exception类是所有能处理的异常类的根基类,因此抛出Exception类就会抛出所有能够被处理的异常类里了。
* 使用“throws Exception”抛出所有能被处理的异常之后,这些被抛出来的异常就是交给JAVA运行时系统处理了,
* 而处理的方法是把这些异常的相关错误堆栈信息全部打印出来。
*/
void mothod() throws Exception{
}
public void method1() throws Exception{
//不处理,可能产生FileNotFoundException异常
@SuppressWarnings("resource")
FileInputStream flStream = new FileInputStream("mytext.txt");
//这里有可能会产生IOException异常
int b = flStream.read();
while (b != -1) {
System.out.println((char)b);
b = flStream.read();
}
}
public void method2() throws FileNotFoundException,IOException {
@SuppressWarnings("resource")
FileInputStream flStream = new FileInputStream("mytext.txt");
int b = flStream.read();
while (b != -1) {
System.out.println((char)b);
b = flStream.read();
}
}
public void method3(){
FileInputStream flStream = null;
try {
flStream = new FileInputStream("mytext.txt");
int b = flStream.read();
while(b != -1){
System.out.println((char)b);
b = flStream.read();
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e){
System.out.println(e.getMessage());
} finally{
try {
/**
* 前面已经把一个文件打开了,不管打开这个文件时有没有错误发生,即有没有产生异常,最后都一定要把这个文件关闭掉,
* 因此使用了finally语句,在finally语句里面不管前面这个文件打开时是否产生异常,在finally这里执行in.close()都能把这个文件关闭掉,
* 关闭文件也有可能会产生异常,因此在finally里面也使用了try……catch语句去捕获有可能产生的异常。
*/
flStream.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
}
三、自定义异常
package com.lixu.javabase.exception;
/**
* 自定义异常MyException
*/
public class MyException extends Exception {
private int id;
/**
* 自定义异常类的构造方法
* @param message
* @param id
*/
public MyException(String message,int id) {
super(message);
this.id = id;
}
/**
* 获取异常的代码
* @return
*/
public int getId() {
return id;
}
}
测试定义的异常
package com.lixu.javabase.exception;
import java.text.MessageFormat;
public class TestMyException {
public static void main(String[] args){
TestMyException tmException = new TestMyException();
tmException.manage();
}
//throws MyException,抛出我们自定义的MyException类的异常。
public void regiter(int num) throws MyException{
if(num < 0){
//使用throw手动抛出一个MyException类的异常对象。
throw new MyException("人数为负值,不合理", 1);
}
System.out.println(MessageFormat.format("登记人数:{0}",num));
}
public void manage() {
try {
regiter(-100);
} catch (MyException e) {
System.out.println("登记失败,错误码:"+e.getId());
e.printStackTrace();
}
System.out.println("操作结束");
}
}
四、异常处理总结
参照:https://www.cnblogs.com/xdp-gacl/p/3627390.html