异常的概念_分类
异常(Exception 也称例外)就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
所需的文件找不到;
网络连接不通或中断;
算术运算错(被零除...);
数组下标越界;
装载一个不存在的类或者对null对象操作;
类型转换异常;
异常处理的方式一 _捕获异常
捕获异常所使用的关键字try, catch,finally
try-catch-finally的使用:
·try—catch 的组合
(发生异常,异常代码段不执行):
package com.zqf.Exception;
import java.util.Scanner;
public class TestTryCatch {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try{
System.out.println("请输入被除数:");
int numA = input.nextInt();
System.out.println("请输入除数:");
int numB = input.nextInt();
int result = numA / numB;
System.out.println(numA + "/" + numB+ "="+result);
}catch(Exception e){ //相当于Exception e = new ArithmeticException() 多态的表示形式,父亲引用指向了子类对象
e.printStackTrace( ); //调用了打印堆栈信息的方法
}
System.out.println("程序结束,谢谢您的使用");
}
}
·try—finally组合
(finally是无论是否产生异常,都执行的代码,但是有一种情况finally不执行,即退出虚拟机):
package com.zqf.Exception;
import java.util.Scanner;
public class TestTryFinally {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try{
System.out.println("请输入被除数:");
int numA = input.nextInt();
System.out.println("请输入除数:");
int numB = input.nextInt();
int result = numA / numB;
System.out.println(numA + "/" + numB+ "="+result);
//退出Java虚拟机
System.exit(0);
}finally{
System.out.println("finally中的代码");
}
}
}
·try—catch—finally:
a.正常情况:执行try-finally
b.异常情况类型不想匹配,执行try-finally
c.异常情况:类型不匹配,则先执行完fianlly语句,再回头执行return语句
package com.zqf.Exception;
import java.util.Scanner;
public class TestTryCatchFinally {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try{
System.out.println("请输入被除数:");
int numA = input.nextInt();
System.out.println("请输入除数:");
int numB = input.nextInt();
int result = numA / numB;
System.out.println(numA + "/" + numB+ "="+result);
}catch(ArithmeticException e){
System.out.println("除数不能为0");
System.out.println("获取异常的字符串描述"+e.getMessage());
}finally{
System.out.println("finally中的代码");
}
}
}
异常的处理方式二—声明异常
·声明异常的关键字throws(声明)
方法名的后面,用于声明该方法可能会产生一个异常,如果方发声明的是Exception类型的异常或者是CheckedException异常,要求方法的调用出必须做处理,
1.继续使用throws向上(方法的调用处)声明
2.使用try-catch-finally进行处理
如果声明的是RuntimeException类型的异常,那么方法的调用处可处理可不处理。
package com.zqf.throwsoo;
public class TestThrows {
public static void show()throws Exception{
}
public static void main(String[] args){//throws Exception{ //声明异常
//调用本类中的静态方法show()
try{
show();
}catch(Exception e){
e.printStackTrace( );
}
}
}
·继承关系中的声明异常
1.父类的方法声明了Exception类型的异常,子类在重写方法时,可以声明也可以不声明。但是如果子类重写后的方法使用super关键字调用父类的方法,那么要求必须对异常进行处理。
2.如果父类的方法没有异常,那么子类的方法如果一定会有Exception或Checked异常,要求子类必须自己使用try-catch处理,或者给父类方法加上异常的声明。
3.如果子类在重写父类的方法时,产生的异常是RuntimeException异常时,那么可以不用处理
throw抛出异常对象(写在方法里)
在捕获一个异常前,必须有一段代码先生成异常对象并把它抛出。这个过程我们以手工做,也可以由JRE来实现,但是他们调用的都是throw子句。
package com.zqf.throwsoo;
public class TestThrow {
public static void show(){
try {
throw new Exception();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
show();
}
}
·throws 与 throw
1.throws用于声明方法可能会产生的异常类型
throw手动抛出异常对象
2.throws写在方法名称后面
throw用于写在方法里
常见简单异常的解决办法:
常见的异常类型:
1.运行时异常RuntimeException
a.算术异常 ArithmeticException
b.空指针异常 NullPointerException
c.类型转换异常 ClassCastException
d.数组下标越界 ArrayIndexOutOfBoundException
e.期望的数据类型与实际输入类型不匹配InputMismatchException
package com.zqf.Exception;
import java.util.Scanner;
public class TestRuntimeException {
public static void main(String[] args) {
//(1)算术异常
int b = 0;
if(b!=0){
int result = 1/b;
}else{
System.out.println("对不起除数不能为0");
}
//(2)空指针异常,没有创建对象(new)而调用了对象的属性或方法
String str = null;
if(str!=null){
System.out.println(str.length());
}
//(3)类型转换异常ClassCastException
Animal dog = new Dog(); //向上类型转换
if (dog instanceof Cat){ //instanceof用来判断指定的对象是否真实属于指定的类型,返回值是boolean
Cat c = (Cat)dog; //向下类型转换,转换成真实的子类对象
}
//(4)数组下标越界ArrayIndexOutOfBoundsException
int []arr= {11,22,33}; //长度3
int index = 3;
if(index<arr.length-1){
System.out.println(arr[index]);
}else{
System.out.println("数组下标越出了边界");
}
//(5)期望的数据类型与输入的数据类型不相匹配InputMismatchException
Scanner input = new Scanner(System.in);
if(input.hasNextInt()){ //hasNextInt()判断输入的是否是整数,返回值为Boolean, true or false
int a = input.nextInt();
System.out.println(a);
}else{
System.out.println("对不起,输入的类型与期望的类型不匹配");
}
}
}
class Animal{ }
class Dog extends Animal{}
class Cat extends Animal{}
2.检查时异常Checked Exception
a.SQLExecption
b.IOException
c.ParseException
要求必须做处理,(1)throws向上声明 ; (2)try-catch-finally
package com.zqf.Exception;
import java.io.File;
import java.io.IOException;
public class TestCheckedException {
public static void main(String[] args) throws IOException {
//检查时异常,N多个程序在编译期间必须处理的异常的一总称
File f = new File("C:\\a.txt");
f.createNewFile(); //在C盘创建一个名词为a.txt文件
}
}
自定义异常:
1.为什么需要自定义异常:在程序中,坑你会遇到任何标准异常类都没有充分的描述清楚问题,这种情况下可以创建自己的异常类
2.自定义异常的步骤:a. 继承Exception或RuntimeException b.定义构造方法 c.使用异常
1 package com.zqf.Exception;
2 import java.util.Scanner;
3 public class TestSexException {
4 public static void main(String[] args) {
5 Scanner input = new Scanner(System.in);
6 System.out.println("请输入您的性别:");
7 String gender = input.next();
8 if("男".equals(gender)||"女".equals(gender)){
9 System.out.println("性别录入正确");
10 }else{
11 try {
12 throw new SexException("性别只能是男或者女");
13 } catch (SexException e) {
14 // TODO Auto-generated catch block
15 e.printStackTrace();
16 System.out.println(e.getMessage());
17 }
18 }
19 }
20 }