/*
*
* 处理异常第一种方式:
* 在方法是声明的位置上使用throws关键字抛出,谁调用这个方法,就抛给谁
* 第二种方式:
* 使用try..catch语句对异常进行捕捉
* 不在上抛了,自己处理了
*
* 注意:只要代码异常采用上抛,没有捕捉,则此方法的后续代码不会执行,此方法结束
* try语句块中的某一行出现异常,该行后面的代码不会执行
* try..catch捕捉异常后,后续代码(指的是try..catch语句块)可以执行
* */
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectStreamException;
public class Test03 {
public static void main(String[] args) {
//这是算输异常,属于运行时异常,你这样写,编译器没有报错,可以处理,也可不处
try{
System.out.println(10 / 0);
}catch (ArithmeticException s){
System.out.println("算术异常");
}
/*
* 一般不建议在main方法中使用throws,如果这个异常真的发生了,main方法一定会抛给JVM,JVM只有终止程序
* 异常处理机制的作用是增强程序的健壮性,怎么能做到,异常发生了叶不影响程序的执行
* 建议main方法中的异常使用try..catch进行捕捉,main方法就不再上报了
* */
System.out.println("main begin");
try {
//尝试执行
m1();
} catch (FileNotFoundException e) {
//这个分支可以使用e引用,e保存的是那个new出来的异常对象的内存地址
//只要捕捉,就不会上抛,catch分支中处理异常
//catch是捕捉异常之后走的分支
System.out.println("文件不存在,可能路径错误,也可能该文件被删除了");
System.out.println(e);
// java.io.FileNotFoundException: I:\project\疑惑问题.txs (系统找不到指定的文件。)
}
//try catch把异常抓住后,这里的代码就会继续执行,若是上抛的,则代码不再向异常的下面执行
System.out.println("main over");
}
public static void m1() throws FileNotFoundException {
System.out.println("m1 begin");
m2();
System.out.println("m1 over");
}
public static void m2() throws FileNotFoundException {
/*
* 这个位置抛别的异常不行ClassCastException,
* 但是:
* 1、可以抛别的和它本身 throws ClassCastException,FileNotFoundException 注意用逗号隔开,不需再写throws
* 2、可以抛他的父类throws IOException
* 3、也可以抛他的父类的父类,比他大的都行 ,因为他的父类包括FileNotFoundException
* */
System.out.println("m2 begin");
m3();
System.out.println("m2 over");
}
public static void m3() throws FileNotFoundException {
// 创建一个输入流,该流指向一个文件
/*
* 问什么会出现编译报错呢?
* public FileInputStream(String name) throws FileNotFoundException
*1、 这是构造方法声明位置上有 throws FileNotFoundException
*2、 通过这个类看到FileNotFoundException 的父类是 IOException ,IOException的父类是Exception
*
* 结论:得知FileNotFoundException是编译时异常,需要进行预处理,不处理编译器就报错
*/
System.out.println("m3 begin ");
new FileInputStream("I:\\project\\疑惑问题.txs");
System.out.println("m3 over");
System.out.println("出了异常,这里还会执行吗??????");
}
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/*
* 深入try..catch
* 1、catch后面的()可以是具体的异常类型,也可以是该异常类型的父类型
* 2、catch可以写多个,建议捕捉异常时,精确地一个一个地处理,这样有利于程序调试
* 3、catch写多个的时候,从上到下,必须遵循从小到大,否则报错
*
* 以后开发中:
* 希望调用者知道(如你写了一个方法,希望其他人去处理这个异常),就用throws(编译时,受检,受控)
* 其他情况用捕捉(运行时,未受检,非受控)
*
* */
public class Test04 {
public static void main(String[] args) throws FileNotFoundException {
/* try {
new FileInputStream("I:\\project\\疑惑问题.txt");
System.out.println("如果发生异常的话,这行代码就不执行");
}catch (FileNotFoundException e){
System.out.println("发生异常,找不到文件");
}*/
try {
FileInputStream fis = new FileInputStream("I:\\project\\疑惑问题.txt");
System.out.println("如果发生异常,你将不会看到这句话");
System.out.println(100 / 0);
//这样写是JDK8的新特性
}catch ( FileNotFoundException | ArithmeticException a ){
//所有的异常都走这个分支
//IOException e = new FileNotFoundException(); 相当于多态
System.out.println("发生异常,找不到文件,或者数学异常");
}
}
}
/*
* 异常对象有两个重要的方法:
* 获取异常简单的描述信息:
* String msg = exception.getMessage();
*
* 打印异常追踪的堆栈信息
* exception.printStackTrace()
* */
public class Test05 {
public static void main(String[] args) {
/*
* 这里只是为了测试getMessage()方法和printStackTrace()方法
* 只new了异常对象,但没有将异常对象抛出,JVM认为这是一个普通的java对象
* */
NullPointerException e = new NullPointerException("空指针异常hahahahah");
// throw e;手动抛异常的,在后面
//获取异常简单描述信息:这个信息实际上就是构造方法上是String参数
String msg = e.getMessage();
System.out.println(msg);
//打印异常堆栈信息
//java后台打印异常堆栈追踪信息的时候,采用了异步线程的方式打印的
e.printStackTrace();
//双线程的,其实e.printStackTrace();的输出应该在hello world上的,不一定
System.out.println("hello world");
}
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/*
* 异常对象的两个方法:
* String msg = e.getMessage():
* e.printStackTrace();
*
* 查看异常的追踪信息,应该怎么看,可以快速的调试?
* 从上往下一行一行看,不看Sun的代码
* 主要问题在自己写的代码上(看包名就能看出来)
*
*
* */
public class Test06 {
public static void main(String[] args) {
try {
m1();
} catch (FileNotFoundException e) {
//打印异常堆栈追踪信息
//在实际开发中,建议使用这个,
e.printStackTrace();
//这行代码如果不写,出了异常也不知道,一般用这个
//获取异常的简单描述信息,这个方法不全
System.out.println(e.getMessage());
/*
java.io.FileNotFoundException: I:\project\疑惑问题.tx (系统找不到指定的文件。)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:211)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:153)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:108)
at UML.Test06.m3(Test06.java:34)
at UML.Test06.m2(Test06.java:29)
at UML.Test06.m1(Test06.java:25)
at UML.Test06.main(Test06.java:15)
34行出问题,导致29行出问题、导致25,导致15
*/
}
//这里程序不耽误执行,很健壮(服务器不会因为遇到异常而宕机,死机)
System.out.println("后面程序可以执行");
}
private static void m1() throws FileNotFoundException {
m2();
}
private static void m2() throws FileNotFoundException {
m3();
}
private static void m3() throws FileNotFoundException {
new FileInputStream("I:\\project\\疑惑问题.tx");
}
}
在这里插入代码片