文章目录

  • 1、异常处理概述
  • 2、异常的分类
  • 3、异常的捕获处理
  • 4、重新抛出异常
  • 5、定义新的异常类型
  • 6、异常编程例题


1、异常处理概述

三类程序错误

  1. 编译错误–因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置;
  2. 运行时错误–因为程序在执行时,运行环境发现了不能执行的操作;
  3. 逻辑错误–因为程序没有按照预期的顺序和逻辑执行。

异常——程序运行时可能出现一些错误,比如试图打开一个根本不存在的文件等。如果置之不理,程序便会终止或直接导致系统崩溃,显然这不是我们希望看到的结果。

异常处理机制——当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器

★ 掌握和编写异常处理机制程序:找到异常出现的逻辑、使用完整的数据测试、形成有针对性的异常处理。

2、异常的分类

javavirtualmachinelauncher错误 java程序错误_抛出异常


Throwable是所有异常的共同祖先,异常都是从Throwable继承而来的。Throwable有两个子类,Error和Exception。

① Error是错误,表示运行应用程序中出现了严重的错误,都是通过Error抛出的,一般是程序不能处理的系统错误。错误是没法处理的。

Error类包括一些不能被程序员处理的严重的系统错误类,共有12个直接子类,一般表示代码运行时 JVM(Java 虚拟机)出现的问题,如内存溢出、虚拟机错误、栈溢出等。这类错误与硬件有关,大多数错误与代码编写者执行的操作无关,通常由系统进行处理,程序本身无法捕获和处理。如:当JVM耗完可用内存时,将出现OutOfMemoryError。如Java虚拟机运行错误,将出现VirtualMachineError、类定义错误将出现NoClassDefFoundError等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。

② Exception是异常,表示程序运行时,程序本身可以捕获并且可以处理的错误。异常是可以被处理的!

javavirtualmachinelauncher错误 java程序错误_System_02


常见的异常有:

输入输出异常:IOException
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
操作数据库异常:SQLException
文件未找到异常:FileNotFoundException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
字符串转换为数字异常:NumberFormatException
方法未找到异常:NoSuchMethodException

javavirtualmachinelauncher错误 java程序错误_java_03

3、异常的捕获处理

javavirtualmachinelauncher错误 java程序错误_抛出异常_04


javavirtualmachinelauncher错误 java程序错误_java_05


finally{ }语句块无论是否发生异常,都将被执行。它是整个捕获异常组合语句的出口,可以用来“善后”,如:释放资源、关闭文件。它是可选的操作。

异常:程序运行时,程序本身可以捕获并且可以处理的错误。

异常分为

运行时异常(不受检异常),一般由程序逻辑错误引起。不要求必须处理,编译器不检查。它是JVM在运行期间可能出现的错误,如数组越界、空值对象引用。

非运行时异常(受检异常),比如IOException,必须处理!处理方式有两种:一是try-catch捕获,二是使用throws语句抛出。否则无法编译。

javavirtualmachinelauncher错误 java程序错误_java_06


javavirtualmachinelauncher错误 java程序错误_javase_07


javavirtualmachinelauncher错误 java程序错误_抛出异常_08


javavirtualmachinelauncher错误 java程序错误_System_09

  • 使用throws语句抛出异常
  • 使用try-catch语句捕获异常

★ 存在多个异常时:异常的产生是由语句中的异常顺序来决定的!
捕捉到第一个异常语句以后,就不会再执行该语句的后续语句了~

例如——下图代码,捕捉到数组定义时开辟的数量为负数,错误,抛出该错误,不再执行下面的语句,所以没有捕捉到除以0的错误。

javavirtualmachinelauncher错误 java程序错误_System_10


javavirtualmachinelauncher错误 java程序错误_System_11


try-catch-finally语句发生多重嵌套时,先去执行内层的语句;捕捉好内层的异常之后,再来执行靠外层的语句,捕捉异常。例如:

javavirtualmachinelauncher错误 java程序错误_抛出异常_12


eclipse中写异常语句——

javavirtualmachinelauncher错误 java程序错误_jvm_13


javavirtualmachinelauncher错误 java程序错误_jvm_14


javavirtualmachinelauncher错误 java程序错误_jvm_15


javavirtualmachinelauncher错误 java程序错误_System_16

4、重新抛出异常

重新抛出异常包括throw和throws两种语句。

javavirtualmachinelauncher错误 java程序错误_jvm_17


下图代码中: throw语句明确抛出了一个空指针异常,改变了程序的执行流程(它后面的语句执行不到!!!),程序跳转到相应的异常处理语句中执行。

throw new NullPointerException(参数);

javavirtualmachinelauncher错误 java程序错误_java_18


何时抛出异常???

javavirtualmachinelauncher错误 java程序错误_jvm_19


下面是 throws语句 ——注意看这张图的概念:

javavirtualmachinelauncher错误 java程序错误_java_20


javavirtualmachinelauncher错误 java程序错误_System_21


javavirtualmachinelauncher错误 java程序错误_抛出异常_22

5、定义新的异常类型

系统已经给定的那些异常适用于大部分情况,但还要特定的情况需要自己定义新的异常类型。

javavirtualmachinelauncher错误 java程序错误_jvm_23


自定义异常类的步骤

javavirtualmachinelauncher错误 java程序错误_System_24


例子1:银行业务新编写的一个异常类:BankException

javavirtualmachinelauncher错误 java程序错误_jvm_25


银行类:Bank

javavirtualmachinelauncher错误 java程序错误_抛出异常_26


主函数:

javavirtualmachinelauncher错误 java程序错误_java_27


例子2:货船装载

javavirtualmachinelauncher错误 java程序错误_java_28


javavirtualmachinelauncher错误 java程序错误_抛出异常_29


javavirtualmachinelauncher错误 java程序错误_javase_30

6、异常编程例题

第一题:货船装载问题

javavirtualmachinelauncher错误 java程序错误_javase_31

import java.util.Scanner;
class DangerException extends Exception {
    //starts
     final String message = "超重";
   public String warnMess() {
       return message;
   }
    //end
} 
class CargoBoat {
    int realContent;  //装载的重量
    int maxContent;   //最大装载量
    public void setMaxContent(int c) {
    	maxContent = c;
    }
    public void loading(int m) throws DangerException {
  	//starts
      realContent += m;
       if(realContent>maxContent) {
          throw new DangerException(); 
       }
       System.out.println("目前装载了"+realContent+"吨货物");
	//end
    }
}
public class Main {
	public static void main(String args[]) {
		CargoBoat ship = new CargoBoat();
		Scanner s=new Scanner(System.in);
		ship.setMaxContent(1000);
		int m=0;
		try{
			//starts
            while("".equals(s)==false)
            {m = s.nextInt();
                 ship.loading(m);
            }
			//end
		}
		catch(DangerException e) {
			//starts
            System.out.println(e.warnMess());
            System.out.println("无法再装载重量是"+m+"吨的集装箱");
			//end
		}
		finally {
			System.out.printf("货船将正点启航");
		}
	}
}

第二题

javavirtualmachinelauncher错误 java程序错误_System_32

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
    //write code here
    	Scanner in = new Scanner(System.in);
		try{
            int m = Integer.parseInt(in.next());
            System.out.println(10-m);
        }
        catch(NumberFormatException e){
        	System.out.println("not int");
    	}
        finally {
			System.out.printf("end");
		}
	}
}