知识点和问题
- 1.内部类编译之后的字节码文件是什么?
- 2.在局部内部类的方法中,如果调用局部内部类所声明的方法中的局部变量的话,要求此局部变量声明为final
- 3.Java程序在执行过程中所发生的异常事件可分为哪两类?
- 4.如何编写代码使栈溢出?java.lang.StackOverflowError
- 5.如何编写代码使得堆溢出?java.lang.OutOfMemoryError
- 6.编译异常和运行时异常
- 7.异常体系结构
- 8.java.lang.NumberFormatException
- 9.InputMismatchException
- 10.异常的处理机制有哪些?
- 11.常用的异常输出的两种方式
- 12.子类重写父类方法的抛出异常类型设置
- 13.开发中如何选择使用try-catch-finally还是throws?
- 14.异常对象的产生方式有哪些?
- 15.用户如何自定义异常类?
- 16.throw和throws的区别是什么?
- 17.final、finally、finalize三者的区别?
1.内部类编译之后的字节码文件是什么?
外部类$[数字]内部类
例子:
Person$Dog.class//成员内部类
Person$1BB.class//局部内部类
2.在局部内部类的方法中,如果调用局部内部类所声明的方法中的局部变量的话,要求此局部变量声明为final
3.Java程序在执行过程中所发生的异常事件可分为哪两类?
1.Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError和OOM。一般不编写针对性的代码进行处理
2.Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:
空指针访问
试图读取不存在的文件
网络连接中断
数组角标越界
4.如何编写代码使栈溢出?java.lang.StackOverflowError
public class ErrorTest {
public static void main(String[] args) {
main(args);
}
}
5.如何编写代码使得堆溢出?java.lang.OutOfMemoryError
public class ErrorTest {
public static void main(String[] args) {
Integer i[][][]=new Integer[1024][1024][1024];
}
}
6.编译异常和运行时异常
运行时异常:Runtime Exception
7.异常体系结构
8.java.lang.NumberFormatException
public void test4() {
String str="abc";
int num=Integer.valueOf(str);
}
9.InputMismatchException
public void test4() {
Scanner scanner=new Scanner(System.in);
int score=scanner.nextInt();
System.out.println(score);
}
当输入不为数据的时候会报错
10.异常的处理机制有哪些?
异常出现的过程:
1.抛:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并且将此对象抛出,一旦抛出对象以后,其后的代码就不再执行
2.抓:异常的处理方式
1).try-catch-finally
格式:
try{
… //可能产生异常的代码
}
catch( ExceptionName1 e ){
… //当产生ExceptionName1型异常时的处置措施
}
catch( ExceptionName2 e ){
… //当产生ExceptionName2型异常时的处置措施
}
[ finally{
… //无论是否发生异常,都无条件执行的语句
} ]
例子:
public void test4() {
Scanner scanner=new Scanner(System.in);
int score;
try {
score=scanner.nextInt();
System.out.println("异常不再输出");
}catch(InputMismatchException e) {
System.out.println("请输入数组类型的数字!");
//System.out.println(e.getMessage());//输出异常信息,null
//一旦处理跳出try-catch结构,在进入finally或执行后续代码
e.printStackTrace();//输出异常信息
/*java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
* */
}catch(Exception e) {//异常类型如果满足子父类关系,则要求子类一定声明在父类的上面,否则报错
System.out.println("其他异常!");
}
System.out.println("输出");//输出
//try中声明的变量,try外失效
}
说明:
1.可以将编译时可能出现的异常,延迟到运行时出现。
2.finally中声明的是一定会被执行的代码,即使catch中又出现异常了,try中有return语句,catch中有return语句等情况
3.finally的作用:
像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,可以在finally中处理
4.try-catch-finally结构可以嵌套
5.通常不针对运行时异常编写try-catch-finally处理,但是编译时异常一定要考虑处理
2).throws + 异常类型
1.往上抛出异常,异常后面异常的代码将不再执行
2.异常真正处理是在上级调用方法中使用try-catch-finally处理异常
11.常用的异常输出的两种方式
1.String getMessage()
2.printStackTrace()
12.子类重写父类方法的抛出异常类型设置
1.子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(考虑:多态性捕获异常)
2.子类也可以不写抛出异常
13.开发中如何选择使用try-catch-finally还是throws?
1.父类结构决定:父类没有设置throws抛出异常,则子类也不能设置抛出异常,只能用try-catch-finally方式处理
2.几个方法是递进关系执行的,建议最底层的方法使用throws方式进行处理,最后顶层的方法采用try-catch-finally方式进行处理
3.try-catch-finally和throws两个是可以都使用的,但是不建议同时使用
14.异常对象的产生方式有哪些?
1.系统自动生成的异常对象
2.手动的生成一个异常对象,并抛出(throw)
手动生成异常处理的两种方式:
public class StudentTest {
public static void main(String[] args) {
Student s=new Student();
s.regist(-1001);
}
}
class Student{
public Student() {
super();
}
private int id;
public void regist(int id) {
if(id>0)
this.id=id;
else
{
throw new RuntimeException("您输入的数据非法!");
}
}
}
运行结果:
Exception in thread "main" java.lang.RuntimeException: 您输入的数据非法!
at com.atguigu.java6.Student.regist(StudentTest.java:20)
at com.atguigu.java6.StudentTest.main(StudentTest.java:6)
样例代码:
public class StudentTest {
public static void main(String[] args) {
Student s=new Student();
try {
s.regist(-1001);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
class Student{
public Student() {
super();
}
private int id;
public void regist(int id) throws Exception {
if(id>0)
this.id=id;
else
{
throw new Exception("您输入的数据非法!");
}
}
}
运行结果:
您输入的数据非法!
15.用户如何自定义异常类?
1.继承于现有的异常结构,Runtime、RuntimeException
2.提供全局变量:serialVersionUID
3.提供带参和不带参的构造器
public class MyException extends RuntimeException{
static final long serialVersionUID=-7034897190745440039L;
public MyException() {}
public MyException(String msg) {
super(msg);
}
}
class Student{
public Student() {
super();
}
private int id;
public void regist(int id){
if(id>0)
this.id=id;
else
{
throw new MyException("您输入的数据非法!");
}
}
}
16.throw和throws的区别是什么?
throw异常的生成阶段:手动抛出异常对象
throws是异常的处理方式:声明方法可能要抛出的各种异常类
17.final、finally、finalize三者的区别?
final是修饰符,可以用来修饰类、方法、属性
finally是异常捕获中出现的关键字
finalize是方法名