Java OPP 异常

Java OPP 异常

一、异常

1、异常的基本概念

异常在生活中随处可能发生, 生活中的上班开车回家,在中途堵车,这就是异常,异常就是在程序运行过程中出现错误

2、try-catch块

import java.util.*;
public class Test3 {
     
	public static void main(String[] args) {
     
		Scanner in = new Scanner(System.in);
		System.out.print("请输入被除数:");
		try {
     
			int num1 = in.nextInt();
			System.out.print("请输入除数:");
			int num2 = in.nextInt();
			System.out.println(String.format("%d / %d = %d", num1,num2,num1/num2));
			System.out.println("感谢所有本程序");
		} catch (Exception e) {
     
			System.err.println("出现错误:被除数和除数必须是整数,"+"除数不能为零。");
			e.printStackTrace();
		}
	}
}

在这里有三种情况:

  1. try语句块中的语句正常执行,不会发生异常,catch块中的语句不执行。

  2. try语句块在执行中遇到异常,且相应的catch中声明的异常匹配,try中剩余的代码被忽略,catch块中语句将执行。

  3. try语句块在执行中遇到异常,且相应的catch中声明的异常不匹配,那么程序立刻推出。

    异常有如下:

异常 说明
Exception 异常层次结构的根类
ArithmeticException 算术错误情形,如以零作为除数
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException 尝试访问null对象成员
ClassNotFoundException 不能加载所需的类
InputMismatchException 欲得到的数据类型与实际输入的类型不匹配
IllegalArgumentException 对象强制类型转换出错
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式转换异常,如把“abc”转换成数字

3、try-chtch-finally块

public class Test4 {
     
	public static void main(String[] args) {
     
		Scanner in = new Scanner(System.in);
		System.out.print("请输入被除数:");
		try {
     
			int num1 = in.nextInt();
			System.out.print("请输入除数:");
			int num2 = in.nextInt();
			System.out.println(String.format("%d / %d = %d", num1,num2,num1/num2));
		} catch (Exception e) {
     
			System.err.println("出现错误:被除数和除数必须是整数,"+"除数不能为零。");
			System.out.println(e.getMessage());
		}finally {
     
		System.out.println("感谢所有本程序");
		}
	}
}

在这里有二种情况

  1. try语块中所有语句执行完毕,finally执行。
  2. try遇到异常,无论catch块捕获到与否, finally执行。

3、多重catch

import java.util.Scanner;
import java.util.InputMismatchException;//注意这里的MismatchException要导入
public class Test7 {
     
	public static void main(String[] args) {
     
		Scanner in = new Scanner(System.in);
		System.out.print("请输入被除数:");
		try {
     
			int num1 = in.nextInt();
			System.out.print("请输入除数:");
			int num2 = in.nextInt();
			System.out.println(String.format("%d / %d = %d", num1,num2,num1/num2));
		} catch (InputMismatchException e) {
     
			System.err.println("被除数和除数必须是整数。");
		}catch(ArithmeticException e) {
     
			System.err.println("除数不能为零。");
		}catch(Exception ex){
     
			System.err.println("其他未知异常。");
		}finally {
     
			System.out.println("感谢所有本程序!");
		}
	}
}

多重catch块必须由从子类到父类,因为所有的Exception都是从Exception类开始。

如果将父类放在前面那么后面的exception就不会被执行。

4、声明异常—throws

  1. 通过try-catch捕获并处理异常
  2. 通过throws继续声明异常。如果调用者不打算处理该异常,则可以继续通过throws声明异常,以上一级调用者处理异常。main()方法声明的异常将由Java虚拟机。
public class Test8 {
     
	public static void main(String[] args) {
     
		try {
     
			divide();
		} catch (Exception e) {
     
			System.out.println("出现错误:被除数和除数必须是整数,"+"除数不能为零");
			e.printStackTrace();
		}
	}
	public static void divide() throws Exception {
     
		Scanner in = new Scanner(System.in);
		System.out.print("请输入被除数:");
		int num1 = in.nextInt();
		System.out.print("请输入除数");
		int num2 = in.nextInt();
		System.out.println(String.format("%d / %d = %d", num1,num2,num1/num2));
	}
}

5、抛出异常—throw

public class Person {
     
	private String name = "";
	private int age = 0;
	private String sex = "男";
	
	public void setSex(String sex) throws Exception{
     
		if ("男".equals(sex)||"女".equals(sex)) {
     
			this.sex = sex;
		}else {
     
			throw new Exception("性别必须是\"男\"或者\"女\"!");
		}
	}
	public void print() {
     
		System.out.println(this.name+"("+this.sex+","+this.age+"岁)");
	}
}
import org.apache.log4j.Logger;
public class Test9 {
     
	private static Logger logger = Logger.getLogger(Test11.class.getName());
	public static void main(String[] args) {
     
		Person person = new Person();
		try {
     
			person.setSex("Male");
			person.print();
		} catch (Exception e) {
     
			logger.error("被除数和除数必须是整数",e);
			e.printStackTrace();
		}
	}
}

Throw和throws的区别在一下3方面:

  1. 作用不同:throw用于在程序内的抛出异常;throws用于声明在该方法内抛出异常
  2. 使用位置不同: throw 用与方法体内,做单独语句; throws 必须跟在方法参数列表的后面不能单独使用。
  3. 内容不同:throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类

6、异常的分类

Java的异常体系包括许多异常类,它们之间存在继承关系。

  • Throwable类:所有异常类型都是Throwable类的子类,即Error和Exception。
  • Error类:表示仅靠程序本身无法恢复的严重错误。所以在进行程序设计时,应该更关注Exception
  • Exception类:由Java应用程序抛出和处理的非严重错误,如所需文件找不到、网络连接不通或中断、算术运算出错(如被零除)、数组下标越界。
  • Checked异常(非运行时异常),除了运行时异常外的其他由Excption继承来的异常类。

7、日志记录工具log4j

在MyEclipsc中使用log4j的步骤:

  1. 在项目中加入log4j所使用的JAR文件
  2. 创建log4j.prpoerties文件
  3. 编写log4j.prpoerties文件,配置日志信息
  4. 在程序中使用logj记录日志信息

7.1 日志及分类

日志根据记录内容的不同,主要分为以下三类:

  1. SQL日志:记录系统执行的SQL语句
  2. 异常日志:记录系统运行中发生的异常事件
  3. 业务日志:记录系统运行过程,如用户登录,操作记录

7.2 log4j配置文件

输出级别与命名

log4j.rootLogger = debug ,stdout

debug指的是日志记录器(Logger)的输出级别:

  • fatal:指出严重的错误事件将会导致应用程序的退出
  • error:指出虽然发生错误事件,但仍然不影响系统的继续运行
  • warn:表明会出现潜在错误的情形
  • info:在粗拉度级别上指明消息,强调应用程序的运行过程。
  • debug:指出细粒形象事件,对调试应用程序是非常有帮助的

级别为:

fatal>error>warn>info>debug

### 设置Logger输出级别和输出目的地  ###
log4j.rootLogger=debug, stdout,logfile

### 把日志信息输出到控制台  ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

### 把日志信息输出到文件:jbit.log ###
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=jbit.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}%l %F %p %m%n

ConsoleAppender:输出日志事件到控制台。通过Target属性配置输出到System.out或System.err默认的目标到System.out

FileAppender:输出日志事件到一个文件。通过File属性配置文件的路径及名称

SimpleLayout:以一种非常简单的方式格式化日志输出,它输出级别Level,然后跟着一个破折号“—”,最后是日志消息

PatternLayout:根据指定的转换模式格式化日志输出,从而支持丰富多样的输出格式。需要配置layout.ConversionPattern属性,若没有配置该属性,则使用默认的转换模式

你可能感兴趣的:(C#语言)