[学习笔记] Java面向对象之异常

# 学习 # · 2020-06-29

Java 内置异常类

1、ArithmeticException:出现异常的运算条件。

2、ArrayIndexOutOfBoundsException:用非法索引访问数组。

3、NullPointerException:应用程序试图在需要对象的地方使用null。

4、ClassNotFoundException:应用程序试图加载类时,找不到相应的类。

5、InputMismatchException:欲得到的数据类型与实际输入的类型不匹配。

6、IllegalArgumentException:向方法传递了一个不合法或不正确的参数。

7、ClassCastException:试图将对象强制转换为不是实例的子类。

8、NumberFormatException:试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式。


Java异常处理

1、异常方法:

public String getMessage()        //返回关于发生的异常的详细信息。
public void printStackTrace()     //打印toString()结果和栈层次到System.err,即错误输出流。

2、try-catch(-finally)块:

(1)基本语法:

try{
    // 程序代码
} catch(Exception ex) {
    // 对异常进行处理的代码段
}  finally {
    // 对异常进行处理的代码段
} finally {
    // 程序代码
}

(2)实例:

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());  //输出异常信息
        //System.exit(1);     // finally语句块不执行的唯一情况
    } finally {
        System.out.println("感谢使用本程序!");
    }
}

3、多重catch块:

(1)排列catch 语句的顺序:先子类后父类。

(2)发生异常时按顺序逐个匹配。

(3)只执行第一个与异常类型匹配的catch语句。

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));
        //return; //finally语句块仍旧会执行
    } catch (InputMismatchException e) {
        System.err.println("被除数和除数必须是整数。");
        //return; //finally语句块仍旧会执行
    } catch (ArithmeticException e) {
        System.err.println("除数不能为零。");
        //return; //finally语句块仍旧会执行
    } catch (Exception e) {
        System.err.println("其他未知异常。");
        //return; //finally语句块仍旧会执行
    } finally {
        System.out.println("感谢使用本程序!");
    }
}

4、throws声明异常:

public static void main(String[] args) {
    try {
        divide();
    } catch (Exception e) {
        System.err.println("出现错误:被除数和除数必须是整数,除数不能为零");
    }
}

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 void setSex(String sex) throws Exception {
    if ("男".equals(sex) || "女".equals(sex)){
        this.sex = sex;
    } else {
        throw new Exception("性别必须是“男”或者“女”!");
    }
}

6、throw与throws的区别:

(1)作用不同:throw用于在程序中抛出异常;throws用于声明在该方法内抛出了异常。

(2)使用位置不同:throw位于方法内部,可以作为单独语句使用;throws必须跟在方法参数列表后面,不能单独使用。

(3)内容不同:throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类。

7、异常分类:

(1)Trowable类:所有异常类型都是Throwable类的子类,它派生两个子类,即Error和Exception。

(2)Error类:表示仅靠程序本身无法恢复的严重错误,如内存溢出动态链接失败、虚拟机错误。

(3)Exception类:由Java应用程序抛出和处理的非严重错误,如所需文件找不到,网络连接不通或中断、算术运算出错(如被零除)、数组下标越界、装载了一个不存在的类、对nulll对象操作、类型转换异常等。它的各种不同的子类分别对应不同类型的异常。

(4)运行时异常:包括RuntimeException及其所有子类,不要求程序必须对它们做出处理。

(5)Checked异常(非运行时异常):除了运行时异常外的其他由Exception继承来的异常类。程序必须捕获或者声明抛出这种异常,否则会出现编译错误,无法通过编译。处理方式包括两种:通过try- -catch在当前位置捕获并处理异常:通过throws声明抛出异常,交给上一级调用方法处理。


开源日志记录工具log4j

1、步骤:

(1)在项目中加入log4j的JAR文件。

(2)创建log4j.properties文件。

(3)配置日志信息。

(4)使用log4j记录日志信息。

2、配置日志信息:

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

### 日志信息输出到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
### 信息打印到System.err上 ###
log4j.appender.stdout.Target=System.err
### 指定日志布局类型 ###
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

### 把日志信息输出到文件 ###
log4j.appender.logfile=org.apache.log4j.FileAppender
### 指定日志输出的文件名 ###
log4j.appender.logfile.File=logs.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
如无特殊说明,本博所有文章均为博主原创。

如若转载,请注明出处:一木林多 - https://www.l5v.cn/archives/30/

评论