美文网首页
Java 基础二

Java 基础二

作者: bowen_wu | 来源:发表于2021-07-03 16:04 被阅读0次

    基本术语

    术语
    Host 主机:计算机在计算机网络中的学名
    IP Address IP 地址:网际协议中用于标识发送或接收数据报的设备的一串数字
    IPv4 - Internet Protocol version 4 4 byte => 32 位 => 2 ^ 32 个地址 => 使用 . 连接起来
    IPv6 - Internet Protocol version 6 16 byte => 128位 => 2 ^ 128 个地址
    DNS - Domain Name System 域名服务
    Port 端口:共 65536 个 Port
    Default Port 端口指定了通讯主机的归属地
    HTTPS Default Port 443
    HTTP Default Port 80
    TCP / UDP 通讯协议
    TCP - Transport Control Protocol 基于流的协议 => 全双工协议 => 双方可以同时接收 & 发送 => 定义了字节流在网络上如何发送和接收
    HTTP - HyperText Transfer Protocol 超文本传输协议 => 在与主机的连接中发送一些规定的字符
    HTML - HyperText Markup Language
    XML - Extended Markup Language
    CPU - Central Processing Unit 中央处理器:解释计算机指令以及处理计算机软件中的数据
    Memory - 内存 CPU 能直接寻址的存储空间。内存特点是访问速率快 => 断电丢失 => CPU 这个世界慢死了
    HDD - Hard Disk Drive 硬盘 => 存储数据,容量大,断电不丢失,慢
    SSD - Solid-state Disk 固态硬盘 / 固态驱动器:以集成电路制作的电脑存储设备
    HTTP 发送 & 接收的字符

    文件 & IO

    文件

    • 文件就是一段字节流
    • 每个程序负责解释文件中的字节流

    java.io.File

    // TODO

    IO

    • 输入输出永远是站在程序的角度上考虑的
    • InputStream | OutputStream => 抽象的输入输出操作
    • 永远使用绝对路径

    java.io.File => 文件的路径

    File class 只代表一个路径 => 抽象的文件路径 => 文件 | 文件夹

    方法

    • exists() | isFile() | isDirectory()
    • toPath()

    NIO

    NIO Java7+ => New IO => Non-Blocking IO => 非阻塞 IO

    • java.nio.file.Path -> interface => NIO 的 Path 就是旧版本的 File
    • java.nio.file.Files -> class => file 的工具类方法

    java.nio.file.Path

    // TODO

    java.nio.file.Files

    // TODO

    java.nio vs java.io

    • 经典的IO模型是基于流的
      • 优点:容易理解,方便抽象 => 一份代码既可以读写文件,也可以读写网络
      • 缺点:慢
    • NIO 基于块的 => 对应的模型是 java.nio.ByteBuffer
      • 优点:块之间没有顺序,可以同时写

    异常体系 Exception

    Exception 异常体系就是在 return 语句之外为方法提供另外一种出口

    • Throwable => 可以被抛出的东西 => checked exception => 有毒
    • Exception => checked exception => 受检异常 => 有毒 => 预料之内的异常 => 需要对预料之内的异常进行处理 => IOException => 可以恢复
      • RuntimeException => unchecked exception => 运行时异常,无毒 => 意料之外的 => Bug => 不需要声明
    • Error => unchecked exception => 错误,无毒 => 不能恢复的异常

    try catch finally

    • 在栈帧中一旦碰到 throw 它会结束当前栈帧,如果没有 try,异常将击穿所有栈帧,直到遇到 try catch
    • try catch finally 中的 finally 无论什么情况都会被执行,即使 try | catch 中有 return
    • finally 块中不建议写 return 语句,finally 块中最好的实践是执行资源的清理工作
    • catch 中做的事情
      • 处理异常
      • 在日志里打印异常
      • 返回对应的对异常的处理
    • try-with-resources => JDK 7+ => try(content) {} => content 会在 finally 中自动的 close => 隐式的 finally => content 必须实现 AutoCloseable interface

    throw vs throws

    • throw => 抛出一个 Throwable,终止方法当前的操作
    • throws => 只是一个声明 => 表示一个方法可能会抛出一个异常 => 后果:任何调用了它的方法都有被迫在自己的方法签名上丢一个 throws 语句或者加 try catch

    catch 的级联与合并

    级联

    public static void main(String[] args) {
        try{
            throwCheckedException();
        } catch (FileNotFoundException e) {
            System.out.println("文件没找到");
        } catch (EOFException e) {
            System.out.println("文件已到达末尾");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    catch 错误的顺序按照从小到大的顺序排列

    合并 Java 7+

    public static void main(String[] args) {
        try{
            throwCheckedException();
        } catch (NullPointerException | IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalStateException | IllegalArgumentException e) {
            // 做点别的事情
        }
    }
    

    StackTrace 栈轨迹 & 异常链 Caused by

    排查问题最重要的信息,没有之一

    public static void main(String[] args) {
        try {
            processUserData();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    
    private static class UserAlreadyExistException extends RuntimeException {
        public UserAlreadyExistException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    
    private static void processUserData() {
        int userId = 1;
        try {
            insetIntoDatabase();
        } catch (SQLException e) {
            throw new UserAlreadyExistException("插入 id 为" + userId + "的数据的时候发生了异常", e);
        }
    }
    
    private static void insetIntoDatabase() throws SQLException {
        throw new SQLException("重复的键值");
    }
    
    Stack Trace & Caused by

    异常抛出原则

    • 能用 if else 处理的,不要使用异常(try catch)
      • 无法保证 catch 到的异常一定是想抓到的,可能错误的 catch 到了更深层次的异常
      • 相比于正常的 if 判断,异常的创建是非常,非常昂贵的操作
    • 尽早抛出异常 => 如果可以处理异常,则处理,如果处理不了,要立刻抛出这个异常
    • 异常要准确,带有详细信息
    • 抛出异常也比悄悄的执行错误的逻辑强的多

    异常的处理原则

    1. 本方法是否有责任处理这个异常? => 不要处理不归自己管的异常
    2. 本方法是否有能力处理这个异常? => 如果自己无法处理,就抛出
    3. 如非万分必要,不要忽略异常
      try {
          URLDecoder.decode("", "UTF-8");
      } catch (UnsupportedEncodingException ignored) {
          // 忽略异常
      }
      

    JDK 内置异常

    • NullPointerException
    • ClassNotFoundException | NoClassDefFoundError
    • IllegalStateException | IllegalArgumentException | IllegalAccessException
    • ClassCastException

    知识点

    1. File Leak Detector => 用于检测没有被正确关闭的文件 => 如果打开一个文件没有关闭的话是很危险的 => 读取一个文件之后一定要正确的关闭它
    2. CSV => Comma Separated Value => 逗号分隔符文件 => 保存结构化数据的方式
    3. String 不可变
    4. 浏览器对于 application/zip 的 HTTP Response Header Content-Type 的处理方式是直接下载
    5. HTTP 协议是无状态
    6. IO 的速度和 CPU 的速度不是一个量级的,可以采用以下两个方式改善性能
      • 缓冲 -> buffer | cache => 缓存放在内存中
      • 并发 -> 多线程 => CPU 在等待 IO 的过程中去做了其他的事情
    7. IO 太慢了怎么办?
      答:java.io.BufferedReader | java.io.BufferedWriter => 一次性读取 | 写入好多东西到缓冲区 => 缓存放在内存中
    8. 轮子 => org.apache.commons.io.FileUtils & org.apache.commone.io.IOUtils
    9. IOException 通常代表预期之内的异常

    相关文章

      网友评论

          本文标题:Java 基础二

          本文链接:https://www.haomeiwen.com/subject/eqmmyltx.html