Error异常信息
throws
作用:如果在构造方法声明位置上使用 throws(向上抛),则谁被调用需要使用throws或者try catch。
注意:throws只能往上报但是不能解决根本问题
/** * 异常 * throws 和 try catch * throws: * 1.如果在构造方法声明位置上使用 throws(向上抛)则谁调用它谁就要解决这个问题或者继续往上抛出才可以运行, * 2.严格意义上来说throws不能够解决error报错,throws只能网上报但是不能够解决根本问题 * try catch: * 1. */ public static void m1() throws FileNotFoundException { m2(); } public static void m2() throws FileNotFoundException { m3(); } public static void m3() throws FileNotFoundException { new FileInputStream("C://txt.txt"); /* * FileInputstream构造方法声明位置上使用 throws(向上抛) * java: 未报告的异常错误java.io.FileNotFoundException; 必须对其进行捕获或声明以便抛出 */ } public static void main(String[] args) throws FileNotFoundException { try { m1(); }catch (FileNotFoundException e) {} System.out.println("可以继续往下执行~~"); /* * 在程序运行过程中发生了 FilNotFoundException类型的异常 * JVM为我们创建了一个FilNotFoundException类型的对象 * 该对象中携带以下的信息。 * 负责将该对象的信息打印到控制台并且JVM停掉了程序的运行 * Exception in thread "main" java.io.FileNotFoundException: C:\txt.txt (系统找不到指定的文件。) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:219) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112) at javase2.day02.javareview02.ErrorTest01.m3(ErrorTest01.java:23) at javase2.day02.javareview02.ErrorTest01.m2(ErrorTest01.java:20) at javase2.day02.javareview02.ErrorTest01.m1(ErrorTest01.java:17) at javase2.day02.javareview02.ErrorTest01.main(ErrorTest01.java:30) */ }
try catch
catch可以写多个,但是必须从上到下,从小到大捕捉,不然会报异常。
如果在try语句块中首次出现异常则在try语句块中后面语句不在执行。
catch的参数变量中的Object的toString方法重写了,不是一个存储地址,而是一个字符串。
语法:
try {
可能出现异常的代码;
} catch (异常类型1 变量) {
处理异常代码;
}catch (异常类型2 变量) {
处理异常代码;
}
// 情况一.
/*try {
FileInputStream fis = new FileInputStream("abc");
// 以上FileInputStreamerror属于FileNotFoundException错误
fis.read();
// 以上fis.read()属于IOException错误
// 因为FileNotFoundException属于IOException的子类
// 如果解决一个问题则会报错:
// java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出
} catch (FileNotFoundException e) {
System.out.println("执行1111");
} catch (IOException e) {
System.out.println("执行2222");
}*/
// 情况二.
/*try {
FileInputStream fis = new FileInputStream("abc");
// 以上FileInputStreamerror属于FileNotFoundException错误
// 注意:FileNotFoundException属于IOException的子类
fis.read();
// 以上fis.read()属于IOException错误
} catch (IOException e) {
System.out.println("执行2222");
} catch (FileNotFoundException e) {
System.out.println("执行1111");
}*/
/*
* 报错:java: 已捕获到异常错误java.io.FileNotFoundException
* catch只能从小(子类)到大(父类)处理异常
* 如果从大(父类)到小(子类)会报错
* */
// 情况三.
try {
FileInputStream fis = new FileInputStream("abc");
// 如果在try语句块中首次出现异常则在try语句块中后面语句不在执行~
System.out.println("报错");
fis.read();
} catch (FileNotFoundException e) {
System.out.println(e);
System.out.println("执行1111");
} catch (IOException e) {
System.out.println("执行2222");
}
/*
* 报错:java: 已捕获到异常错误java.io.FileNotFoundException
* catch只能从小(子类)到大(父类)处理异常
* 如果从大(父类)到小(子类)会报错
* */
throws与try catch区别:
- (throws)实际例子:小王是公司小职员因操作不当让公司赔了100W,则小王给项目经理报,而项目经理给部门经理报,部门经理给董事长报,董事长宣布公司破产。其中:部门经理知道后将此事一直未的到解决直到报给董事长(JVM)就相当于直接报给JVM虚拟机停止运行。
- (try catch)实际例子:小王是公司小职员因操作不当让公司赔了100W,则小王给项目经理报,而项目经理知道后给部门经理报,部门经理知道后将此事解决了,则不需要往上级报了只需要继续工作即可。其中:部门经理知道后将此事解决就是try catch
getMessage() 与 printStackTrace()方法
取得异常描述信息:getMessage()
取得异常的堆栈信息(比较适合于程序调试阶段):printStackTrace()
代码示例:
try { FileInputStream fil = new FileInputStream("c://txt.txt"); }catch (FileNotFoundException e) { e.printStackTrace(); /* * java.io.FileNotFoundException: c:\txt.txt (系统找不到指定的文件。) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:219) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112) at javase2.day02.javareview02.ErrorTest03.main(ErrorTest03.java:10) * */ //以下输出的是上面printStackTrace错误信息的一部分 String s = e.getMessage(); System.out.print(s); // c:\txt.txt (系统找不到指定的文件。) System.out.println("Hello Wrold!!"); }
finllay语句块
finally语句块可以直接和try语句块联用。try… finally…
try…catch…finally…也可以
在finally语句块中的代码是一定会执行的
在实际开发应用场景:finally语句块是一定会执行的,所以通常在程序中为了保证某资源一定会释放,所以一般在finally语句块中释放资源。
public static void main(String[] args) { // 情况一 /*try { System.out.println("执行结果1~~"); return; }finally { System.out.println("执行结果2~~"); }*/ /* * 以上程序的执行顺序: * 1. 先执行try语句块中的System * 2. 在执行finally语句块中的System * 3. 最后执行try语句块中的return结束main方法 * 注意:一旦出现return则该方法自动关闭,除特殊情况如:finally语句块 */ // 情况二 System.out.println(m1()); } public static int m1() { int i = 0; try { i = 10; return i; } finally { i++; } /*以上程序的执行顺序: * 1. 初始化i变量 * 2. 执行try语句中的i = 10 并将i变量存储给temp变量 * 3. return temp变量 * 4. 执行finally中的i++ */ /* int i = 0; try{ i = 10; int temp = i; return temp; }finally { i++; } */ }