java学习一课一得

前言

Java是一种广泛用于开发各种应用程序的高级编程语言。它是由Sun Microsystems(目前为Oracle公司所拥有)于1995年推出的,并且是一种面向对象的语言。

Java的设计目标是可移植性、可靠性和安全性。它的语法类似于C++,但是省略了一些复杂的特性,使得开发更加简洁和易于理解。

Java的特点包括:

平台独立性:Java程序可以在不同的操作系统上运行,只要安装了Java虚拟机(JVM)即可。

自动内存管理:Java提供了垃圾回收机制,自动释放不再使用的内存,减少了程序员对内存管理的工作。

强大的标准库:Java提供了丰富的标准库,包含了各种常用的函数和类,方便开发者进行开发。

面向对象:Java是一种面向对象的语言,支持封装、继承和多态等特性,使得开发更加灵活和可扩展。

Java被广泛应用于各种领域,包括Web开发、移动应用开发、大数据处理、人工智能等。它是世界上最流行的编程语言之一,被众多开发者和企业广泛采用。

学习过程

window系统安装java

下载JDK
首先我们需要下载 java 开发工具包 JDK,下载地址:jdk官网,在下载页面中根据自己的系统选择对应的版本,本文以 Window 64位系统为例:
在这里插入图片描述
下载后 JDK 的安装根据提示进行,还有安装 JDK 的时候也会安装 JRE,一并安装就可以了。

安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为 C:\Program Files (x86)\Java\jdk1.8.0_91。

配置环境变量
具体流程请参考网上教程
在这里插入图片描述

Java 基本数据类型

变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。

内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。
因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。
Java 的两大数据类型:
内置数据类型

数据类型描述存储大小(字节)默认值
byte8位有符号二进制整数10
short16位有符号二进制整数20
int32位有符号二进制整数40
long64位有符号二进制整数80L 或 0l
float单精度32位IEEE 754浮点数40.0F或0.0f
double双精度64位IEEE 754浮点数80.0 或 0.0D(d可省略)
char16位Unicode字符2‘\u0000’(空字符)
boolean布尔值类型不确定(依赖于JVM实现)false

引用数据类型

引用数据类型描述
类 (Class)自定义的数据类型,包含属性(变量)和方法(函数)。在Java中,所有的类都继承自Object类,除非明确指定了其他父类。
接口 (Interface)一种完全抽象的类,只包含抽象方法和常量。接口不能被实例化,但可以被类实现(implements)。实现接口的类必须提供接口所有抽象方法的实现。
数组 (Array)用于存储固定数量的同类型元素(可以是基本数据类型或引用数据类型)的集合。数组的大小在创建时确定,并且之后不能改变。

类(Class):类是Java中最基本的引用数据类型,它是由类定义实例化得到的。对象可以存储多个数据值,并且可以调用它所属类中定义的方法。
接口(Interface):接口也是一种引用数据类型,它定义了一组方法的规范,没有具体的实现。类实现接口时,必须实现接口中定义的所有方法。
数组(Array):数组是一种引用数据类型,它可以存储相同类型的多个数据值。数组的长度是固定的,一旦创建后,长度就不可改变。通过索引可以访问数组中的元素。

选择结构

在编程中,我们经常需要根据不同的条件执行不同的代码块。Java提供了多种选择结构来实现这种需求,其中最常用的是if-else和switch语句

  1. if-else语句
    if-else语句允许我们根据一个或多个条件来执行相应的代码块。下面是一个简单的例子:
public class IfElseExample {  
    public static void main(String[] args) {  
        int score = 85;  
  
        if (score >= 90) {  
            System.out.println("优秀!");  
        } else if (score >= 80) {  
            System.out.println("良好!");  
        } else if (score >= 60) {  
            System.out.println("及格!");  
        } else {  
            System.out.println("不及格!");  
        }  
    }  
}

在这个例子中,我们根据分数score的不同值来输出不同的评价。

  1. switch语句
    switch语句是另一种选择结构,它允许我们根据一个表达式的值来执行多个不同的代码块。以下是一个switch语句的例子:
public class SwitchExample {  
    public static void main(String[] args) {  
        char grade = 'B';  
  
        switch (grade) {  
            case 'A':  
                System.out.println("优秀!");  
                break;  
            case 'B':  
                System.out.println("良好!");  
                break;  
            case 'C':  
                System.out.println("及格!");  
                break;  
            default:  
                System.out.println("未知等级!");  
        }  
    }  
}

在这个例子中,我们根据等级grade的不同值来输出不同的评价。注意,在每个case语句的末尾,我们使用break语句来跳出switch结构,以防止程序继续执行下一个case的代码块。如果省略了break语句,将会发生“穿透”(fall-through)现象,即程序会继续执行下一个case的代码块,直到遇到break语句或switch结构的末尾。

通过使用if-else和switch语句,我们可以编写出更加灵活和高效的代码来处理不同的条件和情况。

循环结构

在Java编程中,循环结构是一种非常重要的控制流语句,它允许我们重复执行一段代码,直到满足某个条件为止。Java提供了几种不同类型的循环结构,包括for循环、while循环和do-while循环。下面我们将分别介绍这些循环结构,并给出相应的示例。

  1. for循环
    for循环是Java中最常用的循环结构之一,它通常用于在知道循环次数的情况下进行循环。for循环的语法如下:
for (初始化; 条件; 更新) {  
    // 循环体  
}

示例:使用for循环打印数字1到10。

public class ForLoopExample {  
    public static void main(String[] args) {  
        for (int i = 1; i <= 10; i++) {  
            System.out.println(i);  
        }  
    }  
}

在这个例子中,我们定义了一个变量i,并将其初始化为1。然后,我们检查i是否小于或等于10,如果是,则执行循环体(打印i的值),并在每次循环结束后将i增加1。当i大于10时,循环终止。

  1. while循环
    while循环在条件为真时重复执行一段代码。它的语法如下:
初始化;  
while (条件) {  
    // 循环体  
    更新;  
}

注意,与for循环不同,while循环的初始化、更新和条件检查是分开进行的。

示例:使用while循环打印数字1到10。

public class WhileLoopExample {  
    public static void main(String[] args) {  
        int i = 1;  
        while (i <= 10) {  
            System.out.println(i);  
            i++;  
        }  
    }  
}

在这个例子中,我们首先初始化变量i为1。然后,我们进入一个while循环,只要i小于或等于10,就打印i的值,并将i增加1。当i大于10时,循环终止。

  1. do-while循环
    do-while循环与while循环类似,但有一点不同:do-while循环至少会执行一次循环体,即使条件在第一次检查时就为假。它的语法如下:
初始化;  
do {  
    // 循环体  
    更新;  
} while (条件);

示例:使用do-while循环打印数字1到10(虽然这个例子与while循环没有本质区别,但展示了do-while的至少执行一次的特性)。

public class DoWhileLoopExample {  
    public static void main(String[] args) {  
        int i = 1;  
        do {  
            System.out.println(i);  
            i++;  
        } while (i <= 10);  
    }  
}

在这个例子中,即使我们将i的初始值设置为大于10的数,循环体也会至少执行一次(当然,在这个特定的例子中,由于i的初始值为1,所以循环体会正常执行10次)。

通过使用这些循环结构,我们可以编写出能够重复执行特定任务的Java程序,从而实现更加复杂和高效的功能。

数组

在Java编程中,数组是一种用于存储相同类型元素的固定大小的连续内存块。数组提供了一种方便的方式来组织和管理一组相关的数据。下面我们将介绍Java中数组的基本概念和用法,并给出一个简单的示例。

数组的基本概念

元素:数组中的每一个数据项称为数组的元素。
索引:每个元素都有一个唯一的索引值,用于标识它在数组中的位置。在Java中,数组索引从0开始。
长度:数组的长度是数组中可以容纳的元素数量。一旦数组被创建,其长度就不能改变。

数组的声明和初始化

在Java中,数组的声明和初始化可以分开进行,也可以同时进行。

声明数组

int[] numbers; // 声明一个整型数组变量numbers

初始化数组
静态初始化:在声明数组的同时分配空间并初始化元素。

int[] numbers = {1, 2, 3, 4, 5}; // 静态初始化数组

动态初始化:先声明数组,再分配空间。

int[] numbers = new int[5]; // 分配一个长度为5的整型数组  
numbers[0] = 1;  
numbers[1] = 2;  
// ... 以此类推

数组的使用示例
下面是一个简单的示例,展示了如何声明、初始化和使用数组:

public class ArrayExample {  
    public static void main(String[] args) {  
        // 静态初始化数组  
        int[] numbers = {10, 20, 30, 40, 50};  
  
        // 遍历数组并打印元素  
        for (int i = 0; i < numbers.length; i++) {  
            System.out.println("numbers[" + i + "] = " + numbers[i]);  
        }  
  
        // 修改数组元素  
        numbers[2] = 300;  
  
        // 再次遍历数组并打印元素  
        for (int i = 0; i < numbers.length; i++) {  
            System.out.println("numbers[" + i + "] = " + numbers[i]);  
        }  
    }  
}

在这个示例中,我们首先使用静态初始化方式创建了一个整型数组numbers,并为其分配了5个初始值。然后,我们使用一个for循环遍历数组并打印每个元素的值。接着,我们修改了数组索引为2的元素的值,并再次遍历数组以验证修改是否生效。

通过数组,我们可以更方便地处理一组相同类型的数据,如排序、搜索、计算等。在实际应用中,数组是非常常用的数据结构之一。

方法

在Java中,方法是执行特定任务的代码块。它们使代码更加模块化和可重用。下面,我将为您演示如何编写一个简单的Java方法,并解释其各个部分。

方法定义

定义方法
在Java中,方法的定义通常包括以下几个部分:

访问修饰符:如 public、private、protected 或默认(不写任何修饰符)。这决定了其他类是否可以访问该方法。
返回类型:方法执行后返回的数据类型。如果方法不返回任何值,则返回类型为 void。
方法名:用于标识和调用方法的名称。
参数列表:方法执行时需要的输入数据,包括数据类型和变量名。如果方法没有参数,则参数列表为空。
方法体:包含方法执行的Java语句。

首先,我们定义一个名为greet的方法,它接受一个字符串参数name,并返回一个字符串。

public class Example {  
      
    // 定义一个名为addNumbers的方法,它接受两个整数参数并返回它们的和  
    public int addNumbers(int num1, int num2) {  
        int sum = num1 + num2;  
        return sum;  
    }  
      
    // 主方法,程序的入口点  
    public static void main(String[] args) {  
        // 接下来我们将在main方法中调用addNumbers方法  
    }  
}

这就是如何在Java中编写一个简单的方法的基本步骤。通过编写和使用方法,您可以更好地组织您的代码,并使其更加易于理解和维护。

调用方法
要在Java中调用一个方法,你需要:

创建方法所在类的对象(如果方法不是静态的)。
使用对象名(或类名,如果方法是静态的)和点符号(.)来访问方法。
提供方法所需的参数(如果方法有参数)。
处理方法的返回值(如果方法有返回值)。
以下是如何在上面的 main 方法中调用 addNumbers 方法的示例:

public class Example {  
      
    // ... 省略addNumbers方法的定义 ...  
      
    // 主方法,程序的入口点  
    public static void main(String[] args) {  
        // 创建Example类的对象  
        Example example = new Example();  
          
        // 调用addNumbers方法,并将结果存储在变量result中  
        int result = example.addNumbers(5, 3);  
          
        // 打印结果  
        System.out.println("The sum is: " + result);  
    }  
}

在这个例子中,我们首先创建了 Example 类的一个对象 example。然后,我们使用 example 对象和点符号来调用 addNumbers 方法,并传入参数 5 和 3。方法的返回值(即 8)被存储在 result 变量中,并最终被打印到控制台上。

类与对象

在Java编程中,类和对象是核心概念。类是对象的蓝图或模板,而对象则是根据这个蓝图创建的具体实例。今天,我们将通过一个简单的Person类来探讨如何在Java中定义类、创建对象以及调用对象的方法。

定义Person类

首先,我们定义一个名为Person的类。这个类将包含两个关键属性:name(姓名)和age(年龄)。为了确保数据的安全性和封装性,我们将这两个属性设置为私有(private),这意味着它们只能在Person类内部被直接访问。

public class Person {  
    private String name; // 私有属性,存储人的姓名  
    private int age;     // 私有属性,存储人的年龄  
  
    // 构造方法,用于创建Person对象时初始化属性  
    public Person(String name, int age) {  
        this.name = name; // 使用this关键字引用当前对象的属性  
        this.age = age;  
    }  
      
    // ... 其他方法将在后面定义 ...  
}

除了属性,我们还为Person类定义了一个构造方法。构造方法是一个特殊的方法,用于创建类的新对象并初始化其属性。在Person类的构造方法中,我们接收两个参数——姓名和年龄,并使用this关键字将它们分别赋值给对象的name和age属性。

为Person类添加方法
接下来,我们为Person类添加几个方法,以丰富其功能。

// introduce方法,用于自我介绍  
public void introduce() {  
    System.out.println("Hello, my name is " + name + " and I'm " + age + " years old.");  
}  
  
// setAge方法,用于设置年龄,并进行简单的验证  
public void setAge(int newAge) {  
    if (newAge >= 0) {  
        age = newAge; // 更新年龄属性  
    } else {  
        System.out.println("Age cannot be negative."); // 年龄不能为负  
    }  
}  
  
// getAge方法,用于获取年龄  
public int getAge() {  
    return age; // 返回年龄属性  
}

创建Person对象并调用其方法

定义了Person类之后,我们可以在main方法中创建该类的对象,并调用其方法。

public static void main(String[] args) {  
    // 使用构造方法创建一个名为Alice、年龄为30的Person对象  
    Person person = new Person("Alice", 30);  
      
    // 调用introduce方法进行自我介绍  
    person.introduce(); // 输出: Hello, my name is Alice and I'm 30 years old.  
      
    // 使用setAge方法更新年龄,并进行验证  
    person.setAge(31); // 更新年龄为31岁,无输出表示更新成功  
    person.setAge(-5); // 尝试设置无效年龄,输出: Age cannot be negative.  
      
    // 再次调用introduce方法,确认年龄已更新  
    person.introduce(); // 输出: Hello, my name is Alice and I'm 31 years old.  
      
    // 使用getAge方法获取年龄,并打印出来  
    int currentAge = person.getAge();  
    System.out.println("Alice's current age is: " + currentAge); // 输出: Alice's current age is: 31  
}

在这个例子中,我们展示了如何在Java中定义一个简单的类,如何创建类的对象,以及如何调用对象的方法。通过Person类,我们学习了封装、构造方法、以及getter和setter方法等基础概念。这些概念是面向对象编程的基石,对于理解和掌握Java编程至关重要。

类的继承

类的继承概述
定义父类(基类):
父类是一个包含通用属性和方法的类。它定义了一组通用的行为,这些行为可以由其子类共享和扩展。
定义子类(派生类):
子类是从父类继承而来的类。子类会继承父类的所有非私有属性和方法,并可以添加自己的特有属性和方法。子类还可以重写父类中的方法,以提供自己的实现。
继承的层次结构:
继承可以形成层次结构,一个类可以继承自另一个类,而这个类又可能继承自另一个类,以此类推。这种层次结构称为继承树或类层次结构。
访问修饰符与继承:
在Java中,属性和方法的访问修饰符(如public、protected、默认(无修饰符)和private)决定了它们是否可以被子类访问和继承。只有public和protected修饰的属性和方法可以被子类继承。默认(无修饰符)的属性和方法只能在同一包内的子类中访问,而private修饰的属性和方法则完全不能被继承。
方法重写(Override):
子类可以重写父类中的方法。这意味着子类可以提供一个与父类方法签名相同但实现不同的方法。当子类对象调用该方法时,将执行子类中的实现而不是父类中的实现。方法重写需要满足一定的条件,如方法名、参数列表和返回类型必须与父类中被重写的方法相同。
构造方法与继承:
子类并不继承父类的构造方法。但是,子类可以通过调用super()关键字来显式地调用父类的构造方法。如果子类没有显式地调用父类的构造方法,编译器会默认调用父类的无参构造方法(如果存在)。因此,如果父类没有定义无参构造方法,子类在调用构造方法时必须显式地调用父类的构造方法。

示例:Animal 和 Dog 类的继承
下面是一个更详细的示例,展示了Animal和Dog类之间的继承关系。

Animal 类(父类):

public class Animal {  
    private String name;  
  
    // 构造方法  
    public Animal(String name) {  
        this.name = name;  
    }  
  
    // 父类方法:发出声音  
    public void makeSound() {  
        System.out.println("The animal makes a sound");  
    }  
  
    // Getter 和 Setter 方法  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
}

Dog 类(子类):

public class Dog extends Animal {  
    private String breed;  
  
    // 构造方法,调用父类的构造方法  
    public Dog(String name, String breed) {  
        super(name); // 调用父类的构造方法,传递name参数  
        this.breed = breed;  
    }  
  
    // 子类特有的方法:吠叫  
    public void bark() {  
        System.out.println("The dog barks");  
    }  
  
    // 重写父类方法:发出声音(更具体地描述狗的声音)  
    @Override  
    public void makeSound() {  
        System.out.println("The dog barks and howls");  
    }  
  
    // Getter 和 Setter 方法  
    public String getBreed() {  
        return breed;  
    }  
  
    public void setBreed(String breed) {  
        this.breed = breed;  
    }  
  
    // 主方法,用于测试  
    public static void main(String[] args) {  
        Dog myDog = new Dog("Buddy", "Golden Retriever");  
        myDog.makeSound(); // 调用重写后的方法  
        myDog.bark(); // 调用子类特有的方法  
        System.out.println("Dog's name: " + myDog.getName()); // 调用继承自父类的getter方法  
        System.out.println("Dog's breed: " + myDog.getBreed()); // 调用子类特有的getter方法  
    }  
}

抽象类(Abstract Class)
抽象类是一个不能被实例化的类,通常用于定义一个类的模板,该类可以包含抽象方法(即没有具体实现的方法)和非抽象方法。子类继承抽象类后,必须实现抽象类中的所有抽象方法,除非子类也是抽象类。

示例代码:

// 定义一个抽象类 Shape  
public abstract class Shape {  
  
    // 抽象方法,没有具体实现  
    public abstract void draw();  
  
    // 非抽象方法,有具体实现  
    public void resize() {  
        System.out.println("Resizing the shape...");  
    }  
  
    // 其他方法或属性(可选)  
    // ...  
}  
  
// 继承抽象类 Shape 的子类 Circle  
public class Circle extends Shape {  
  
    // 实现父类 Shape 中的抽象方法 draw  
    @Override  
    public void draw() {  
        System.out.println("Drawing a circle...");  
    }  
  
    // Circle 类可以定义自己的方法或属性(可选)  
    // ...  
}  
  
// 另一个继承抽象类 Shape 的子类 Rectangle  
public class Rectangle extends Shape {  
  
    // 实现父类 Shape 中的抽象方法 draw  
    @Override  
    public void draw() {  
        System.out.println("Drawing a rectangle...");  
    }  
  
    // Rectangle 类可以定义自己的方法或属性(可选)  
    // ...  
}

接口(Interface)
接口是一个完全抽象的类,只包含抽象方法、常量以及从 Java 8 开始还包含默认方法和静态方法。接口用于定义一种协议或契约,实现该接口的类必须遵守这个协议。
示例代码:

// 定义一个接口 Drawable  
public interface Drawable {  
  
    // 抽象方法  
    void draw();  
  
    // 可选:Java 8 开始可以添加默认方法  
    default void setDefaultColor() {  
        System.out.println("Setting default color...");  
    }  
  
    // 可选:Java 8 开始可以添加静态方法  
    static void showHelp() {  
        System.out.println("This is help for Drawable interface.");  
    }  
}  
  
// 实现 Drawable 接口的类 Circle  
public class CircleImpl implements Drawable {  
  
    // 实现接口 Drawable 中的抽象方法 draw  
    @Override  
    public void draw() {  
        System.out.println("Drawing a circle using the Drawable interface...");  
    }  
  
    // CircleImpl 类可以定义自己的方法或属性(可选)  
    // ...  
}  
  
// 实现 Drawable 接口的类 Rectangle  
public class RectangleImpl implements Drawable {  
  
    // 实现接口 Drawable 中的抽象方法 draw  
    @Override  
    public void draw() {  
        System.out.println("Drawing a rectangle using the Drawable interface...");  
    }  
  
    // RectangleImpl 类可以定义自己的方法或属性(可选)  
    // ...  
}

抽象类与接口的区别

实例化:抽象类不能被实例化,但可以定义非抽象方法和属性;接口是完全抽象的,不能被实例化,且只能包含抽象方法和常量。
继承与实现:一个类只能继承一个抽象类(单继承),但可以实现多个接口(多实现)。

默认实现:抽象类可以包含非抽象方法的具体实现;接口从 Java 8 开始可以包含默认方法和静态方法的默认实现。

设计目的:抽象类通常用于定义一组具有共同特征的对象的模板;接口通常用于定义一种契约或规范,实现该接口的类必须遵守这个规范。

希望这些解释和示例代码能帮助你更好地理解抽象类和接口的概念。

集合

在Java中,集合框架(Collections Framework)是Java API的一个重要组成部分,它提供了一套完整的接口和实现类来存储和操作对象。ArrayList和HashMap是其中最为常用的两种数据结构,而泛型(Generics)则是Java 5引入的一个特性,使得我们可以创建更安全、更类型化的集合。

1. ArrayList集合

ArrayList是List接口的一个实现,它提供了动态数组的功能。ArrayList中的元素是有序的,并且允许有重复的元素。使用ArrayList时,我们可以方便地添加、删除和访问元素。

示例代码:

import java.util.ArrayList;  
  
public class ArrayListExample {  
    public static void main(String[] args) {  
        // 创建一个存储整数的ArrayList  
        ArrayList<Integer> numbers = new ArrayList<>();  
  
        // 添加元素  
        numbers.add(1);  
        numbers.add(2);  
        numbers.add(3);  
  
        // 访问元素  
        System.out.println(numbers.get(1)); // 输出:2  
  
        // 遍历元素  
        for (Integer number : numbers) {  
            System.out.println(number);  
        }  
    }  
}

2. HashMap集合

HashMap是Map接口的一个实现,它提供了键值对(key-value pair)的存储功能。HashMap允许我们存储任意的键值对,并且键(key)是唯一的,但值(value)可以重复。
示例代码:

import java.util.HashMap;  
  
public class HashMapExample {  
    public static void main(String[] args) {  
        // 创建一个HashMap,键和值都是字符串类型  
        HashMap<String, String> map = new HashMap<>();  
  
        // 添加键值对  
        map.put("key1", "value1");  
        map.put("key2", "value2");  
  
        // 访问元素  
        System.out.println(map.get("key1")); // 输出:value1  
  
        // 遍历元素  
        for (Map.Entry<String, String> entry : map.entrySet()) {  
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());  
        }  
    }  
}

3. 泛型(Generics)

泛型是Java 5引入的一个特性,它允许我们在编译时检查集合中元素的类型。使用泛型可以减少类型转换的错误,并增加代码的可读性和安全性。

在上面的ArrayList和HashMap示例中,我们都使用了泛型来指定集合中元素的类型。例如,ArrayList表示这个ArrayList只能存储Integer类型的元素,而HashMap<String, String>表示这个HashMap的键和值都是String类型。

通过使用泛型,我们可以编写更类型安全的代码,并减少运行时的类型转换错误。泛型也可以应用于类、接口和方法,以增加代码的灵活性和可重用性。

异常

1. 异常类型
Java中的异常分为两大类:检查型异常(checked exceptions)和非检查型异常(unchecked exceptions)。检查型异常是编译器要求程序员必须处理的异常,如IOException、SQLException等。而非检查型异常(通常称为运行时异常或运行时错误),如NullPointerException、ArrayIndexOutOfBoundsException等,则不需要显式地捕获。

2. 捕获异常
在Java中,使用try-catch语句块来捕获异常。try块中包含可能会抛出异常的代码,而catch块则用于处理这些异常。

示例代码:

public class ExceptionHandlingExample {  
    public static void main(String[] args) {  
        try {  
            // 假设这里有一段可能会抛出异常的代码  
            int[] numbers = {1, 2, 3};  
            System.out.println(numbers[3]); // 数组越界,会抛出ArrayIndexOutOfBoundsException  
        } catch (ArrayIndexOutOfBoundsException e) {  
            // 捕获并处理ArrayIndexOutOfBoundsException异常  
            System.err.println("捕获到数组越界异常: " + e.getMessage());  
        } catch (Exception e) {  
            // 捕获所有其他类型的异常(虽然在这个例子中不会用到)  
            System.err.println("捕获到未知异常: " + e.getMessage());  
        } finally {  
            // finally块中的代码无论是否发生异常都会执行  
            System.out.println("finally块中的代码始终会执行");  
        }  
    }  
}

在上面的示例中,我们尝试访问数组的一个不存在的索引,这会抛出一个ArrayIndexOutOfBoundsException。我们使用catch块来捕获这个异常,并打印出异常信息。同时,我们还使用了一个finally块来确保无论是否发生异常,都会执行其中的代码。

3. 抛出异常
除了捕获异常外,Java还允许程序员在代码中显式地抛出异常。这通常用于在检测到某些错误条件时,告知调用者发生了问题。

示例代码:

public class CustomExceptionExample {  
    public static void main(String[] args) {  
        try {  
            throwNewException();  
        } catch (MyCustomException e) {  
            // 捕获并处理自定义异常  
            System.err.println("捕获到自定义异常: " + e.getMessage());  
        }  
    }  
  
    public static void throwNewException() throws MyCustomException {  
        // 假设这里有一些条件检查  
        boolean condition = false;  
        if (!condition) {  
            throw new MyCustomException("自定义异常发生");  
        }  
    }  
  
    // 自定义异常类  
    static class MyCustomException extends Exception {  
        public MyCustomException(String message) {  
            super(message);  
        }  
    }  
}

在上面的示例中,我们定义了一个自定义的异常类MyCustomException,并在throwNewException方法中显式地抛出了这个异常。在main方法中,我们使用try-catch语句块来捕获并处理这个自定义异常。

Java学习心得总结

自从我开始学习Java编程语言以来,我经历了从零基础到逐渐掌握的过程,这段旅程既充满了挑战,也带来了许多收获。以下是我对Java学习的一些心得和体会。

基础知识的重要性
Java是一门强大的编程语言,但如同其他任何技术一样,它的学习需要从基础开始。在学习初期,我深刻感受到了掌握Java基础知识的重要性。从变量、数据类型、运算符,到控制结构、函数和面向对象编程,每一步的学习都为后续的内容打下了坚实的基础。我意识到,只有扎实地掌握这些基础知识,才能在后续的学习中更加游刃有余。

总结
回顾我的Java学习历程,我深感收获颇丰。我不仅掌握了Java的基础知识和编程技巧,还学会了如何运用面向对象的思想进行编程。同时,我也认识到了实践、异常处理和持续学习的重要性。我相信,在未来的学习和工作中,我会继续深入学习Java技术,不断提高自己的编程能力和水平。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值