第五章:异常处理
Posted 二十的十七
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第五章:异常处理相关的知识,希望对你有一定的参考价值。
第五章:异常处理知识梳理
本章内容分为:异常处理概述、try-catch处理异常、throw和throws、自定义异常。
5.1异常处理概述
问题:为什么要异常处理???
编程中我们常说没有完美的代码,几乎每个应用程序都有这样或那样的小问题,异常并不可怕,只要在编程中预先考虑到可能出现问题的代码,然后加以处理就可以避免异常。
那么程序中如果遇到了异常会怎么样呢?会直接终止程序的运行,下面我们就来看看程序中的异常:
package com.exception;
public class Mytest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str=null;
str.toString();
}
}
这里出现了一个空指针的异常(nullpointerexception)。
问题:如果中间出现了异常,后面是否还会正常执行?请看下面代码:
package com.exception;
public class Mytest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("第1步");
System.out.println("第2步");
String str=null;
str.toString();
System.out.println("第3步");
System.out.println("第4步");
}
}
如上代码可知答案:如果中间出现了异常,后面将无法执行。
问题来了,那我们怎么样来处理让它不崩溃呢?所以要进行我们的异常处理,当然在程序运行过程中会出现很多种不同异常,比如说我们的nullpointerexception就是空指针异常,还有下标越界异常。
package com.exception;
public class Mytest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String[]strs= {"11","22"};
System.out.println(strs[2]);
}
}
注释:arrayindexoutofboundsexception是数组的下标越界异常。
还有一种算数异常:
package com.exception;
public class Mytest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(5/0);
}
}
注释:arithmeticexception是算数的异常。
对5.1进行一个小节:一旦出现了运行时异常,程序将终止运行,所以我们就必须要对这种可能出现异常代码进行一个异常捕获处理。
5.2try-catch异常处理
在Java中最顶级的异常处理叫THROWABLE,它下面又分为ERROR异常(一般指系统或硬件级别的异常,我们的Java程序不能处理)和EXCEPTION异常。
(1) 在Java中完成异常的处理一般有两种方式:一种是try catch finally三个关键字,另一种是throw和throws。
下面我们先来看看TRY CATCH FINALLY的使用:
第一个案例:
package com.exception;
public class Mytest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("第1步");
System.out.println("第2步");
try {
System.out.println(5/0);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("第3步");
System.out.println("第4步");
}
}
第二个案例:
package com.exception;
import java.util.Scanner;
public class Mytest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个整数:");
int num=sc.nextInt();
System.out.println("您输入的数字是:"+num);
} catch (Exception e) {
//记录日志,进行提示等
System.out.println("您输入的数据和接收的不一致");
e.printStackTrace();
}
}
}
注释:inputmismatchexception是输入的不匹配异常。当然我们这里用的exception是所有异常的一个父类,它的范围是最大的,我们也可以把它改成对应的类型。
第三个案例:
package com.exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Mytest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Scanner sc=new Scanner(System.in);
System.out.println("请输入第一个整数:");
int num1=sc.nextInt();
System.out.println("请输入第二个整数:");
int num2=sc.nextInt();
System.out.println("计算除法的结果是:"+(num1/num2));
} catch (InputMismatchException e) {
//记录日志,进行提示等
System.out.println("您输入的数据不合法");
e.printStackTrace();
}catch (ArithmeticException e) {
System.out.println("输入的除数为0");
e.printStackTrace();
}catch (Exception e) {
System.out.println("出现了未知异常");
e.printStackTrace();
}
}
}
总结:catch块可以有多个,但是范围小的一定要放在前面,范围大的一定要放在后面,并且在catch后我们还可以加入另外一个特殊的模块,我们叫它为finally,finally是什么意思呢?就是说不管你有没有出现异常,它总会执行finally的代码。
5.3 throw和throws及自定义异常
package com.exception;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Mytest2 {
public static void readFile() throws ClassNotFoundException,FileNotFoundException{
Class.forName("com.exception.Mytest2");
FileInputStream fis=new FileInputStream("C://file.txt");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
readFile();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
笔记:throws用在声明方法的时候,告诉别人该方法有可能出现的异常,我没有处理,你调用的时候来处理。
现在我们来看另外一个关键字throw,throw就是抛出一个具体的异常,下面我们来模拟一个场景:
package com.exception;
public class UserInfo {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws Exception{
if (age<18||age>60) {
//使用throw抛出异常
throw new Exception("用户的年龄只能是18到60岁之间");
}
this.age = age;
}
}
package com.exception;
public class Mytest3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
UserInfo user=new UserInfo();
user.setName("张三");
try {
user.setAge(1);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
下面来讲自定义异常,以下是自定义异常的一个案例:
package com.exception;
//自定义的年龄不合理异常类
public class AgeErrorException extends Exception{
public AgeErrorException(String message) {
super(message);
}
}
package com.exception;
public class UserInfo {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws AgeErrorException{
if (age<18||age>60) {
throw new AgeErrorException("用户的年龄只能是18到60岁之间");
}
this.age = age;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
UserInfo user=new UserInfo();
user.setName("张三");
try {
user.setAge(12);
} catch (AgeErrorException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
总结:自定义异常是EXCEPTION异常的子类,所以必须要继承exception异常才行。
本章内容小节:throw和throws是另一种异常处理的方式,主要是将异常抛出由调用者来完成异常的处理,抛出异常一般和自定义异常配合的较多,以上就是关于Java异常处理的内容。
以上是关于第五章:异常处理的主要内容,如果未能解决你的问题,请参考以下文章