详解Java异常和异常面试题(下)

补充上文:

  • 当 try 和 finally 块中都存在 return 语句时,会执行 finally 块中的 return 语句。
  • finally 块中的 return 语句会覆盖 try 块中的 return 语句,即最终返回的值是在 finally 块中确定的。
public class Main {
    public static void main(String[] args) {
        System.out.println(test());
    }

    public static int test() {
        try {
            return 1;
        } finally {
            return 2;
        }
    }
}

输出的结果是 2。

  • 当 try 块中存在 return 语句而 finally 块中没有 return 语句时
public class Main {
    public static void main(String[] args) {
        System.out.println(test());
    }

    public static int test() {
        try {
            return 1;
        } finally {
            System.out.println("Finally block executed");
        }
    }
}
结果:
Finally block executed
1

这是因为 finally 块中的代码总是会在方法返回之前执行,以确保进行必要的清理操作。

手动抛出异常对象

1.使用说明

在程序执行中,除了自动抛出异常对象的情况之外,我们还可以手动的throw一个异常类的对象。

2.[面试题]

throw 和 throws区别:
throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内
throws 属于异常处理的一种方式,声明在方法的声明处

3.典型例题

class Student{
private int id;

public void regist(int id) throws Exception {
	if(id > 0){
		this.id = id;
	}else{
		//手动抛出异常对象
		//	throw new RuntimeException("您输入的数据非法!");
//			throw new Exception("您输入的数据非法!");
			throw new MyException("不能输入负数");
//MyException extends Exception
		}
		
	}
public class MyException extends Exception{
@Override
	public String toString() {
		return "Student [id=" + id + "]";
	}
}
	

}

自定义异常类

如何自定义一个异常类?
/*
 * 如何自定义异常类?
 一般地,用户自定义异常类都是RuntimeException的子类。

 * 1. 继承于现的异常结构:RuntimeException 、Exception
 * 2. 提供全局常量:serialVersionUID
 * 3. 提供重载的构造器
 * 
 */
public class MyException extends Exception{
	
	static final long serialVersionUID = -7034897193246939L;
	
	public MyException(){
		
	}
	
	public MyException(String msg){
		super(msg);
	}
}


//手动抛出运行时异常不需要try catch处理 手动抛出编译时异常就需要。

你可能感兴趣的:(Java异常,java,jvm,开发语言)