期末不挂科系列----异常

news/2024/7/4 0:50:56 标签: java, 封装, class
class="baidu_pl">
class="article_content clearfix">
class="markdown_views prism-atom-one-light">

class="toc">

目录

  • 初始异常
  • 异常体系
  • 异常基本用法
    • 1.捕获异常
      • **try-catch-finally 语句**
      • ***向上传递***
      • **finally 关键字**
      • ***异常处理流程***
      • **try-with-resources语句**
    • **2.抛出异常**
    • **3.声明异常**
  • 自定义异常

初始异常

在我们从学习编程开始 , 学习过程中难免会遇到一些 “异常” , 比如常见的
数组越界异常

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">    class="token keyword">intclass="token punctuation">[class="token punctuation">] arr class="token operator">= class="token punctuation">{class="token number">1class="token punctuation">,class="token number">2class="token punctuation">,class="token number">3class="token punctuation">}class="token punctuation">;
    class="token keyword">forclass="token punctuation">(class="token keyword">int i class="token operator">= class="token number">0class="token punctuation">; i class="token operator">< class="token number">5class="token punctuation">; iclass="token operator">++class="token punctuation">)class="token punctuation">{
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printclass="token punctuation">(arrclass="token punctuation">[iclass="token punctuation">]class="token operator">+class="token string">" "class="token punctuation">)class="token punctuation">;
    class="token punctuation">}
    class="token comment">//运行结果:
    class="token comment">//1 2 3 Exception in thread "main" class="tags" href="/tags/JAVA.html" title=java>java.lang.ArrayIndexOutOfBoundsException: 3
	at fuclass="token punctuation">.class="token function">mainclass="token punctuation">(fuclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">44class="token punctuation">)

null指针异常

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token class-name">String str class="token operator">= class="token keyword">nullclass="token punctuation">;
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(strclass="token punctuation">.class="token function">lengthclass="token punctuation">(class="token punctuation">)class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行结果
class="token class-name">Exception in thread class="token string">"main" class="token class-name">class="token namespace">class="tags" href="/tags/JAVA.html" title=java>javaclass="token punctuation">.langclass="token punctuation">.NullPointerException
	at class="token class-name">Testclass="token punctuation">.class="token function">mainclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">16class="token punctuation">)

算数异常

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token keyword">int a class="token operator">= class="token number">10class="token punctuation">;
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(a class="token operator">/ class="token number">0class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行结果
class="token class-name">Exception in thread class="token string">"main" class="token class-name">class="token namespace">class="tags" href="/tags/JAVA.html" title=java>javaclass="token punctuation">.langclass="token punctuation">.ArithmeticExceptionclass="token operator">: class="token operator">/ by zero
	at class="token class-name">Testclass="token punctuation">.class="token function">mainclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">16class="token punctuation">)

所谓异常指的就是程序在运行时**出现错误时通知调用者的一种机制 , 但在 Java 中有些异常是能够进行避免的 , 有些则不能。

在这里插入图片描述

异常体系

JAVA 中异常的种类有很多, 不同种类的异常具有不同的含义, 也有不同的处理方式 , 每个异常都是 Java 中的一个类 , 每个异常类都直接或间接继承了 Throwable 类 , Throwable 类下有两个直接子类 Exception 类和 Error 类。 继承关系如下图
在这里插入图片描述

  • 其中 Error 指的是 Java 运行时内部错误和资源耗尽错误. 应用程序不抛出此类异常. 这种内部错误一旦出现,除了告知用户并使程序终止之外, 再无能无力. 这种情况很少出现.
  • Exception 是我们程序猿所使用的异常类的父类.
  • 其中 Exception 有一个子类称为 RuntimeException , 这里面又派生出很多常见的异常类

在这里插入图片描述

异常一般分为两大类 , 受查异常非受查异常 , Java语言规范将派生于 Error 类或 RuntimeException 类的所有异常称为 非受查异常 , 所有的其他异常称为 *受查异常.
受查异常
编译期间会被检测 , 受查异常 是必须进行异常处理的 , 如果不进行异常处理 , 代码会编译不通过 , 例如

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">   class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token comment">// 尝试打开文件, 并读其中的一行.
    class="token class-name">File file class="token operator">= class="token keyword">new class="token class-name">Fileclass="token punctuation">(class="token string">"d:/test.txt"class="token punctuation">)class="token punctuation">;
    class="token comment">// 使用文件对象构造 Scanner 对象.
    class="token class-name">Scanner sc class="token operator">= class="token keyword">new class="token class-name">Scannerclass="token punctuation">(fileclass="token punctuation">)class="token punctuation">;
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(scclass="token punctuation">.class="token function">nextLineclass="token punctuation">(class="token punctuation">)class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 编译期间抛出异常 
class="token class-name">Errorclass="token operator">:class="token punctuation">(class="token number">21class="token punctuation">, class="token number">22class="token punctuation">) class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">: 未报告的异常错误class="token class-name">class="token namespace">class="tags" href="/tags/JAVA.html" title=java>javaclass="token punctuation">.ioclass="token punctuation">.FileNotFoundExceptionclass="token punctuation">; 必须对其进行捕获或声明以便抛出

非受查异常
编译期间不会被检测 , 代码在运行期间抛出的异常叫做 非受查异常 , 程序员可以选择是否交给代码去处理 非受查异常 , 例如

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token keyword">intclass="token punctuation">[class="token punctuation">] array class="token operator">= class="token punctuation">{class="token number">1class="token punctuation">, class="token number">2class="token punctuation">, class="token number">3class="token punctuation">, class="token number">4class="token punctuation">, class="token number">5class="token punctuation">}class="token punctuation">;
    class="token keyword">for class="token punctuation">(class="token keyword">int i class="token operator">= class="token number">0class="token punctuation">; i class="token operator">< class="token number">6class="token punctuation">; iclass="token operator">++class="token punctuation">) class="token punctuation">{
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(arrayclass="token punctuation">[iclass="token punctuation">]class="token punctuation">)class="token punctuation">;
    class="token punctuation">}
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"hello world"class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行时 , 抛出了一个数组越界异常程序终止 , hello world 未打印
class="token number">1 class="token number">2 class="token number">3 class="token number">4 class="token number">5 class="token class-name">Exception in thread class="token string">"main" class="token class-name">class="token namespace">class="tags" href="/tags/JAVA.html" title=java>javaclass="token punctuation">.langclass="token punctuation">.ArrayIndexOutOfBoundsExceptionclass="token operator">: class="token number">5
	at class="token class-name">Testclass="token punctuation">.class="token function">mainclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">20class="token punctuation">)

对于 受查异常 我们是必须要做出异常处理的 , 对于 非受查异常 , 我们也可以选择去做出异常处理。
在这里插入图片描述

异常基本用法

1.捕获异常

try-catch-finally 语句

在对于一些可能出现异常的地方 , 我们可以使用 try catch 关键字去捕获可能出现的异常 , 然后对发生异常后做进一步的处理 , 捕获异常的好处就是即使代码运行中出现了异常 , 也不会终止当前代码 , 而是会继续往下走。
语法

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">try class="token punctuation">{
    有可能出现异常的语句
class="token punctuation">} class="token keyword">catch class="token punctuation">(异常类型 异常对象class="token punctuation">) class="token punctuation">{
    异常捕获后的下一步处理
class="token punctuation">} class="token keyword">finally class="token punctuation">{
    异常出口  class="token comment">//finally 不管再任何时候都执行
class="token punctuation">}
  • try 代码块中放的是可能出现异常的代码.
  • catch 代码块中放的是出现异常后的处理行为.
  • finally 代码块中的代码用于处理善后工作, 在最后无论如何都会执行
  • 其中 catchfinally 都可以根据情况选择加或者不加.
  • catch 关键字可以有多个 , 类似 else if 一样

对于上面使用到的代码 , 如果对在循环中的输出语句不进行异常处理的话 , 则 array[i] 就会导致数组越界抛出异常 , 使得后面的代码无法继续执行下去 , 我们就可以使用 try catch 来进行异常捕获

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token keyword">intclass="token punctuation">[class="token punctuation">] array class="token operator">= class="token punctuation">{class="token number">1class="token punctuation">, class="token number">2class="token punctuation">, class="token number">3class="token punctuation">, class="token number">4class="token punctuation">, class="token number">5class="token punctuation">}class="token punctuation">;
    class="token keyword">for class="token punctuation">(class="token keyword">int i class="token operator">= class="token number">0class="token punctuation">; i class="token operator">< class="token number">10class="token punctuation">; iclass="token operator">++class="token punctuation">) class="token punctuation">{
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(arrayclass="token punctuation">[iclass="token punctuation">]class="token punctuation">)class="token punctuation">;
    class="token punctuation">}
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"hello world"class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行时 , 抛出了一个数组越界异常程序终止 , hello world 未打印
class="token number">1 class="token number">2 class="token number">3 class="token number">4 class="token number">5 class="token class-name">Exception in thread class="token string">"main" class="token class-name">class="token namespace">class="tags" href="/tags/JAVA.html" title=java>javaclass="token punctuation">.langclass="token punctuation">.ArrayIndexOutOfBoundsExceptionclass="token operator">: class="token number">5
	at class="token class-name">Testclass="token punctuation">.class="token function">mainclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">20class="token punctuation">)

代码示例1
使用 try catch 对可能出现异常的输出语句进行捕获 , 可以使用异常对象调用 printStackTrace( ) 方法打印错误信息 , 可以看到 , 在出现异常后 , 并不会影响 hello world 正常打印

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token keyword">intclass="token punctuation">[class="token punctuation">] array class="token operator">= class="token punctuation">{class="token number">1class="token punctuation">, class="token number">2class="token punctuation">, class="token number">3class="token punctuation">, class="token number">4class="token punctuation">, class="token number">5class="token punctuation">}class="token punctuation">;
    class="token keyword">for class="token punctuation">(class="token keyword">int i class="token operator">= class="token number">0class="token punctuation">; i class="token operator">< class="token number">10class="token punctuation">; iclass="token operator">++class="token punctuation">) class="token punctuation">{
        class="token comment">// 捕获异常
        class="token keyword">try class="token punctuation">{
            class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printclass="token punctuation">(arrayclass="token punctuation">[iclass="token punctuation">] class="token operator">+ class="token string">" "class="token punctuation">)class="token punctuation">;
        class="token punctuation">} class="token keyword">catch class="token punctuation">(class="token class-name">ArrayIndexOutOfBoundsException eclass="token punctuation">) class="token punctuation">{
            class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"捕获到数组越界异常"class="token punctuation">)class="token punctuation">;
            class="token comment">// 打印异常的详细信息
            eclass="token punctuation">.class="token function">printStackTraceclass="token punctuation">(class="token punctuation">)class="token punctuation">;
        class="token punctuation">}
    class="token punctuation">}
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"hello world"class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行结果
class="token number">1 class="token number">2 class="token number">3 class="token number">4 class="token number">5 捕获到数组越界异常
hello world
class="token class-name">class="token namespace">class="tags" href="/tags/JAVA.html" title=java>javaclass="token punctuation">.langclass="token punctuation">.ArrayIndexOutOfBoundsExceptionclass="token operator">: class="token number">5
	at class="token class-name">Testclass="token punctuation">.class="token function">mainclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">21class="token punctuation">)

代码示例2
catch 异常捕获类型中 , 需要是对应的异常类型才能进行正确捕获 , 否则 , 一旦异常类型不对应 , 程序依然会由于发生异常而终止 , 例如我们将 catch 中的异常捕获类型改成空指针异常 , 可以看到由于程序抛出了数组越界异常 , 后续的 hello world 并没有成功打印 , 由此可知 , 由于异常类型不匹配 , catch 中空指针异常并没有被捕获

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token keyword">intclass="token punctuation">[class="token punctuation">] array class="token operator">= class="token punctuation">{class="token number">1class="token punctuation">, class="token number">2class="token punctuation">, class="token number">3class="token punctuation">, class="token number">4class="token punctuation">, class="token number">5class="token punctuation">}class="token punctuation">;
    class="token keyword">for class="token punctuation">(class="token keyword">int i class="token operator">= class="token number">0class="token punctuation">; i class="token operator">< class="token number">6class="token punctuation">; iclass="token operator">++class="token punctuation">) class="token punctuation">{
        class="token keyword">try class="token punctuation">{
            class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printclass="token punctuation">(arrayclass="token punctuation">[iclass="token punctuation">] class="token operator">+ class="token string">" "class="token punctuation">)class="token punctuation">;
        class="token punctuation">} class="token keyword">catch class="token punctuation">(class="token class-name">NullPointerException eclass="token punctuation">) class="token punctuation">{
            class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"捕获到null指针异常"class="token punctuation">)class="token punctuation">;
            class="token comment">// 打印异常的详细信息
            eclass="token punctuation">.class="token function">printStackTraceclass="token punctuation">(class="token punctuation">)class="token punctuation">;
        class="token punctuation">}
    class="token punctuation">}
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"hello world"class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行结果
class="token number">1 class="token number">2 class="token number">3 class="token number">4 class="token number">5 class="token class-name">Exception in thread class="token string">"main" class="token class-name">class="token namespace">class="tags" href="/tags/JAVA.html" title=java>javaclass="token punctuation">.langclass="token punctuation">.ArrayIndexOutOfBoundsExceptionclass="token operator">: class="token number">5
	at class="token class-name">Testclass="token punctuation">.class="token function">mainclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">21class="token punctuation">)

代码示例3
不过如果对于可能出现多个异常的代码 , 也可以选择多增加几个 catch 来进行捕获多个异常 , 例如在上列代码中增加一个 catch 捕获数组越界异常 , 当代码执行发生了哪个异常 , 则会跳到对应捕获到异常的 catch 代码块中执行 , 且发生异常后不影响程序往下执行

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token keyword">intclass="token punctuation">[class="token punctuation">] array class="token operator">= class="token punctuation">{class="token number">1class="token punctuation">, class="token number">2class="token punctuation">, class="token number">3class="token punctuation">, class="token number">4class="token punctuation">, class="token number">5class="token punctuation">}class="token punctuation">;
    class="token keyword">for class="token punctuation">(class="token keyword">int i class="token operator">= class="token number">0class="token punctuation">; i class="token operator">< class="token number">6class="token punctuation">; iclass="token operator">++class="token punctuation">) class="token punctuation">{
        class="token keyword">try class="token punctuation">{
            class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printclass="token punctuation">(arrayclass="token punctuation">[iclass="token punctuation">] class="token operator">+ class="token string">" "class="token punctuation">)class="token punctuation">;
        class="token punctuation">} class="token keyword">catch class="token punctuation">(class="token class-name">NullPointerException eclass="token punctuation">) class="token punctuation">{
            class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"捕获到null指针异常"class="token punctuation">)class="token punctuation">;
            class="token comment">// 打印异常的详细信息
            eclass="token punctuation">.class="token function">printStackTraceclass="token punctuation">(class="token punctuation">)class="token punctuation">;
        class="token punctuation">} class="token keyword">catch class="token punctuation">(class="token class-name">ArrayIndexOutOfBoundsException eclass="token punctuation">)class="token punctuation">{
            class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"捕获到数组越界异常"class="token punctuation">)class="token punctuation">;
            class="token comment">// 打印异常的详细信息
            eclass="token punctuation">.class="token function">printStackTraceclass="token punctuation">(class="token punctuation">)class="token punctuation">;
        class="token punctuation">}
    class="token punctuation">}
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"hello world"class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行结果
class="token number">1 class="token number">2 class="token number">3 class="token number">4 class="token number">5 捕获到数组越界异常
hello world
class="token class-name">class="token namespace">class="tags" href="/tags/JAVA.html" title=java>javaclass="token punctuation">.langclass="token punctuation">.ArrayIndexOutOfBoundsExceptionclass="token operator">: class="token number">5
	at class="token class-name">Testclass="token punctuation">.class="token function">mainclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">21class="token punctuation">)

向上传递

对于 try 代码块中可能会出现异常的语句 , 如果发生了异常 , 则会结束 try 代码块中的代码 , 而是直接转到 catch 中查看是否有匹配的异常捕获 , 如果没有对应的异常捕获就会将异常向上传递到上层调用者
如果在方法中没有合适的处理异常方式或者没处理异常 , 那么该异常就会就会沿着调用栈向上传递 , 例如在 func 方法中在抛出异常后 , 没对异常进行处理 , 该异常就会向上传递到 main 方法中 , 被 main 方法给捕获了 , 然后在 main 方法中进行了对异常的处理

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">private class="token keyword">static class="token keyword">void class="token function">funcclass="token punctuation">(class="token punctuation">) class="token punctuation">{
    class="token keyword">intclass="token punctuation">[class="token punctuation">] array class="token operator">= class="token punctuation">{class="token number">1class="token punctuation">,class="token number">2class="token punctuation">,class="token number">3class="token punctuation">,class="token number">4class="token punctuation">,class="token number">5class="token punctuation">}class="token punctuation">;
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(arrayclass="token punctuation">[class="token number">5class="token punctuation">]class="token punctuation">)class="token punctuation">; class="token comment">// 发生数组越界的异常
class="token punctuation">}
class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token keyword">try class="token punctuation">{
        class="token function">funcclass="token punctuation">(class="token punctuation">)class="token punctuation">;
    class="token punctuation">} class="token keyword">catch class="token punctuation">(class="token class-name">ArrayIndexOutOfBoundsException eclass="token punctuation">) class="token punctuation">{
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"捕获到 ArrayIndexOutOfBoundsException 异常"class="token punctuation">)class="token punctuation">;
        class="token comment">// 打印异常详细信息
        eclass="token punctuation">.class="token function">printStackTraceclass="token punctuation">(class="token punctuation">)class="token punctuation">;
    class="token punctuation">}
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"hello world"class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行结果
捕获到 class="token class-name">ArrayIndexOutOfBoundsException 异常
hello world
class="token class-name">class="token namespace">class="tags" href="/tags/JAVA.html" title=java>javaclass="token punctuation">.langclass="token punctuation">.ArrayIndexOutOfBoundsExceptionclass="token operator">: class="token number">5
	at class="token class-name">Testclass="token punctuation">.class="token function">funcclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">20class="token punctuation">)
	at class="token class-name">Testclass="token punctuation">.class="token function">mainclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">25class="token punctuation">)

如果一直向上传递到 main 也不对异常进行处理的话或者没有捕捉到该异常的话 , 最终就会交给 JVM 处理 , 而一旦交给 JVM 处理 , 那么 JVM 就会使用最直接的方法 , 将程序终止 , 由于程序直接终止了 , 代码就无法执行到输出 hello world

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">private class="token keyword">static class="token keyword">void class="token function">funcclass="token punctuation">(class="token punctuation">) class="token punctuation">{
    class="token keyword">intclass="token punctuation">[class="token punctuation">] array class="token operator">= class="token punctuation">{class="token number">1class="token punctuation">, class="token number">2class="token punctuation">, class="token number">3class="token punctuation">, class="token number">4class="token punctuation">, class="token number">5class="token punctuation">}class="token punctuation">;
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(arrayclass="token punctuation">[class="token number">5class="token punctuation">]class="token punctuation">)class="token punctuation">; class="token comment">// 发生数组越界的异常
class="token punctuation">}
class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token function">funcclass="token punctuation">(class="token punctuation">)class="token punctuation">;
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"hello world"class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行结果
class="token class-name">Exception in thread class="token string">"main" class="token class-name">class="token namespace">class="tags" href="/tags/JAVA.html" title=java>javaclass="token punctuation">.langclass="token punctuation">.ArrayIndexOutOfBoundsExceptionclass="token operator">: class="token number">5
	at class="token class-name">Testclass="token punctuation">.class="token function">funcclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">20class="token punctuation">)
	at class="token class-name">Testclass="token punctuation">.class="token function">mainclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">24class="token punctuation">)

在这里插入图片描述

finally 关键字

在 异常处理 流程中 , finally 也是很重要的 , finallytry catch 一样也是包含了一个代码块 , 功能是无论是否发生异常都会执行 finally 代码块中的语句

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token keyword">try class="token punctuation">{
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"我是 try 代码块"class="token punctuation">)class="token punctuation">;
    class="token punctuation">} class="token keyword">catch class="token punctuation">(class="token class-name">ArrayIndexOutOfBoundsException eclass="token punctuation">) class="token punctuation">{
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"我是 catch 代码块"class="token punctuation">)class="token punctuation">;
        class="token comment">// 打印异常的详细信息
        eclass="token punctuation">.class="token function">printStackTraceclass="token punctuation">(class="token punctuation">)class="token punctuation">;
    class="token punctuation">} class="token keyword">finally class="token punctuation">{
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"我是 finally 代码块"class="token punctuation">)class="token punctuation">;
    class="token punctuation">}
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"hello world"class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行结果
我是 class="token keyword">try 代码块
我是 class="token keyword">finally 代码块
hello world

由于 finally 代码块无论如何都会执行 , 所以在程序中 finally 代码块一般表示最后的善后工作 , 例如释放资源 , 无论代码是否存在异常, 在 finally 中的代码一定都会执行. 保证最终一定会执行到 Scannerclose 方法.

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java"> class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token class-name">Scanner sc class="token operator">= class="token keyword">new class="token class-name">Scannerclass="token punctuation">(class="token class-name">Systemclass="token punctuation">.inclass="token punctuation">)class="token punctuation">;
    class="token keyword">try class="token punctuation">{
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"我是 try 代码块"class="token punctuation">)class="token punctuation">;
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token number">10 class="token operator">/ class="token number">0class="token punctuation">)class="token punctuation">;
    class="token punctuation">} class="token keyword">catch class="token punctuation">(class="token class-name">ArithmeticException eclass="token punctuation">) class="token punctuation">{
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"我是 catch 代码块"class="token punctuation">)class="token punctuation">;
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"捕获 ArithmeticException 异常"class="token punctuation">)class="token punctuation">;
        class="token comment">// 打印异常的详细信息
        eclass="token punctuation">.class="token function">printStackTraceclass="token punctuation">(class="token punctuation">)class="token punctuation">;
    class="token punctuation">} class="token keyword">finally class="token punctuation">{
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"我是 finally 代码块"class="token punctuation">)class="token punctuation">;
        class="token comment">// 释放 Scanner 资源
        scclass="token punctuation">.class="token function">closeclass="token punctuation">(class="token punctuation">)class="token punctuation">;
    class="token punctuation">}
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token string">"hello world"class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行结果
我是 class="token keyword">try 代码块
我是 class="token keyword">catch 代码块
捕获 class="token class-name">ArithmeticException 异常
我是 class="token keyword">finally 代码块
hello world
class="token class-name">class="token namespace">class="tags" href="/tags/JAVA.html" title=java>javaclass="token punctuation">.langclass="token punctuation">.ArithmeticExceptionclass="token operator">: class="token operator">/ by zero
	at class="token class-name">Testclass="token punctuation">.class="token function">mainclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">21class="token punctuation">)

关于finally代码块的注意事项
由于 finally代码块中无论代码是否存在异常, finally 中的代码一定都会执行到 , 所以如果在写方法需要用返回值时 , 尽量不要在 finally 代码块中写返回值 , 可能会影响最终结果 , 例如以下代码 , 按照常规的执行代码阅读 , 在碰到第一个 return 时代码就应该结束了 , 可是因为后面跟了一个 finally 代码块 , 代码最终执行了第二个 return , 所以最后的结果是 -10

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">private class="token keyword">static class="token keyword">int class="token function">funcclass="token punctuation">(class="token keyword">int aclass="token punctuation">,class="token keyword">int bclass="token punctuation">) class="token punctuation">{
    class="token keyword">try class="token punctuation">{
        class="token keyword">return a class="token operator">+ bclass="token punctuation">;
    class="token punctuation">} class="token keyword">finally class="token punctuation">{
        class="token keyword">return a class="token operator">- bclass="token punctuation">;
    class="token punctuation">}
class="token punctuation">}
class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token function">funcclass="token punctuation">(class="token number">10class="token punctuation">,class="token number">20class="token punctuation">)class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行结果
class="token operator">-class="token number">10

异常处理流程

  1. 程序先执行 try 中的代码
  2. 如果 try 中的代码出现异常, 就会结束 try 中的代码 , 看和 catch 中的异常类型是否匹配
  3. 如果找到匹配的异常类型, 就会执行 catch 中的代码
  4. 如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者
  5. 无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行)
  6. 如果上层调用者也没有处理的了异常, 就继续向上传递.一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止
    在这里插入图片描述

try-with-resources语句

try-with-resources 语句可以自动去处理关闭资源的场景 , 它能够很容易地关闭在 try-catch 语句块中使用的资源 , 所谓的资源 resource 是指在程序完成后,必须关闭的对象 , 使用方法跟 try-catch-finally 类似 , 用来代替 try-catch-finally 语句中的 finally 是程序不管是否出现异常都能正确执行代码
语法

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">try class="token punctuation">(使用的资源class="token punctuation">) class="token punctuation">{
    有可能出现异常的语句
class="token punctuation">} class="token keyword">catch class="token punctuation">(异常类型 异常对象class="token punctuation">) class="token punctuation">{
    异常捕获后的下一步处理
class="token punctuation">}

代码示例
来看一下 try-finally 关闭资源的写法 , 是使用 finally 代码块进行资源关闭的 , 需要手动写代码进行关闭

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token class-name">Scanner sc class="token operator">= class="token keyword">new class="token class-name">Scannerclass="token punctuation">(class="token class-name">Systemclass="token punctuation">.inclass="token punctuation">)class="token punctuation">;
    class="token keyword">try class="token punctuation">{
        class="token comment">// .....
    class="token punctuation">} class="token keyword">finally class="token punctuation">{
        scclass="token punctuation">.class="token function">closeclass="token punctuation">(class="token punctuation">)class="token punctuation">;
    class="token punctuation">}
class="token punctuation">}

再看一下 try-with-resources 自动关闭资源的方法 , 直接将 Scanner 对象定义在 try ( ) 中 , 这样不管代码是如何结束的 , 都能保证 Scanner 对象能被关闭 , 况且这种写法会更简洁

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token keyword">try class="token punctuation">(class="token class-name">Scanner sc class="token operator">= class="token keyword">new class="token class-name">Scannerclass="token punctuation">(class="token class-name">Systemclass="token punctuation">.inclass="token punctuation">)class="token punctuation">) class="token punctuation">{
        class="token comment">// .....
    class="token punctuation">}
class="token punctuation">}

为什么要有 try-with-resources 语句 ?

  • 这是因为 , 在 class="tags" href="/tags/JAVA.html" title=java>java 中有些资源使用完了之后就必须关闭 , 而有的时候程序猿可能会忘记写关闭资源的代码 ,导致资源没有被关闭就造成了资源泄露导致可能下一次就打不开该资源了 , 所以在处理必须关闭的资源时 , 优先使用try-with-resources 语句替代try-finally语句。

    什么类型可以使用 try-with-resources 语句 ?

  • JAVA 标准库中有个 Closeable 接口 , 在 Closeable** 中有个 close 方法 , 因为 try-with-resources 语句就是在程序执行完成后自动调用资源的 close 方法 ,所以只要有类实现了 Closeable 接口并重写了 close 方法就能使用 try-with-resources 语句
    在这里插入图片描述

2.抛出异常

除了 JAVA标准库 中内置的一些类会抛出异常之外 , 我们也可以手动去抛出一个异常 , 在针对有些实际场景下 , 我们可以使用 throw 关键字手动去抛出异常
语法

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">throw class="token keyword">new 异常类型

代码示例
如果我们要写一个计算两个变量相除的结果的方法 , 我们知道 0 是不能作为除数的 , 所以在方法内部我们可以判断除数是否是 0 , 当传入的参数 b 为 0 时则手动抛出一个异常做为提示 , 在抛出异常时可以构造一些描述性信息

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">int class="token function">funcclass="token punctuation">(class="token keyword">int aclass="token punctuation">,class="token keyword">int bclass="token punctuation">) class="token punctuation">{
    class="token keyword">if class="token punctuation">(b class="token operator">== class="token number">0class="token punctuation">)class="token punctuation">{
        class="token keyword">throw class="token keyword">new class="token class-name">ArithmeticExceptionclass="token punctuation">(class="token string">"除数不能为 0"class="token punctuation">)class="token punctuation">;
    class="token punctuation">}
    class="token keyword">return a class="token operator">/ bclass="token punctuation">;
class="token punctuation">}

class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(class="token function">funcclass="token punctuation">(class="token number">10class="token punctuation">,class="token number">0class="token punctuation">)class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行结果
class="token class-name">Exception in thread class="token string">"main" class="token class-name">class="token namespace">class="tags" href="/tags/JAVA.html" title=java>javaclass="token punctuation">.langclass="token punctuation">.ArithmeticExceptionclass="token operator">: 除数不能为 class="token number">0
	at class="token class-name">Testclass="token punctuation">.class="token function">funcclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">20class="token punctuation">)
	at class="token class-name">Testclass="token punctuation">.class="token function">mainclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">26class="token punctuation">)

在这里插入图片描述

3.声明异常

对于某些方法可能会出现异常 , 我们需要提醒调用者知道该方法可能会产生异常 , 就可以在方法声明中使用 throws 关键字来声明该方法可能出现的异常
语法

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java"> class="token keyword">throws 异常类型

代码示例1
如果声明的是一个非受查异常 , 也就是运行时异常 , 在调用者调用该方法时 , 编译器并不会去报错
在这里插入图片描述
调用者可以选择是否去处理这个异常
代码示例2
但如果声明的是一个受查异常 , 编译器就会提醒调用者采取异常处理
在这里插入图片描述
此时解决方法有两个:
一、使用 try - catch - finally 语句 , 将该方法进行异常处理

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token keyword">int a class="token operator">= class="token number">0class="token punctuation">;
    class="token keyword">try class="token punctuation">{
        a class="token operator">= class="token function">funcclass="token punctuation">(class="token number">10class="token punctuation">, class="token number">0class="token punctuation">)class="token punctuation">;
        class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(aclass="token punctuation">)class="token punctuation">;
    class="token punctuation">} class="token keyword">catch class="token punctuation">(class="token class-name">Exception eclass="token punctuation">) class="token punctuation">{
        eclass="token punctuation">.class="token function">printStackTraceclass="token punctuation">(class="token punctuation">)class="token punctuation">;
    class="token punctuation">}
class="token punctuation">}

二、在当前方法中不进行异常处理 , 继续使用 throws 关键字声明该异常向上传递

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token keyword">throws class="token class-name">Exception class="token punctuation">{    
    class="token keyword">int a class="token operator">= class="token function">funcclass="token punctuation">(class="token number">10class="token punctuation">, class="token number">0class="token punctuation">)class="token punctuation">; 
     class="token class-name">Systemclass="token punctuation">.outclass="token punctuation">.class="token function">printlnclass="token punctuation">(aclass="token punctuation">)class="token punctuation">;class="token punctuation">}

throw 和 throws 的区别

  • 写法上 , throw 关键字用于方法内部 , throws 用于方法声明上
  • 用法上 , throw 是直接抛出具体的一个异常 , throws 只是声明了一个异常并没有做任何处理 , 向上传递给调用者表示方法内可能会抛出异常
    在这里插入图片描述

自定义异常

Java 标准库中虽然已经内置了丰富的异常类, 但是我们实际场景中可能还有一些情况需要我们对异常类进行扩展, 创建符合我们实际情况的异常 , 格式如下
格式

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">class 自定义异常 class="token keyword">extends class="token class-name">Exception class="token operator">/ class="token class-name">RuntimeExceptionclass="token punctuation">{
    class="token keyword">public 自定义异常class="token punctuation">(class="token punctuation">)class="token punctuation">{
        class="token keyword">superclass="token punctuation">(class="token punctuation">)class="token punctuation">;
    class="token punctuation">}
    class="token keyword">public 自定义异常class="token punctuation">(class="token class-name">String messageclass="token punctuation">)class="token punctuation">{
    	class="token keyword">superclass="token punctuation">(messageclass="token punctuation">)class="token punctuation">;
    class="token punctuation">}
class="token punctuation">}

关于自定义异常 , 一般都是自定义一个类 , 然后去继承 Exception 或者 RuntimeException 类 , 例如我们自定义一个异常

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">class class="token class-name">MyException class="token keyword">extends class="token class-name">Exception class="token punctuation">{

    class="token keyword">public class="token class-name">MyExceptionclass="token punctuation">(class="token punctuation">)class="token punctuation">{
        class="token keyword">superclass="token punctuation">(class="token punctuation">)class="token punctuation">;
    class="token punctuation">}

    class="token keyword">public class="token class-name">MyExceptionclass="token punctuation">(class="token class-name">String messageclass="token punctuation">) class="token punctuation">{
        class="token keyword">superclass="token punctuation">(messageclass="token punctuation">)class="token punctuation">;
    class="token punctuation">}
class="token punctuation">}

在代码中运用自定义的异常和普通的异常用法没什么区别
一、使用 throw 关键字抛出自定义异常

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token punctuation">{
    class="token keyword">throw class="token keyword">new class="token class-name">MyExceptionclass="token punctuation">(class="token string">"抛出自定义异常"class="token punctuation">)class="token punctuation">;
class="token punctuation">}

class="token comment">// 运行结果
class="token class-name">Exception in thread class="token string">"main" class="token class-name">MyExceptionclass="token operator">: 抛出自定义异常
	at class="token class-name">Testclass="token punctuation">.class="token function">mainclass="token punctuation">(class="token class-name">Testclass="token punctuation">.class="tags" href="/tags/JAVA.html" title=java>javaclass="token operator">:class="token number">35class="token punctuation">)

二、使用 throws 关键字声明异常

class="prism language-class="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">static class="token keyword">void class="token function">mainclass="token punctuation">(class="token class-name">Stringclass="token punctuation">[class="token punctuation">] argsclass="token punctuation">) class="token keyword">throws class="token class-name">MyException class="token punctuation">{
    class="token keyword">throw class="token keyword">new class="token class-name">MyExceptionclass="token punctuation">(class="token string">"抛出自定义异常"class="token punctuation">)class="token punctuation">;
class="token punctuation">}

自定义异常注意事项

  • 自定义异常通常会继承自 Exception 或者 RuntimeException
  • 继承自 Exception 的异常默认是受查异常
  • 继承自 RuntimeException 的异常默认是非受查异常.

在这里插入图片描述

**end!!!**

http://www.niftyadmin.cn/n/1697091.html

相关文章

2017年第一季度全球企业WLAN市场增速放缓

根据IDC最新数据显示&#xff0c;全球无线局域网&#xff08;WLAN&#xff09;市场的综合消费和企业业务在第一季度同比下降了0.8%&#xff0c;达到21.5亿美元。而一季度企业板块同比增长4.4%&#xff0c;达到12.4亿美元。 与2011年第一季度相比&#xff0c;今年第一季度企业WL…

2017年大数据发展十大新趋势

2017年大数据发展的10大趋势经由全球专业机构发布&#xff0c;希望可以为你所在机构的年的发展规划提供战略政策依据。 数据量将持续增长 数据量的不断增加意味着通过数据的快速分析获取宝贵的市场洞察已经成为大数据业务运营的关键环节。机构和企业组织必须将其内部未被利用的…

偶尔学一下数据库

百年不学习、偶尔学一下数据库一、数据库的认识1、我们为什么要选择MySQL2、什么是MySQL数据库3、MySQL的优势4、MySQL的发展史5、MySQL的特性6、MySQL的应用环境7、如何学MySQL8、如何学好MySQL小结二、放弃前的准备工作1、启动和停止MySQL服务器2、MySQL安装三、开始学习吧&a…

GitHub实践笔记1---各种报错处理

问题1: 现象&#xff1a; git pull 报错&#xff1a; refusing to merge unrelated histories 背景&#xff1a; 本地建立git仓库命名为ImageSegment&#xff0c;并在里面放入写好的代码&#xff1b; 在github上建立repository命名为ImageSegment&#xff0c;并带有初始化文件r…

企业以太坊联盟组建,多家企业加入

Microsoft最近在一篇博客文章中宣布&#xff0c;他们加入了新组建的企业以太坊联盟&#xff08;Enterprise Ethereum Alliance&#xff09;。已加入该联盟的企业包括Intel、J.P. Morgan、BNY Mellon、BP、ING、Thomson Reuters以及一些区块链初创企业。该联盟的使命在于&#x…

数据库学习第二课

MySQL 第二课回顾一下新课介绍CRUD一、新增/插入 操作二、查询① 全列查询②指定列查询④别名⑤去重六排序总结回顾一下 上一课我们介绍了 库操作和表操作&#xff0c;以及一些理论。同时也介绍了DDL的意思是数据定义语言&#xff0c;那么我们就简单回忆一下库操作和表操作把 …

Java中substring的参数及字符串的相等判断

字符串操作无疑在各种编程语言及平台上都是必不可少的&#xff0c;功能相通&#xff0c;但用法却存在微妙的区别&#xff0c;比如java中取子串及相等的判断&#xff0c;切入正题。 1. substring 常用的用法包括&#xff1a; &#xff08;1&#xff09;取索引为startidx之后&…

内卷室友系列 -- day01 计算机网络概论

网络工程师备考学习30天 -- day01 计算机网络概论一、计算机网络的形成与发展 -- 了解概念发展二、计算机网络的组成与划分计算机网络的组成通信子网与资源子网资源子网通信子网计算机网络的拓扑结构 ※记住有那些结构概念LAN MAN WAN计算机网络的应用三、计算机网络的分层管理…