异常分为编译时异常和运行时异常
编译时异常其实也是在运行时产生的只不过这类异常需要我们做出预处理所以又被称为编译时异常或者受检异常或者受控异常
运行时异常不需要我们做出预处理,程序可以被编译通过这类议程不预处理程序依然可以执行只不过在执行倒某处时可能会出错。运行时异常又称为非受检异常或者是非受控异常
对于异常处理只有两个方法,
第一是throws Exception(将异常抛给我们的上一级让他们去处理)
第二是try{}catch(){}自己捕捉异常自己处理
如果一直上抛不处理JVM会终止进程的进行
不正确时才会产生异常,异常才会被抛出,正确是是不会抛出异常的
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Test {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("m1begin");
m1();
System.out.println("m1over");
}
private static void m1() throws FileNotFoundException {
System.out.println("m2begin");
m2();
System.out.println("m2over");
}
private static void m2() throws FileNotFoundException {
System.out.println("m3begin");
m3();
System.out.println("m3over");
}
private static void m3() throws FileNotFoundException {
new FileInputStream("D:\\文档\\百年党史.docx");//如果此处的路径正确是不会出现异常的。
}
}
//之所以这里做异常处理是因为new FileInputStream时会抛出异常这是java源码抛出的的异常,我们必须得做相应的处理。
路径不正确产生异常,一直抛出不做处理,最后抛给java的虚拟机JVM,终止进程的执行。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Test {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("m1begin");
m1();//因为是抛出异常,异常未被处理所以下面的语句不会执行
System.out.println("m1over");
}
private static void m1() throws FileNotFoundException {
System.out.println("m2begin");
m2();//因为是抛出异常,异常未被处理所以下面的语句不会执行
System.out.println("m2over");
}
private static void m2() throws FileNotFoundException {
System.out.println("m3begin");
m3();//因为是抛出异常,异常未被处理所以下面的语句不会执行
System.out.println("m3over");
}
private static void m3() throws FileNotFoundException {
new FileInputStream("D:\\文档\\百党史.docx");//如果此处的路径不正确会出现异常的。
}
}
标题e.getMessage();//获取简单的异常描述 e.printStackTrace();//对于异常栈追踪的信息,获取详细的异常描述
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Test {
public static void main(String[] args) {
System.out.println("m1begin");
try {
m1();
} catch (FileNotFoundException e) {
e.printStackTrace();//对于异常栈追踪的信息,获取详细的异常描述
System.out.println("=================");
String message = e.getMessage();
System.out.println(message);//获取简单的异常描述
}//采用try{}catch(){}方法做异常处理处理之后后面的语句会执行
//在就JVM虚拟中采用单独的线程对异常进行处理,并会与程序执行进程产生冲突
for(int i=0;i<100000;i++){
//此处的for循环为了说明议程处理进程和程序执行进程并不是同一个进程
}
System.out.println("m1over");
}
private static void m1() throws FileNotFoundException {
System.out.println("m2begin");
m2();//因为是抛出异常,异常未被处理所以下面的语句不会执行
System.out.println("m2over");
}
private static void m2() throws FileNotFoundException {
System.out.println("m3begin");
m3();//因为是抛出异常,异常未被处理所以下面的语句不会执行
System.out.println("m3over");
}
private static void m3() throws FileNotFoundException {
new FileInputStream("D:\\文档\\百党史.docx");//如果此处的路径不正确会出现异常的。
}
}
直接抛出异常的父类异常
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Test {
public static void main(String[] args) {
System.out.println("m1begin");
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("m1over");
}
private static void m1() throws Exception {
System.out.println("m2begin");
m2();
System.out.println("m2over");
}
private static void m2() throws Exception {
System.out.println("m3begin");
m3();
System.out.println("m3over");
}
private static void m3() throws Exception {
new FileInputStream("D:\\文\\百年党史.docx");//如果此处的路径正确是不会出现异常的。
}
}
尽管直接抛出了父类异常但是他还是会找到具体是什么异常的
异常处理的顺序,从小到大
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Test {
public static void main(String[] args) {
System.out.println("m1begin");
m1();
System.out.println("m1over");
}
private static void m1() {
System.out.println("m2begin");
m2();
System.out.println("m2over");
}
private static void m2() {
System.out.println("m3begin");
try {
m3();
} catch (FileNotFoundException e) {//小异常
e.printStackTrace();
} catch (NullPointerException d) {//小异常
d.getStackTrace();
} catch (Exception e){//大异常
e.printStackTrace();
}
//处理异常的顺讯一定要从小到大
System.out.println("m3over");
}
private static void m3() throws FileNotFoundException,NullPointerException {
//可以同时抛出多个异常
new FileInputStream("D:\\文档\\百党史.docx");//如果此处的路径正确是不会出现异常的。
String str =null;
NullPointerException nullPointerException = new NullPointerException();
//空指针异常属于运行时异常不需要做预处理
}
}
catch(| | | |) 同时抓捕多个异常
finally and try{}catch(){} 必须同时使用
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
System.out.println("m1begin");
m1();
System.out.println("m1over");
}
private static void m1() {
System.out.println("m2begin");
m2();
System.out.println("m2over");
}
private static void m2() {
System.out.println("m3begin");
m3();
System.out.println("m3over");
}
private static void m3() {
//数据流输入,输入完之后要关闭。
FileInputStream fileInputStream = null;//如果此处的路径正确是不会出现异常的。
try {
fileInputStream = new FileInputStream("D:\\文档\\百年党史.docx");
NullPointerException nullPointerException =null;
System.out.println(nullPointerException.getMessage());
System.out.println("上面有异常这里下面的语句就不会执行了");
// fileInputStream.close();//不执行就意味着关闭失败,不尽人意
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
//我们可以使用finally方法来避免上面那种情况出现
//finally中的语句是一定会被执行的
if(fileInputStream!=null){
//此时说明fileInputStream对象创建成功了我们需要我们用完之后需要关闭
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("关闭成功");
}
}
}
}
对于某些尽管出现了运行时异常也需要执行的语句我们可以放在finally块中