目录
处理异常的方式
- try.......catch....finally
- try......finally。
- try......catch
public class ExceptionDemo2 {
public static void show(){
try{
int a = 1/0;
}catch (Exception e){
System.exit(1);
}finally {
System.out.println("finally");
}
System.out.println("aaaaa");
}
public static void main(String[] args) {
ExceptionDemo2.show();
}
}
1. 注意执行顺序
如果try中代码不出错,则直接执行finally
如果try中代码出错,则会跳入catch中,执行完catch在执行finally
2. return 和 finally
(1)正常情况,try块中有return, 而finally中没有,且在finally块中没有对return 值得操作,则执行完finally,返回return
(2)如果 try块中有return, 而finally块中也有return,则finally块中的return会覆盖try中的。
(3)如果 try块中有return, 而finally块中没有return,但是却对return的值进行了操作。
- 如果return的是基本类型,则finally中的操作对返回的值无影响。
这里做一个分析。当try中执行到return时,return后面的值不会马上返回,而是会复制一份返回信息到一个新的局部变量,是由于finally的存在。当执行完finally后,会把之前复制的那一份返回。所以finally操作无影响。
- 如果return的是引用类型,则finally中的操作对返回值同样也不会变化,这里的不会变化指的时指向该对象的地址不会变化,但是如果在finally中操作了对象中的属性,则返回的该对象的属性是发生了变化的。
更具体的情况参考:https://blog.csdn.net/jiandabang/article/details/103659052,从字节码的层面进行分析的。通过javap 命令得到字节码,分析方法的指令步骤,非常详细。
3. 为什么fianlly块始终都会执行呢,原因是在编译的时候,会将finally块中的代码分别拷贝到所有可能的分支下(try ,还有catch下)
4. finally块不执行的情况
(1)try...catch...finally 块没执行到
(2)try块中报异常,catch语句中有system.exit(1);
package com.mark.java.exception;
public class ExcepDemo {
public void show(){
try{
int a = 1/0;
}catch (Exception e){
System.exit(1);
}finally {
System.out.println("finally");
}
}
}
- throws 声明
向外抛异常,当前程序不处理异常,抛到外边进行处理
throw抛出异常对象
throw new Exception("aaaaaaaaaa")
throw和throws区别
共同点:都是抛出异常,不负责处理。
区别:1. 确切的说throws不能加抛出异常,应该叫声明异常,可以声明多个异常。而throw只能抛出一个异常对象;
2. throws声明后,虽然在这次不做处理,但是外部调用它的最终都是需要处理的(捕获异常或者声明异常)。而throw抛出异常,可以不进行处理,不会报错。但是这个行为肯定是不对的。
3. throws 声明一般会声明到方法或者类上,而throw则是在方法内部。
package com.mark.java.exception;
import com.tzw.entity.EcifClient;
import jdk.internal.util.xml.impl.Input;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class ExceptionDemo3 {
//使用throws,外部调用一定要处理。,要不再次throws,要不try catch处理掉
public static void show() throws FileNotFoundException {
InputStream inputStream = new FileInputStream("a.txt");
}
//使用throw,可以不用处理,不会编译报错
public static void show2() {
try {
int i = 1/0;
} catch (RuntimeException e) {
throw new RuntimeException("aa");
}
}
public static void main(String[] args) {
show2();
try {
show();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
自定义异常
继承Exception 类或者 ,RuntimeException类,进行自定义类
package com.mark.java.exception;
import java.util.Scanner;
public class ExceptionDemo4 extends RuntimeException {
public ExceptionDemo4(String code, String message, String... arg) {
String format = String.format("错误码为%s,报错信息为%s", code, message);
String a = "";
for (int i = 0; i < arg.length; i++) {
a+=","+arg[i];
}
String b = "";
System.out.println(b=a.substring(1));
String replace = format.replace("%s", b);
replace=replace+",参数列表为"+b;
System.out.println(replace);
}
}
class A{
public static void show(){
int i = 0;
try {
Scanner scanner = new Scanner(System.in);
i =scanner.nextInt();
int a = 1/i;
} catch (Exception e) {
throw new ExceptionDemo4("aaaa","除数不能为%s",String.valueOf(i),"sss");
}
}
public static void main(String[] args) {
show();
}
}
异常的分类
1 . Throwable分 Error 和 Exception
2. Exception分为 编译时异常(checked异常)和RunTimeException运行时异常