【连载】Java笔记——你正常嘛,你正常吗

51 篇文章 0 订阅
26 篇文章 1 订阅

我是灼灼,一只初学Java的大一金渐层。
向往余秀华和狄兰·托马斯的疯狂,时常沉溺于将情感以诗相寄;追逐过王尔德、王小波的文字,后陷于毛姆和斯蒂芬·金不可自拔;热爱文学的浪潮,白日梦到底却总在现实里清醒;艳羡平静又极度渴盼奔跑的力量。
欢迎与我交流鸭· QQ:1517526827;
个人博客:https://blog.csdn.net/weixin_52777510?spm=1001.2101.3001.5343

Java笔记——异常处理

Java笔记正在连载中,欢迎来其他内容逛逛哟~

相关内容如下:
【连载1】Java笔记——基本结构与流程控制
【连载2】Java笔记——数组操作
【连载3】Java笔记——面向对象编程
【连载4】Java笔记——Java核心类
【连载5】Java笔记——异常处理
【连载6】Java笔记——反射和注解
【连载7】Java笔记——泛型
【连载8】Java笔记——集合
【连载9】MySQL学习笔记
【连载10】JDBC学习笔记
【连载11】Git和GitHub的使用笔记


笔记内容来源于廖雪峰官方网站

CATALOGUE–>

Java的异常

捕获异常

抛出异常

自定义异常

NullPointerException

使用断言

使用JDK Logging

使用Commons Logging

使用Log4j

使用SLF4J和Logback

Java的异常

思维导图笔记如下:

在这里插入图片描述

一个异常的小例子~

try {
    String s = processFile(“C:\\test.txt”);
    // ok:
} catch (FileNotFoundException e) {
    // file not found:
} catch (SecurityException e) {
    // no read permission:
} catch (IOException e) {
    // io error:
} catch (Exception e) {
    // other error:
}

String.getBytes(String)方法定义是:

public byte[] getBytes(String charsetName) throws UnsupportedEncodingException {
    ...
}

捕获异常

思维导图笔记如下:

在这里插入图片描述

抛出异常

思维导图笔记如下:

在这里插入图片描述

自定义异常

思维导图如下:

在这里插入图片描述

Java标准库定义的常用异常包括:

Exception//异常
│
├─ RuntimeException//运行异常
│  │
│  ├─ NullPointerException//空指针异常
│  │
│  ├─ IndexOutOfBoundsException//数组越界异常
│  │
│  ├─ SecurityException//安全异常
│  │
│  └─ IllegalArgumentException//不合法的参数异常
│     │
│     └─ NumberFormatException//数值转换异常
│
├─ IOException//IO流异常
│  │
│  ├─ UnsupportedCharsetException//不支持编码类型异常
│  │
│  ├─ FileNotFoundException//文件找不到打不开异常
│  │
│  └─ SocketException
│
├─ ParseException
│
├─ GeneralSecurityException
│
├─ SQLException
│
└─ TimeoutException

父类的构造方法覆写:

public class BaseException extends RuntimeException {
    public BaseException() {
        super();
    }public BaseException(String message, Throwable cause) {super(message, cause);}public BaseException(String message) {super(message);}public BaseException(Throwable cause) {super(cause);}
}

NullPointerException

思维导图如下:

在这里插入图片描述

调用方要根据null来判断时?

返回null表示文件不存在,那么考虑返回Optional<T>

public Optional<String> readFromFile(String file) {
    if (!fileExist(file)) {
        return Optional.empty();
    }
    ...
}

这样调用方必须通过Optional.isPresent()判断是否有结果。

断言的使用

思维导图如下:

在这里插入图片描述

JDK Logging

思维导图如下:

在这里插入图片描述

重定向

日志级别划分:

JDK的Logging定义了7个日志级别,从严重到普通:

  • SEVERE
  • WARNING
  • INFO //默认级别
  • CONFIG
  • FINE
  • FINER
  • FINEST

Commons Logging

思维导图如下:

在这里插入图片描述

API是什么???

第三方日志库的下载安装~

下载后,解压,找到commons-logging-1.2.jar这个文件,再把Java源码Main.java放到一个目录下,例如work目录:

work
│
├─ commons-logging-1.2.jar
│
└─ Main.java

然后用javac编译Main.java,编译的时候要指定classpath,不然编译器找不到引用的org.apache.commons.logging包。编译命令:

javac -cp commons-logging-1.2.jar Main.java

如果编译成功,那么当前目录下就会多出一个Main.class文件:

work
│
├─ commons-logging-1.2.jar
│
├─ Main.java
│
└─ Main.class

现在可以执行这个Main.class,使用java命令,也必须指定classpath,命令如下:

java -cp .;commons-logging-1.2.jar Main

注意到传入的classpath有两部分:一个是.,一个是commons-logging-1.2.jar,用;分割。.表示当前目录,如果没有这个.,JVM不会在当前目录搜索Main.class,就会报错。

如果在Linux或macOS下运行,注意classpath的分隔符不是;,而是:

java -cp .:commons-logging-1.2.jar Main

运行结果如下:

Mar 02, 2019 7:15:31 PM Main main
INFO: start...
Mar 02, 2019 7:15:31 PM Main main
WARNING: end.

使用Commons Logging时,如果在静态方法中引用Log,通常直接定义一个静态类型变量:

// 在静态方法中引用Log:
public class Main {
    static final Log log = LogFactory.getLog(Main.class);//获取log类的实例

    static void foo() {
        log.info("foo");//使用log方法打日志
    }
}

在实例方法中引用Log,通常定义一个实例变量:

// 在实例方法中引用Log:
public class Person {
    protected final Log log = LogFactory.getLog(getClass());//获取log类的实例
//也可以写成LogFactory.getLog(Person.class);
    void foo() {
        log.info("foo");//使用log方法打日志
    }
}

但是第一种方式有个非常大的好处,子类可以直接使用该log实例,子类获取的log字段实际上相当于LogFactory.getLog(Student.class),但是是从父类继承而来的,由于Java类的动态特性;

// 在子类中使用父类实例化的log:
public class Student extends Person {
    void bar() {
        log.info("bar");//使用log打日志,不需要再获取实例,只需要直接用就行了
    }
}

Log4j

思维导图如下:

在这里插入图片描述

什么是组件化设计思维?(内容来自博客)
我们知道“分子是由原子组成的,分子分成原子,原子也可以重新组合成新的分子”。一个界面是由独立的分子组件搭建而成,分子组件由原子元件构成,这些原子可通过不同的组合方式,组成新分子组件,继而重组构成新的界面。

组件化设计思维是通过对功能及视觉表达中元素的拆解、归纳、重组,并基于可被复用的目的,形成规范化的组件,通过多维度组合来构建整个设计方案,从而提升设计效能。

Log4j的大致架构–>

log.info("User signed in.");
 │
 │   ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
 ├──>│ Appender │───>│  Filter //过滤哪些log需要被输出,哪些log不需要被输出 │───>│  Layout  │───>│ Console //输出到屏幕 │
 │   └──────────┘    └──────────┘    └──────────┘    └──────────┘
 │
 │   ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
 ├──>│ Appender │───>│  Filter  │───>│  Layout //格式化日志信息,比如自动添加日期、时间、方法名称等信息; │───>│   File //输出到文件 │
 │   └──────────┘    └──────────┘    └──────────┘    └──────────┘
 │
 │   ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
 └──>│ Appender │───>│  Filter  │───>│  Layout  │───>│  Socket //通过网络输出到远程计算机 │
     └──────────┘    └──────────┘    └──────────┘    └──────────┘
     jdbc----//输出到数据库

SLF4J和Logback

思维导图如下:

在这里插入图片描述
Commons Logging和SLF4J的接口比较:

Commons LoggingSLF4J
org.apache.commons.logging.Logorg.slf4j.Logger
org.apache.commons.logging.LogFactoryorg.slf4j.LoggerFactory

不同之处就是Log变成了Logger,LogFactory变成了LoggerFactory;

在这里插入图片描述

如果对你有帮助的话不要忘记一键三连噢~
谢谢鸭~

初次编写于2021//14日;

一改于2021/1/24日。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值