getMessage()和printStackTrace():
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* 异常对象中两个重要方法:
* 获取异常简单的描述信息:
* String msg = exception.getMessage();//这个信息实际上就是构造方法上的String参数
* 打印异常追踪的堆栈信息:
* exception.printStackTrace();
*/
public class ExceptionTest02 {
public static void main(String[] args) {
try{
m1();
}catch(FileNotFoundException e){
String msg = e.getMessage();
System.out.println(msg); //输出 c:\dsadasdasdasd (No such file or directory)
e.printStackTrace();
/*
这里打印出异常堆栈信息,若这里没有e.printStackTrace();这条语句,将不会打印出以下信息。
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:216)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:111)
at 异常.ExceptionTest02.m2(ExceptionTest02.java:30)
at 异常.ExceptionTest02.m1(ExceptionTest02.java:26)
at 异常.ExceptionTest02.main(ExceptionTest02.java:16)
"以上信息中,前四条是sun公司写的异常信息,不用看
这里只需要看第五条信息at 异常.ExceptionTest02.m2(ExceptionTest02.java:30)
表示第30行代码出错,后面信息表示因为第30行代码出错而带动26、16行语句出错
*/
}
}
private static void m1() throws FileNotFoundException{
m2();
}
private static void m2() throws FileNotFoundException {
new FileInputStream("c:\\dsadasdasdasd");//这里随便输入的文件路径
}
}
/**
* 异常可分为 编译时异常和运行时异常。
* 1、编译时异常:又称受检异常/受控异常(发生概率较高)
* 编译时异常时表示必须在编写程序的时候预先对这种异常进行处理,若不处理,编译器报错。
* 2、运行时异常:又称未受检异常/非受控异常(发生概率较低)
* 运行时异常在编写程序阶段,可选择处理,也可选择不处理。
*/
finally:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 关于try...catch中的finally子句:
* 1、finally子句中的代码是最后执行的,且是一定会执行,即使try语句块中出现异常。
* 1.1、finally子句必须和try一起出现,不可单独编写。
* 1.2、try和finall联合使用,可以没有catch。
* 2、finally使用情况:
* 通常在finally语句块中完成资源的释放/关闭。
* 因为finally中的代码比较又保障,即使try语句块中代码出现异常,finally中代码也会执行。
*/
public class ExceptionTest03 {
public static void main(String[] args) {
FileInputStream fis = null; //声明位置放到try外面,这样在finally中才能使用;若声明在try里,finall中无法使用fis。
try{
//创建输入流对象
fis = new FileInputStream("c:\\123123");//这里文件路径乱写的(演示),一定会出现异常
/*
流是占用资源的,使用完后需要关闭。
所以以上程序出现异常,流也需要关闭。
若fis.close();放在try这里可能会关闭不了。
因为上面的代码若出现异常,那么try中异常语句下面的代码是无法执行的!
如这里的hello代码无法执行到.
*/
System.out.println("hello!");
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}finally{
if(fis != null){ //这里if避免空指针异常,因为前面声明fis为null
try{
//close()方法又异常,采用捕捉方式
fis.close();
}catch (IOException e){
e.printStackTrace();
}
}
System.out.println("finally中语句一定执行!");
}
//------------------------------------------------------------
try{
System.out.println("try....");
return; //终止方法
}finally {
System.out.println("finally....");
/*
这里输出try...和finall....
执行顺序:先执行try,再执行finally,最后执行return;
所以finally中的代码块一定会执行的。
*/
}
}
}
public class ExceptionTest04 {
public static void main(String[] args) {
try{
System.out.println("try....");
//退出JVM
System.exit(0); //退出JVM后,finally语句中的代码就不执行了!!!这里只输出try....
}finally {
System.out.println("finally....");
}
}
}
finally面试题:
/*
finally经典面试题
*/
public class Exceptiontest05 {
public static void main(String[] args) {
System.out.println(m());//输出100
}
/*
java语法规则:
1、方法体中的代码必须遵循自上而下顺序依次逐行执行
2、return语句一旦执行,整个方法必须结束
*/
public static int m(){
int i = 100;
try{
//这行代码出现在int i=100;的下面,所以最终结果必须是返回100
//return语句必须保证最后执行,return执行,整个方法结束。
return i;
}finally {
i++;
}
}
}
/*
m()反编译:
public static int m(){
int i = 100;
int j = i;
i++;
return j;
}
*/