我是灼灼,一只初学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的异常
思维导图笔记如下:
一个异常的小例子~
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 Logging | SLF4J |
---|---|
org.apache.commons.logging.Log | org.slf4j.Logger |
org.apache.commons.logging.LogFactory | org.slf4j.LoggerFactory |
不同之处就是Log变成了Logger,LogFactory变成了LoggerFactory;
如果对你有帮助的话不要忘记一键三连噢~
谢谢鸭~
初次编写于2021//14日;
一改于2021/1/24日。