烦了就吃饭去

异常

异常:
程序正常情况下是可以运行的,只是偶然因为其他的原因,导致“异常”情况。
例如:用户输入参数的问题,用户文件被删除,用户的磁盘空间已满,网络中断。
程序的运行过程中,可能遇到了“不正常”的情况,导致程序暂停或崩溃了。

不是异常的情况:
(1)语法错误,编译都不能通过
(2)逻辑错误

Java如何处理异常?或者Java的异常处理机制是什么样?
Java程序运行过程中,如果某句代码发生异常,Java会在这句代码处停下来。
Java会创建一个“异常的对象”并且“抛”出来。
Java会检测在这句代码的外围是否有“try...catch”可以“捕获”它,
》如果可以“捕获”它,那么程序会从这个try...catch后面继续往下执行。
》如果外围没有“try...catch”可以“捕获”它,那么程序就会先抛给“上级(调用者)”,上级也会检测是否有“try...catch”可以“捕获”它,如果可以“捕获”它,那么程序就会从这个try...catch后面继续往下执行。
》如果一路上都没有“try...catch”可以“捕获”它,那么程序就“挂了”。

异常的父类:java.lang.Throwable
Throwable类是Java语言中所有错误或异常的超类。

Throwable:
(1)Error:Error是Throwable的子类,用于指示合理的应用程序不应该试图捕获的严重问题。
(2)Exception
又分为两大类:
A:RuntimeException运行时异常(非受检异常),只有RuntimeException类型或它的子类是属于运行时异常。
凡是运行时异常,编译器不会要求你必须添加“try...catch”或“throws”

常见的运行时异常:
ArrayIndexOutOfBoundsException(数组下标越界)
NullPointerException(空指针异常)
ClassCastException(类型转换异常)
ArithmeticException(算术异常)

B.编译时异常(受检异常):除了运行时异常,剩下的全部是编译时异常。
凡是编译时异常,编译器强制要求你必须加“try...catch”或“throws”之一,否则编译不通过。
常见的编译时异常:
InterruptedException:线程中断打扰的异常
FileNotFoundException:文件找不到

面试题:
1.编写代码,使得发生VirtualMachineError
2.列出你开发中常见的异常类型(至少5个以上)

列出几种运行时异常

列出几种编译时异常
(OutOfMemoryError,StackOverflowError)
StackOverflowError错误的示例:
public class TestExceptionType{

@Test
public void test(){
FileInputStream fis = new FileInputStream("");//导包之后,还是会报错,需要加上“try...catch”或“throws”来处理,编译才不会报错。FileNotFoundException。
}

@Test
public void test() throws InterruptedException{
Thread.sleep(1000);//不处理就会报InterruptedException,加上throws就不会在编译时报错了
}

@Test
public void testRuntimeException(){
int[] arr = new int[5];
System.out.println(arr[6]);//ArrayIndexOutOfBoundsException
String str = null;
System.out.println(str.length());//NullPointerException
System.out.println(9/0);//ArithmeticException
}

@Test
public void testOutOfMemoryError(){
Object[] arr = new Object[Integer.MAX_VALUE];
System.out.println(arr.length);
}

@Test
public void testStackOverflowError(){
testStackOverflowError();
}
}

异常处理:try...catch
1.语法结构
try{
可能发生异常的代码
}catch(异常的类型1 异常名称){
捕获到该异常,要如何处理的代码:(1)什么也不写(2)打印异常(3)其他的处理方式
}catch(异常的类型2 异常名称){
捕获到该异常,要如何处理的代码:(1)什么也不写(2)打印异常(3)其他的处理方式
}catch(异常的类型2 异常名称){
捕获到该异常,要如何处理的代码:(1)什么也不写(2)打印异常(3)其他的处理方式
}
。。。。。。。

说明:多个catch有要求,必须是小的异常类型在上面,大的异常类型在下面,如果没有大小关系,就随意。这里的小和大是继承关系,子类小于父类。

2.执行的特点
(1)如果try中的代码没有发生异常,只执行try中的代码,不会执行catch。
(2)如果try的代码发生异常
》有catch可以捕获它,那么哪个catch捕获就进入哪个catch继续执行,按顺序找catch。只会执行其中一个catch。
如果catch住了,那么会从try...catch继续执行
》所有的catch都无法捕获它,那么自动往“上”抛
如果没有catch住,当前方法就结束了,带着“异常”回到上一级调用的位置。

命令行参数:是指给main的形参赋值的实参
如何传:(1)java TestParam chai lin yan
此方法是在cmd的命令行中,先使用javac TestParam.java进行编译,然后再进行 运行时,加上实参传递,格式为java TestParam chai lin yan
(2)在eclipse中,Run菜单--》Run Configurations
Java Application中找到操作类所在包以及所操作类,找到arguments菜单,在Program arguments栏中输入参数。

Integer.parseInt(++);把++字符串转成一个整数。

 

 

 


异常处理:try...catch...finally
1.语法结构
try{
可能发生异常的代码
}catch(异常的类型1 异常名称){
捕获到该异常,要如何处理的代码:(1)什么也不写(2)打印异常(3)其他的处理方式
}catch(异常的类型2 异常名称){
捕获到该异常,要如何处理的代码:(1)什么也不写(2)打印异常(3)其他的处理方式
}catch(异常的类型2 异常名称){
捕获到该异常,要如何处理的代码:(1)什么也不写(2)打印异常(3)其他的处理方式
}
。。。。。。
finally{
无论try中是否发生异常,也不管catch是否可以捕获异常,都要执行的代码块。
}

2.try...catch的形式
(1)try...catch
(2)try...catch...finally
(3)try...finally

面试题1:
final,finalize,finally的区别?
final:是修饰符,可以修饰类(不能被继承)、方法(不能被重写)、属性(不能被更改)
finalize:是一个Object中声明的方法,表示由垃圾回收器GC调用,在对象被回收之前调用。
finally:是try...catch结构的一部分,无论try中是否发生异常,也不管catch是否可以捕获异常,都要执行的代码块。

面试题2:
当finally和return一起时出现的情况:
(1)情况一:finally里面有return,结果就返回finally中的
(2)情况二:finally里面没有return,结果就返回try或者catch。

说明:一般情况下不建议在finally中写return,因为这样的话,try或者catch中的return就失效了。

 

 

throws:
用在声明一个方法时,明确声明该方法可能抛出++异常。说明这些异常在该方法中没有try...catch,抛由调用者处理。

语法格式:
【修饰符】 返回值类型 方法名(【形参列表】) 【throws 一场列表】{}

说明:throws后面可以接多个异常,顺序无所谓,一般如果有父类的异常,子类就不写。

如果抛出的是编译时异常,则调用者必须用try。。。catch处理,或者调用者继续抛出。

throws与方法重写:
方法的重写(Override)的要求:
(1)方法名:必须相同
(2)形参列表:必须相同
(3)返回值类型:
基本数据类型和void:必须相同
引用数据类型:<=
(4)权限修饰符:>=
(5)抛出的异常列表的类型:<=

异常关键字throw:throw是用于主动抛出异常对象。
异常对象:
(1)JVM检测到程序中的异常,就自动创建异常对象抛出
(2)程序员手动抛出异常
无论是JVM自动抛出还是throw手动抛出,最终都用try。。。catch处理或者通过throws抛给上级。

语法格式:
语句:throw 异常对象;
说明:如果没有try。。。catch,它可以代替return语句,结束当前方法,但是无法返回正常的结果,只能带回异常对象。

一个方法中可以有多处抛出同类型的编译时异常,然后在此方法的上级做处理。
如果抛出运行时类型,会通过编译。IDE不会强制要求你处理异常。

需求:从键盘输入用户名,密码,校验码
Exception:
(1)构造器:可以给message的属性赋值
new Exception("校验码输入错误");
(2)String getMessage()
(3)printStackTrace():打印异常的堆栈信息。
专门的打印错误信息的:System.err.print(),此方法打印出来的信息是红色的。
System.out.print(),此方法打印出来的信息是黑色的。

 

Java中都讲究“见名知意”。

自定义异常的要求
1.Throwable类是Java语言中所有错误或异常的超类,只有当对象是此类(或其子类之一)的实例时,才能通过Java虚拟机或者Java throw语句抛出。
类似的,只有此类或其子类之一才可以是catch语句中的参数类型。

结论:要想一个类称为“异常类型”,必须继承Throwable或它的子类。

2.自定义异常的对象,只能由throw语句手动抛出。

3.建议自定义异常,增加两个构造器
(1)无参构造器尽量保留
(2)有参构造:异常类型(String message),可以为message属性赋值

 

posted on 2020-05-14 07:02  烦了就吃饭去  阅读(200)  评论(0编辑  收藏  举报

导航