1.面试题:
final,finalize,finally的区别?
A:final:最终的,不可改变的
Final修饰类,该类不能被继承
Final修饰成员变量,该变量是常量
Final修饰成员方法,该方法不能被重写
B:finalize:finalize与gc有关系,运行垃圾回收器,对不用的垃圾进行回收,底层依赖于重写了Object中的
Finalize()方法
C:finally:释放资源IO频繁使用,该语句中的代码一定会执行除非在执行之前jvm退出了
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FinallyDemo2 {
public static void main(String[] args) {
//String--->Date
String s="2017-08-18";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d=null;
try {
d= sdf.parse(s);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(0);
}
finally{
System.out.println("你错了错了");
}
}
}
try…..catch…..finally
try…..catch
try…..catch……catch
2. 问题:如果catch里面有return语句,那么finally代码中的语句还会执行吗?是在return前还是return后
finally代码中的语句一定会执行,是在return前
代码:
public class FinallyDemo {
public static void main(String[] args) {
System.out.println(num());
}
//写一个功能代码块
public static int num(){//静态,可以直接用类名调用方法
int x=4;
try {
System.out.println(x/0);
x=5;
} catch (ArithmeticException e) {//捕获异常,数学运算异常,执行catch里面的语句
// e.printStackTrace();
x=6;
return x;
//catch里面的代码有return语句,finally语句中的代码也一定会执行,当代码执行到第一个return ,
//由于x=6,return 6,代码继续往下执行到finally,x=7,但是try...catch...finally再次return
//里面记录的是第一次return的值,返回6
}
finally{
x=7;//这里的代码也一定会执行
}
return x;
}
}
3.自定义异常类
1)异常的子实现类
/*
* 该类继承自Exception和RuntimeException
*/
public class MyException extends Exception {
//无参构造
public MyException(){
}
//有参构造
public MyException(String message){
super(message);
}
}
2)
public class Teacher {
public void show(int score) throws MyException{
if(score>100||score<0){
System.out.println("该分数必须实在1到100之间");
throw new MyException("异常啊异常");
}else{
System.out.println("您输入的正确");
}
}
}
3)测试类,捕获异常
public class Student {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc=new Scanner(System.in);
//接收并录入数据
System.out.println("请输入您的成绩");
int score=sc.nextInt();
// if(score>100||score<0){
// System.out.println("该分数必须实在1到100之间");
// throw new MyException("异常啊异常");
//
// }else{
// System.out.println("您输入的正确");
// }
Teacher t=new Teacher();
try{
t.show(score);
}catch (MyException e) {
e.printStackTrace();
}
}
}
4.异常类中的注意事项
1)如果继承关系中出现异常,父类的方法要被子类进行重写的时候,如果父类抛出了异常,那么子类在重写该方法的时候也要抛出异常,要么和父类中抛出的异常一致,要么是该异常的子类
2)如果父类中没有抛出异常,那么子类重写该方法也不能抛异常,只能try…catch捕获异常
代码:
public class ExceptionDemo {
public static void main(String[] args) {
class Fu{
public void show() throws Exception{
}
public void method(){
}
}
class Zi extends Fu{
public void show() throws ArithmeticException{
}
public void method(){
//String--->Date
String s="2017-08-17";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try{
Date d=sdf.parse(s);
}
catch (ParseException e) {
e.printStackTrace();
}
}
}
}
}