Java基础回顾——异常处理

介绍

一些错误是用户造成的(类型输入错误),一些错误的随机出现(网络终端、内存耗尽。。。),并且永远不可能避免

获取失败信息:

1、约定错误码

2、异常处理机制

Java内置了一套异常处理机制,使用异常来表示错误
异常是一种class,可以在任何地方抛出,但只需要在上层捕获,这样就和方法调用分离了

在这里插入图片描述

Error表示严重错误,程序对此一般无能为力
Exception是运行时错误,可以被捕获并处理;
Exception分为两大类:
1、RuntimeException以及它的子类
2、非RuntimeException

Java规定:
1、必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,这种类型的异常称为Checked Exception
2、不需要捕获的异常,包括Error以及子类,RuntimeException及其子类

语法

抛出异常

捕获异常使用try—catch—语句

public class Main {
    public static void main(String[] args) {
        byte[] bs = toGBK("中文");
        System.out.println(Arrays.toString(bs));
    }

    static byte[] toGBK(String s) {
        try {
            // 用指定编码转换String为byte[]:
            return s.getBytes("GBK");
        } catch (UnsupportedEncodingException e) {
            // 如果系统不支持GBK编码,会捕获到UnsupportedEncodingException:
            System.out.println(e); // 打印异常信息
            return s.getBytes(); // 尝试使用用默认编码
        }
    }
}

方法定义使用throws

方法定义的时候,使用throws表示该方法抛出的异常类型,调用方在调用的时候必须强制捕获这些异常,否则编译器会报错

public class Main {
    public static void main(String[] args) {
        try {
            byte[] bs = toGBK("中文");
            System.out.println(Arrays.toString(bs));
        } catch (UnsupportedEncodingException e) {
            System.out.println(e);
        }
    }

    static byte[] toGBK(String s) throws UnsupportedEncodingException {
        // 用指定编码转换String为byte[]:
        return s.getBytes("GBK");
    }
}

多catch

每个catch分别捕获对应的Exception及其子类。
存在多个catch的时候,catch的顺序非常重要:子类必须写在前面。

public static void main(String[] args) {
    try {
        process1();
        process2();
        process3();
    } catch (UnsupportedEncodingException e) {
        System.out.println("Bad encoding");
    } catch (IOException e) {
        System.out.println("IO error");
    }
}

finally

无论是否有异常发生,都希望执行一些语句,finally语句块保证有无错误都会执行。

public static void main(String[] args) {
    try {
        process1();
        process2();
        process3();
    } catch (UnsupportedEncodingException e) {
        System.out.println("Bad encoding");
    } catch (IOException e) {
        System.out.println("IO error");
    } finally {
        System.out.println("END");
    }
}

自定义异常

常见的做法是自定义一个BaseException作为“根异常”,然后,派生出各种业务类型的异常。

BaseException需要从一个适合的Exception派生,通常建议从RuntimeException派生:

public class BaseException extends RuntimeException {
}

其他业务类型的异常就可以从BaseException派生:

public class UserNotFoundException extends BaseException {
}

public class LoginFailedException extends BaseException {
}

...

断言

断言(Assertion)是一种调试程序的方式。在Java中,使用assert关键字来实现断言。

public static void main(String[] args) {
    double x = Math.abs(-123.45);
    assert x >= 0;
    System.out.println(x);
}

语句assert x >= 0;即为断言,断言条件x >= 0预期为true。如果计算结果为false,则断言失败,抛出AssertionError。

使用assert语句时,还可以添加一个可选的断言消息:

assert x >= 0 : "x must >= 0";

Java断言的特点是:断言失败时会抛出AssertionError,导致程序结束退出。因此,断言不能用于可恢复的程序错误,只应该用于开发和测试阶段。

JVM默认关闭断言指令,即遇到assert语句就自动忽略了,不执行。

要执行assert语句,必须给Java虚拟机传递-enableassertions(可简写为-ea)参数启用断言。

logging

代码改好删除System.out.println()非常麻烦

日志就是Logging,它的目的是为了取代System.out.println()。

输出日志,而不是用System.out.println(),有以下几个好处:

  • 可以设置输出样式,避免自己每次都写"ERROR: " + var;
  • 可以设置输出级别,禁止某些级别输出。例如,只输出错误日志;
  • 可以被重定向到文件,这样可以在程序运行结束后查看日志;
  • 可以按包名控制日志级别,只输出某些包打的日志;
  • 可以……

Java标准库内置了日志包java.util.logging,可以直接用

日志的输出可以设定级别。JDK的Logging定义了7个日志级别,从严重到普通:

SEVERE
WARNING
INFO
CONFIG
FINE
FINER
FINEST

默认级别是INFO,因此,INFO级别以下的日志,不会被打印出来。使用日志级别的好处在于,调整级别,就可以屏蔽掉很多调试相关的日志输出。

其他日志库

commons logging

第三方日志库,由apache创建的日志模块

下载地址:https://commons.apache.org/proper/commons-logging/download_logging.cgi

下载后,解压,jar文件与Java文件放到同一个目录

使用:

第一步,通过LogFactory获取Log类的实例; 第二步,使用Log实例的方法打日志。

Log4j

是一个非常流行的日志框架

通过配置文件配置

下载地址:https://logging.apache.org/log4j/2.x/download.html

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值