上课视频:
链接:https://pan.baidu.com/s/1GCFDnN3Uc66AkobBHe7AdQ 密码:5olh
链接:https://pan.baidu.com/s/1q2mbinKgeH3WYnkgOqJOwg 密码:vomi
链接:https://pan.baidu.com/s/1-SkSx3ctTgE1OG3a3m7eFA 密码:8hdq
一、如何异常处理
java错误分为
有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,都继承于Throwable,各自都包含大量子类。
一个是Error(错误)
是程序无法处理的错误,表示运行应用程序中较严重问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。
二、Exception(异常)
一个简单异常处理案例:
如下图
语法1
try{
//需要异常捕获的代码块
}catch(Exception e){
//捕获异常后需要处里的代码块
}
语法2
try{
//需要异常捕获的代码块
}catch(Excetion e){
//捕获异常后需要处里的代码块
}finally{
//有没有走异常都会走的代码块
}
语法3
try{
//需要异常捕获的代码块
}catch(Excetion的子类 e){
//捕获异常后需要处里的代码块
}catch(Excetion的子类 e){
//捕获异常后需要处里的代码块
}catch(Excetion e){
//捕获异常后需要处里的代码块
}finally{
//有没有走异常都会走的代码块
}
二、常见异常
1、类型转换失败
Car car =new BaoMa();
((AutoDriveInterface)car).autoDrive();
Exception in thread "main" java.lang.ClassCastException: com.lianwei01.BaoMa cannot be cast to com.lianwei01.AutoDriveInterface
at com.lianwei01.Test.main(Test.java:7)
2、被除数不能为零
System.out.println(6/0);
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.lianwei1.Test.main(Test.java:9
3、数组下标越界
int array[] = {4,5,7,6,3};
System.out.println(array[5]);
最大下标是4 ,而代码中下标使用了5所以越界了
java.lang.ArrayIndexOutOfBoundsException: 5
at com.lianwei1.Test.main(Test.java:19)
4、空指针错误
String str = null;
str.trim();
一个为空的对象去调用了这个对象所对应为当中的方法就会报这个错误
Exception in thread "main" java.lang.NullPointerException
at com.lianwei1.Test.main(Test.java:22)
三、自定义异常
就是自己写一个类去继承Exception类就是自定义异常
/**
* 自定义异常
* @author apple
*
*/
public class NotFindFileExcetion extends Exception {
public NotFindFileExcetion() {
super("文件没有找到错误");
}
}
四、自己抛出异常
throws :是写在函数后面的,可能会抛出很多个
throw:是具体要抛出的异常
package com.lianwei1;
public class FileUtil {
public static String findFile() throws NotFindFileExcetion,ArithmeticException {
boolean isFind= true;
if (isFind) {
int num1 = 4;
int num2= 0;
if (num2 ==0) {
throw new ArithmeticException();
}
System.out.println();
return "我找到了文件";
}else {
throw new NotFindFileExcetion();
}
}
}
五、异常的捕获顺序
子类异常一定要先捕获
try {
FileUtil.findFile();
//Exception ex = new ArithmeticException();
int num1 = 8;
int num2 = 1;
System.out.println(num1/num2);
int array [] = {3,4,6};
System.out.println(array[4]);
} catch (NotFindFileExcetion e) {
System.out.println(e.getMessage());
} catch (ArithmeticException e) {
System.out.println(e.getMessage());
}catch (Exception e) {
System.out.println(e.getMessage());
}
上课练习
编写代码,在main()方法中调用类CCircle中的方法,计算圆的面积。并且自己定义一个异常类,如果半径为负值,抛出自己定义的异常。(在类CCircle中判断并抛出异常)
一、选择题
1、java中用来抛出异常的关键字是( )
A.try B.catch C.throw D.finally
2、关于异常,下列说法正确的是( )
A. 异常是一种对象 B.一旦程序运行,异常将被创建
C.为了保证程序运行速度,要尽量避免异常控制 D.以上说法都不对
3、()类是所有异常类的父类。
A.Throwable B.Error C.Exception D. AWTError
4、java语言中,下列哪一子句是异常处理的出口( )
A.try{…}子句 B.catch{…}子句 C.finally{…}子句 D.以上说法都不对
5.下列程序的执行,说法错误的是( )
class MultiCatch{
public static voidmain(String args[]) {
try
{
inta=args.length;
int b=42/a;
intc[]={1};
c[42]=99;
System.out.println(“b=”+b);
}
catch(ArithmeticException e)
{
System.out.println(“除0异常:”+e);
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println(“数组超越边界异常:”+e);
}
}
}
A.程序将输出第15行的异常信息
B.程序第10行出错
C.程序将输出“b=42”
D.程序将输出第19行的异常信息
6、自定义异常类时,可以继承的类是( )
A.Error B.Applet C.Exception及其子类 D.AssertionError
10、在异常处理中,将可能抛出异常的方法放在( )语句块中
A.throws B.catch C.try D.finally
11、对于try{……}catch子句的排列方式,下列正确的一项是( )
A.子类异常在前,父类异常在后 B.父类异常在前,子类异常在后
C.只能有子类异常 D.父类异常与子类异常不能同时出现
12、使用catch(Exception e)的好处是( )
A.只会捕获个别类型的异常
B.捕获try语句块中产生的所有类型的异常
C.忽略一些异常
D.执行一些程序
13.请问所有的异常类皆继承哪一个类?( )
A.java.lang.Throwable B.java.lang.Exception
C.java.lang.Error D.java.io.Exception
14.对于已经被定义过可能抛出异常的语句,在编程时( )。
A.必须使用try/catch语句处理异常,或用throw将其抛出。
B.如果程序错误,必须使用 try/catch语句处理异常。
C.可以置之不理。
D.只能使用try/catch语句处理。