iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >夯实Java基础系列10:深入理解Java中的异常体系
  • 369
分享到

夯实Java基础系列10:深入理解Java中的异常体系

2023-06-02 15:06:15 369人浏览 薄情痞子
摘要

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2pla

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

https://github.com/h3pl/Java-Tutorial

喜欢的话麻烦点下Star哈

文章首发于我的个人博客:

www.how2playlife.com

本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。

该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供部分知识点对应的面试题以及参考答案。

如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。

泛型概述

泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。

什么是泛型?为什么要使用泛型?

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

一个栗子

一个被举了无数次的例子:

List arrayList = new ArrayList();arrayList.add("aaaa");arrayList.add(100);for(int i = 0; i< arrayList.size();i++){    String item = (String)arrayList.get(i);    Log.d("泛型测试","item = " + item);}

毫无疑问,程序的运行结果会以崩溃结束:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

ArrayList可以存放任意类型,例子中添加了一个String类型,添加了一个Integer类型,再使用时都以String的方式使用,因此程序崩溃了。为了解决类似这样的问题(在编译阶段就可以解决),泛型应运而生。

我们将第一行声明初始化list的代码更改一下,编译器会在编译阶段就能够帮我们发现类似这样的问题。

List arrayList = new ArrayList();

//arrayList.add(100); 在编译阶段,编译器就会报错

特性

泛型只在编译阶段有效。看下面的代码:

List<String> stringArrayList = new ArrayList<String>();List<Integer> integerArrayList = new ArrayList<Integer>();Class classStringArrayList = stringArrayList.getClass();Class classIntegerArrayList = integerArrayList.getClass();if(classStringArrayList.equals(classIntegerArrayList)){    Log.d("泛型测试","类型相同");}

通过上面的例子可以证明,在编译之后程序会采取去泛型化的措施。也就是说Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。

对此总结成一句话:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。

泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法

泛型类

泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。

泛型类的最基本写法(这么看可能会有点晕,会在下面的例子中详解):

class 类名称 <泛型标识:可以随便写任意标识号,标识指定的泛型的类型>{  private 泛型标识  var;   .....  }

一个最普通的泛型类:

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型

//在实例化泛型类时,必须指定T的具体类型public class Generic<T>{    //在类中声明的泛型整个类里面都可以用,除了静态部分,因为泛型是实例化时声明的。    //静态区域的代码在编译时就已经确定,只与类相关    class A <E>{        T t;    }    //类里面的方法或类中再次声明同名泛型是允许的,并且该泛型会覆盖掉父类的同名泛型T    class B <T>{        T t;    }    //静态内部类也可以使用泛型,实例化时赋予泛型实际类型    static class C <T> {        T t;    }    public static void main(String[] args) {        //报错,不能使用T泛型,因为泛型T属于实例不属于类//        T t = null;    }    //key这个成员变量的类型为T,T的类型由外部指定    private T key;    public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定        this.key = key;    }    public T geTKEy(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定        return key;    }}

12-27 09:20:04.432 13063-13063/? D/泛型测试: key is 123456

12-27 09:20:04.432 13063-13063/? D/泛型测试: key is key_vlaue

定义的泛型类,就一定要传入泛型类型实参么?并不是这样,在使用泛型的时候如果传入泛型实参,则会根据传入的泛型实参做相应的限制,此时泛型才会起到本应起到的限制作用。如果不传入泛型类型实参的话,在泛型类中使用泛型的方法或成员变量定义的类型可以为任何的类型。

看一个例子:

Generic generic = new Generic("111111");Generic generic1 = new Generic(4444);Generic generic2 = new Generic(55.55);Generic generic3 = new Generic(false);Log.d("泛型测试","key is " + generic.getKey());Log.d("泛型测试","key is " + generic1.getKey());Log.d("泛型测试","key is " + generic2.getKey());Log.d("泛型测试","key is " + generic3.getKey());D/泛型测试: key is 111111D/泛型测试: key is 4444D/泛型测试: key is 55.55D/泛型测试: key is false

注意:
泛型的类型参数只能是类类型,不能是简单类型。
不能对确切的泛型类型使用instanceof操作。如下面的操作是非法的,编译时会出错。
if(ex_num instanceof Generic){
}

泛型接口

泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中,可以看一个例子:

//定义一个泛型接口public interface Generator<T> {    public T next();}

当实现泛型接口的类,未传入泛型实参时:

class FruitGenerator<T> implements Generator<T>{    @Override    public T next() {        return null;    }}

当实现泛型接口的类,传入泛型实参时:

public class FruitGenerator implements Generator<String> {    private String[] fruits = new String[]{"Apple", "Banana", "Pear"};    @Override    public String next() {        Random rand = new Random();        return fruits[rand.nextInt(3)];    }}

泛型通配符

我们知道Ingeter是Number的一个子类,同时在特性章节中我们也验证过Generic与Generic实际上是相同的一种基本类型。那么问题来了,在使用Generic作为形参的方法中,能否使用Generic的实例传入呢?在逻辑上类似于Generic和Generic是否可以看成具有父子关系的泛型类型呢?

为了弄清楚这个问题,我们使用Generic这个泛型类继续看下面的例子:

public void showKeyValue1(Generic<Number> obj){    Log.d("泛型测试","key value is " + obj.getKey());}Generic<Integer> gInteger = new Generic<Integer>(123);Generic<Number> gNumber = new Generic<Number>(456);showKeyValue(gNumber);// showKeyValue这个方法编译器会为我们报错:Generic<java.lang.Integer> // cannot be applied to Generic<java.lang.Number>// showKeyValue(gInteger);

通过提示信息我们可以看到Generic不能被看作为`Generic的子类。由此可以看出:同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。

回到上面的例子,如何解决上面的问题?总不能为了定义一个新的方法来处理Generic类型的类,这显然与java中的多台理念相违背。因此我们需要一个在逻辑上可以表示同时是Generic和Generic父类的引用类型。由此类型通配符应运而生。

我们可以将上面的方法改一下:

public void showKeyValue1(Generic<?> obj){    Log.d("泛型测试","key value is " + obj.getKey());

类型通配符一般是使用?代替具体的类型实参,注意, 此处的?和Number、String、Integer一样都是一种实际的类型,可以把?看成所有类型的父类。是一种真实的类型。

可以解决当具体类型不确定的时候,这个通配符就是 ? ;当操作类型时,不需要使用类型的具体功能时,只使用Object类中的功能。那么可以用 ? 通配符来表未知类型

public void showKeyValue(Generic obj){
System.out.println(obj);
}

Generic<Integer> gInteger = new Generic<Integer>(123);Generic<Number> gNumber = new Generic<Number>(456);public void test () {//        showKeyValue(gInteger);该方法会报错    showKeyValue1(gInteger);}public void showKeyValue1(Generic<?> obj) {    System.out.println(obj);}// showKeyValue这个方法编译器会为我们报错:Generic<java.lang.Integer>// cannot be applied to Generic<java.lang.Number>// showKeyValue(gInteger);

泛型方法

在java中,泛型类的定义非常简单,但是泛型方法就比较复杂了。

尤其是我们见到的大多数泛型类中的成员方法也都使用了泛型,有的甚至泛型类中也包含着泛型方法,这样在初学者中非常容易将泛型方法理解错了。
泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型 。

    public <T> T genericMethod(Class<T> tClass)throws InstantiationException ,      IllegalAccessException{            T instance = tClass.newInstance();            return instance;    }Object obj = genericMethod(Class.forName("com.test.test"));

泛型方法的基本用法

光看上面的例子有的同学可能依然会非常迷糊,我们再通过一个例子,把我泛型方法再总结一下。

    public class 泛型方法 {    @Test    public void test() {        test1();        test2(new Integer(2));        test3(new int[3],new Object());        //打印结果//        null//        2//        [I@3D8c7aca//        java.lang.Object@5ebec15    }    //该方法使用泛型T    public <T> void test1() {        T t = null;        System.out.println(t);    }    //该方法使用泛型T    //并且参数和返回值都是T类型    public <T> T test2(T t) {        System.out.println(t);        return t;    }    //该方法使用泛型T,E    //参数包括T,E    public <T, E> void test3(T t, E e) {        System.out.println(t);        System.out.println(e);    }}

类中的泛型方法

当然这并不是泛型方法的全部,泛型方法可以出现杂任何地方和任何场景中使用。但是有一种情况是非常特殊的,当泛型方法出现在泛型类中时,我们再通过一个例子看一下

//注意泛型类先写类名再写泛型,泛型方法先写泛型再写方法名//类中声明的泛型在成员和方法中可用class A <T, E>{    {        T t1 ;    }    A (T t){        this.t = t;    }    T t;    public void test1() {        System.out.println(this.t);    }    public void test2(T t,E e) {        System.out.println(t);        System.out.println(e);    }}@Testpublic void run () {    A <Integer,String > a = new A<>(1);    a.test1();    a.test2(2,"ds");//        1//        2//        ds}static class B <T>{    T t;    public void Go () {        System.out.println(t);    }}

泛型方法与可变参数

再看一个泛型方法和可变参数的例子:

public class 泛型和可变参数 {    @Test    public void test () {        printMsg("dasd",1,"dasd",2.0,false);        print("dasdas","dasdas", "aa");    }    //普通可变参数只能适配一种类型    public void print(String ... args) {        for(String t : args){            System.out.println(t);        }    }    //泛型的可变参数可以匹配所有类型的参数。。有点无敌    public <T> void printMsg( T... args){        for(T t : args){            System.out.println(t);        }    }        //打印结果:    //dasd    //1    //dasd    //2.0    //false}

静态方法与泛型

静态方法有一种情况需要注意一下,那就是在类中的静态方法使用泛型:静态方法无法访问类上定义的泛型;如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上。

即:如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 。

public class StaticGenerator<T> {    ....    ....        public static <T> void show(T t){    }}

泛型方法总结

泛型方法能使方法独立于类而产生变化,以下是一个基本的指导原则:

无论何时,如果你能做到,你就该尽量使用泛型方法。也就是说,如果使用泛型方法将整个类泛型化,那么就应该使用泛型方法。另外对于一个static的方法而已,无法访问泛型类型的参数。所以如果static方法要使用泛型能力,就必须使其成为泛型方法。

泛型上下边界

在使用泛型的时候,我们还可以为传入的泛型类型实参进行上下边界的限制,如:类型实参只准传入某种类型的父类或某种类型的子类。

为泛型添加上边界,即传入的类型实参必须是指定类型的子类型

public class 泛型通配符与边界 {    public void showKeyValue(Generic<Number> obj){        System.out.println("key value is " + obj.getKey());    }    @Test    public void main() {        Generic<Integer> gInteger = new Generic<Integer>(123);        Generic<Number> gNumber = new Generic<Number>(456);        showKeyValue(gNumber);        //泛型中的子类也无法作为父类引用传入//        showKeyValue(gInteger);    }    //直接使用?通配符可以接受任何类型作为泛型传入    public void showKeyValueYeah(Generic<?> obj) {        System.out.println(obj);    }    //只能传入number的子类或者number    public void showKeyValue1(Generic<? extends Number> obj){        System.out.println(obj);    }    //只能传入Integer的父类或者Integer    public void showKeyValue2(Generic<? super Integer> obj){        System.out.println(obj);    }    @Test    public void testup () {        //这一行代码编译器会提示错误,因为String类型并不是Number类型的子类        //showKeyValue1(generic1);        Generic<String> generic1 = new Generic<String>("11111");        Generic<Integer> generic2 = new Generic<Integer>(2222);        Generic<Float> generic3 = new Generic<Float>(2.4f);        Generic<Double> generic4 = new Generic<Double>(2.56);        showKeyValue1(generic2);        showKeyValue1(generic3);        showKeyValue1(generic4);    }    @Test    public void testdown () {        Generic<String> generic1 = new Generic<String>("11111");        Generic<Integer> generic2 = new Generic<Integer>(2222);        Generic<Number> generic3 = new Generic<Number>(2);//        showKeyValue2(generic1);本行报错,因为String并不是Integer的父类        showKeyValue2(generic2);        showKeyValue2(generic3);    }}

== 关于泛型数组要提一下 ==

看到了很多文章中都会提起泛型数组,经过查看sun的说明文档,在java中是”不能创建一个确切的泛型类型的数组”的。

也就是说下面的这个例子是不可以的:List<String>[] ls = new ArrayList<String>[10];  而使用通配符创建泛型数组是可以的,如下面这个例子:List<?>[] ls = new ArrayList<?>[10];  这样也是可以的:List<String>[] ls = new ArrayList[10];

下面使用Sun的一篇文档的一个例子来说明这个问题:

List<String>[] lsa = new List<String>[10]; // Not really allowed.    Object o = lsa;    Object[] oa = (Object[]) o;    List<Integer> li = new ArrayList<Integer>();    li.add(new Integer(3));    oa[1] = li; // Unsound, but passes run time store check    String s = lsa[1].get(0); // Run-time error: ClassCastException.

这种情况下,由于JVM泛型的擦除机制,在运行时JVM是不知道泛型信息的,所以可以给oa[1]赋上一个ArrayList而不会出现异常,但是在取出数据的时候却要做一次类型转换,所以就会出现ClassCastException,如果可以进行泛型数组的声明,上面说的这种情况在编译期将不会出现任何的警告和错误,只有在运行时才会出错。

而对泛型数组的声明进行限制,对于这样的情况,可以在编译期提示代码有类型安全问题,比没有任何提示要强很多。
下面采用通配符的方式是被允许的:数组的类型不可以是类型变量,除非是采用通配符的方式,因为对于通配符的方式,最后取出数据是要做显式的类型转换的。

List<?>[] lsa = new List<?>[10]; // OK, array of unbounded wildcard type.    Object o = lsa;    Object[] oa = (Object[]) o;    List<Integer> li = new ArrayList<Integer>();    li.add(new Integer(3));    oa[1] = li; // Correct.    Integer i = (Integer) lsa[1].get(0); // OK 

最后

本文中的例子主要是为了阐述泛型中的一些思想而简单举出的,并不一定有着实际的可用性。另外,一提到泛型,相信大家用到最多的就是在集合中,其实,在实际的编程过程中,自己可以使用泛型去简化开发,且能很好的保证代码质量。

泛型常见面试题

  1. Java中的泛型是什么 ? 使用泛型的好处是什么?

这是在各种Java泛型面试中,一开场你就会被问到的问题中的一个,主要集中在初级和中级面试中。那些拥有Java1.4或更早版本的开发背景的人 都知道,在集合中存储对象并在使用前进行类型转换是多么的不方便。泛型防止了那种情况的发生。它提供了编译期的类型安全,确保你只能把正确类型的对象放入 集合中,避免了在运行时出现ClassCastException。

  1. Java的泛型是如何工作的 ? 什么是类型擦除 ?

这是一道更好的泛型面试题。泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如 List在运行时仅用一个List来表示。这样做的目的,是确保能和Java 5之前的版本开发二进制类库进行兼容。你无法在运行时访问到类型参数,因为编译器已经把泛型类型转换成了原始类型。根据你对这个泛型问题的回答情况,你会 得到一些后续提问,比如为什么泛型是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误泛型代码。请阅读我的Java中泛型是如何工作的来了解更 多信息。

  1. 什么是泛型中的限定通配符和非限定通配符 ?

这是另一个非常流行的Java泛型面试题。限定通配符对类型进行了限制。有两种限定通配符,一种是<? extends T>它通过确保类型必须是T的子类来设定类型的上界,另一种是<? super T>它通过确保类型必须是T的父类来设定类型的下界。泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。另一方面<?>表 示了非限定通配符,因为<?>可以用任意类型来替代。更多信息请参阅我的文章泛型中限定通配符和非限定通配符之间的区别。

  1. List<? extends T>和List <? super T>之间有什么区别 ?

这和上一个面试题有联系,有时面试官会用这个问题来评估你对泛型的理解,而不是直接问你什么是限定通配符和非限定通配符。这两个List的声明都是 限定通配符的例子,List<? extends T>可以接受任何继承自T的类型的List,而List<? super T>可以接受任何T的父类构成的List。例如List<? extends Number>可以接受List或List。在本段出现的连接中可以找到更多信息。

  1. 如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?

编写泛型方法并不困难,你需要用泛型类型来替代原始类型,比如使用T, E or K,V等被广泛认可的类型占位符。泛型方法的例子请参阅Java集合类框架。最简单的情况下,一个泛型方法可能会像这样:

public V put(K key, V value) {

return cache.put(key, value);

}

  1. Java中如何使用泛型编写带有参数的类?

这是上一道面试题的延伸。面试官可能会要求你用泛型编写一个类型安全的类,而不是编写一个泛型方法。关键仍然是使用泛型类型来代替原始类型,而且要使用jdk中采用的标准占位符。

  1. 编写一段泛型程序来实现LRU缓存?

对于喜欢Java编程的人来说这相当于是一次练习。给你个提示,LinkedHashMap可以用来实现固定大小的LRU缓存,当LRU缓存已经满 了的时候,它会把最老的键值对移出缓存。LinkedHashMap提供了一个称为removeEldestEntry()的方法,该方法会被put() 和putAll()调用来删除最老的键值对。当然,如果你已经编写了一个可运行的JUnit测试,你也可以随意编写你自己的实现代码。

  1. 你可以把List传递给一个接受List参数的方法吗?

对任何一个不太熟悉泛型的人来说,这个Java泛型题目看起来令人疑惑,因为乍看起来String是一种Object,所以 List应当可以用在需要List的地方,但是事实并非如此。真这样做的话会导致编译错误。如 果你再深一步考虑,你会发现Java这样做是有意义的,因为List可以存储任何类型的对象包括String, Integer等等,而List却只能用来存储Strings。

List objectList;

List stringList;

objectList = stringList; //compilation error incompatible types

  1. Array中可以用泛型吗?

这可能是Java泛型面试题中最简单的一个了,当然前提是你要知道Array事实上并不支持泛型,这也是为什么Joshua Bloch在Effective Java一书中建议使用List来代替Array,因为List可以提供编译期的类型安全保证,而Array却不能。

  1. 如何阻止Java中的类型未检查的警告?

如果你把泛型和原始类型混合起来使用,例如下列代码,Java 5的javac编译器会产生类型未检查的警告,例如

List rawList = new ArrayList()

注意: Hello.java使用了未检查或称为不安全的操作;

这种警告可以使用@SuppressWarnings(“unchecked”)注解来屏蔽。

参考文章

Https://www.cnblogs.com/huajiezh/p/6411123.html
https://www.cnblogs.com/jpfss/p/9929045.html
https://www.cnblogs.com/denGChengchao/p/9717097.html
https://www.cnblogs.com/cat520/p/9353291.html
https://www.cnblogs.com/coprince/p/8603492.html

微信公众号

个人公众号:程序员黄小斜


黄小斜是 985 硕士,阿里巴巴Java工程师,在自学编程、技术求职、Java学习等方面有丰富经验和独到见解,希望帮助到更多想要从事互联网行业的程序员们。

作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得,以及自学编程和Java技术栈的相关干货。

黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长!

原创电子书:
关注微信公众号【程序员黄小斜】后回复【原创电子书】即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》这份电子书总结了我2年的Java学习之路,包括学习方法、技术总结、求职经验和面试技巧等内容,已经帮助很多的程序员拿到了心仪的offer!

程序员3T技术学习资源: 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 “资料” 即可免费无套路获取,包括Java、pythonc++大数据机器学习前端、移动端等方向的技术资料。

夯实Java基础系列10:深入理解Java中的异常体系

技术公众号:Java技术江湖

如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的微信公众号【Java技术江湖】

这是一位阿里 Java 工程师的技术小站。作者黄小斜,专注 Java 相关技术:SSMSpringBootMySQL分布式中间件集群linux、网络、多线程,偶尔讲点Dockerelk,同时也分享技术干货和学习经验,致力于Java全栈开发!

(关注公众号后回复”Java“即可领取 Java基础、进阶、项目架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)

Java工程师必备学习资源: 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 “Java” 即可免费无套路获取。

夯实Java基础系列10:深入理解Java中的异常体系

--结束END--

本文标题: 夯实Java基础系列10:深入理解Java中的异常体系

本文链接: http://www.lsjlt.com/news/230388.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 夯实Java基础系列10:深入理解Java中的异常体系
    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2pla...
    99+
    2023-06-02
  • 夯实Java基础系列18:深入理解Java内部类及其实现原理
    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2pla...
    99+
    2023-06-02
  • 夯实Java基础系列15:Java注解简介和最佳实践
    Java注解简介注解如同标签Java 注解概述什么是注解?注解的用处注解的原理元注解JDK里的注解注解处理器实战不同类型的注解类注解方法注解参数注解变量注解Java注解相关面试题什么是注解?他们的典型用例是什么?描述标准库中一些有用的注解。...
    99+
    2023-06-02
  • 夯实Java基础系列7:Java 代码块和执行顺序
    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2pla...
    99+
    2023-06-02
  • 夯实Java基础系列2:Java自动拆装箱里隐藏的秘密
    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2pla...
    99+
    2023-06-02
  • 深入理解Java中的java.lang.ArithmeticException异常
    引言 在Java中,异常处理是一种重要的编程机制。异常是指在程序执行过程中发生的错误或异常情况,它打破了正常的程序流程,需要进行相应的处理。Java提供了丰富的异常类和异常处理语法,使开发人员能够更好...
    99+
    2023-10-18
    java 开发语言
  • 深入理解java的异常情况
    目录什么是异常?异常的存在形式Java异常体系异常的分类运行时异常编译时异常错误 Error编译时异常和运行时异常的区别常见的异常防御式编程Java处理异常的语法异常抛出—throw...
    99+
    2024-04-02
  • Java基础中Java的体系结构是什么
    这篇文章给大家介绍Java基础中Java的体系结构是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1 前言到目前为止Java仍然是使用最多的编程语言,随着Java以及Java社区的不断壮大,Java也早已不再是简简...
    99+
    2023-06-26
  • 夯实Java基础系列20:从IDE的实现原理聊起,谈谈那些年我们用过的Java命令
    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2pla...
    99+
    2023-06-02
  • 夯实Java基础系列4:一文了解final关键字的特性、使用方法,以及实现原理
    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2pla...
    99+
    2023-06-02
  • 【JAVA零基础入门系列】Day13 Java类的继承与多态
    继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽)  开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟方法,被继承的类被称为父类或者基类,继...
    99+
    2023-06-03
  • 深入理解JAVA基础类库中对象Object类
    引言 Object类是所有类、数组的父类,位于java.lang 包下也就是说,Java允许把所有任何类型的对象赋给Object类型的变量。当定义一个类时没有使用extends关键字...
    99+
    2024-04-02
  • 深入浅析java中connection reset 的异常处理
    今天就跟大家聊聊有关深入浅析java中connection reset 的异常处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在Java中常看见的几个connection rest...
    99+
    2023-05-31
    connection reset java
  • Python基础学习教程系列讲解——try_except异常处理机制
    在Python编程中不可避免的会出现错误,在调试阶段出现语法之类的错误时,Pycharm会在Debug窗口提示错误,但是程序在运行时由于内部隐含的问题而引起错误,会导致程序终止执行。比如以下例程中,使用urllib库打开URL时由于网络问题...
    99+
    2023-06-02
  • Java深入讲解异常处理try catch的使用
    目录1.try-catch异常处理说明2.try-catch异常处理细节示例01测试结果01示例02测试结果021.try-catch异常处理说明 Java提供try和catch块来...
    99+
    2024-04-02
  • 深入探讨JAVA中的异常与错误处理
    异常与错误:  异常:  在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让...
    99+
    2022-11-15
    JAVA 异常 错误处理
  • 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!
    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2pla...
    99+
    2023-06-02
  • Java JNDI 深入解析:揭秘 Java 中的操作系统级服务访问
    一、Java JNDI 简介 Java JNDI(Java Naming and Directory Interface)是一种用于访问操作系统级服务(如文件系统、邮件系统和数据库)的 Java API。它提供了一套统一的接口,允许 J...
    99+
    2024-02-24
    Java JNDI 操作系统级服务 Java Naming and Directory Interface Java API
  • Java中Map集合体系的基本使用和常用API是什么
    这篇文章主要讲解了“Java中Map集合体系的基本使用和常用API是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中Map集合体系的基本使用和常用API是什么”吧!Map集合概述...
    99+
    2023-07-05
  • 深入理解Java关键字在实时日志处理中的优势!
    Java作为一门高级编程语言,具有丰富的关键字和特性,这些关键字在实时日志处理中具有很大的优势。本文将深入探讨Java关键字在实时日志处理中的优势,并通过演示代码来加深对这些优势的理解。 一、final关键字 final关键字可以修饰变量、...
    99+
    2023-07-07
    实时 日志 关键字
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作