异常
在Java中,异常是指在程序运行期间可能出现的错误或异常状况。这些异常可以由Java程序自行捕获和处理,从而可以帮助程序员开发更健壮和可靠的应用程序。
Java中的异常分为两类:
1.Checked Exception和Unchecked Exception。Checked
2.Exception是在编译期就可以检查出来的异常,需要明确地进行处理。 Unchecked
Exception是在运行期间才会出现的异常,属于程序员的错误或代码问题。
以下是Java异常处理的关键字和语法:
try-catch语句:try-catch语句是Java异常处理的基本语法。try代码块内包含可能发生异常的代码,catch代码块用于捕获并处理异常。如果try代码块中的代码块执行成功,则不会执行catch代码块。
finally语句:finally代码块是Java中用于处理一些必须在代码块结束时执行的代码,不管try代码块是否出现异常都将执行。
throw语句:throw语句用于手动抛出一个异常。抛出异常后,程序会尝试查找匹配的catch块进行处理。
throws语句:在方法定义中使用throws语句,可以指定一种或多种异常类型,表示该方法可能抛出这些异常。
以下是一个Java异常处理示例:
public static void main(String[] args) {
try {
int num1 = 10;
int num2 = 0;
int result = num1/num2;
System.out.println("Result: " + result);
} catch (ArithmeticException e) {
System.out.println("Division by zero is not allowed.");
} finally {
System.out.println("Finally block is always executed.");
}
}
在本示例中,程序会尝试用num1除以num2,即10/0,这将产生一个ArithmeticException异常。由于调用了try-catch结构,程序将跳过try块,并跳转到catch块,输出一条错误消息。然后,程序执行finally块中的代码,并输出一条最终消息。
而try语句有下列几个特点。
-
如果在try语句内的代码块产生了异常,那么将会被下面的catch语句进行捕获,会和catch语句进行异常类型匹配,如果匹配成功则,进入该catch语句,不在进行后面的catch语句匹配。这点与if else语句类似。
- 在异常产生并被捕获后,并在执行完catch语句后,程序不会停止,会继续往下执行。
- 如果在try语句内产生异常,但是在catch语句内没有与之匹配的异常类型,那么该异常会交给JVM进行默认处理。
- 在try内某行代码产生异常后,在try语句该行以下的程序不会被执行了,将会跳转catch语句进行异常匹配处理。
- 如果在try内的代码块,没有出现异常,那么依次将try内的语句执行完毕,不会执行catch语句。
一般的,在try、catch语句中,try语句中不会只产生一种异常,那么对异常类型的匹配catch语句就不会只有一条,那么如果在catch语句内的异常类型有父子关系,那么父类异常的catch语句必须放置在子类异常的catch语句下面。因为父类异常是可以接收子类异常的,可以形成多态的关系,那么拿子类异常进行匹配时,父类异常也是可以接收的。那么如果子类异常放置在父类异常下面,那么子类异常catch将永远不会被执行。
例如在以下代码中,Exception是父类异常,而NullPointerException等是Exception异常的子类,那么两个子类异常匹配将永远不会执行,所以编译器给出了警告。
权限修饰符
Java中一共有四种权限修饰符,它们分别是:
-
public:公共访问修饰符。使用public修饰的类、方法及成员变量可以被本包或其他包中的类访问。
-
protected:受保护访问修饰符。使用protected修饰的方法及成员变量可以被本包中的类和其他包中的子类访问。
-
default (即默认或不加修饰符):默认访问修饰符。使用默认修饰符的类、方法及成员变量只能被本包中的类访问。
-
private:私有访问修饰符。使用private修饰的类、方法及成员变量仅能被本类访问。
以下是一个Java类及其成员变量的权限示例:
public class Person {
public String name;
protected int age;
String gender; // default
private int id;
public Person(String name, int age, String gender, int id) {
this.name = name;
this.age = age;
this.gender = gender;
this.id = id;
}
}
在本示例中,Person类和其成员变量的访问权限如下:
-
name:public。可以被任意类访问。
-
age:protected。可以被Person类及其子类中访问,也可以被同一个包中的其他类访问。
-
gender:default。可以被同一个包中的其他类访问。
-
id:private。仅能被Person类中访问,其他类无法访问。
注意:权限修饰符不仅可以用于类中的属性或方法,同样也可以使用于类上。类的访问权限只能使用public和默认,不能使用protected和private。
StringBuilder类
Java中的StringBuilder类用于动态地构建字符串。在之前的文章中,已经提到过了,在Sting类中它的存储数据的数组是被final修饰了的,所以说在Java中的String类是不可变的,也就是说,一旦创建了一个String对象,它的值就不能被更改。
而StringBuilder类提供的方法允许我们添加、删除和修改其字符串缓冲区中的内容。
它的底层实现也是使用char类型数组实现存储数据的,但是没有被final修饰,且空参构造初始化时默认给定16个char类型大小的空间,每次在添加数据时,会判断需要添加的目标字符产与本身数组的空间是否足够,足够的话直接添加进数组中,不足的话,会先进行扩容,然后再添加。
JDK7新特性
JDK 7(Java SE 7)在Java语言中引入了一些新特性,以下是其中的一些:
-
String在switch中可用:在Java SE 7之前,在switch语句中只允许使用数字和枚举类型的常量。但是,在Java SE 7中,我们可以使用字符串(String)作为开关变量。
-
自动资源管理:Java SE 7引入了try-with-resources语句,它是一种保证实现了必要释放资源的try语句的简化写法。在try代码块中初始化的资源(如文件流)将在try块退出时自动关闭。这种机制可以帮助程序员避免资源泄漏问题,使代码更加简洁。
-
数字字面量增强:在Java SE 7中,我们可以使用下划线来分隔数字字面量,使其更易读。例如,我们可以使用1_000_000表示一百万。
-
泛型实例化类型自动推断:在Java SE 7之前,当我们创建一个泛型实例时,必须明确地提供类型参数。但是现在,我们可以让编译器根据左侧的引用变量自动推断类型,从而使代码更加简洁。
-
异常多重捕获:在Java SE 7中,我们可以使用管道符(|)来捕获多个异常类型,这使得代码更加简洁。
-
Fork/Join框架:Java SE 7引入了Fork/Join框架,它是一种用于在多个处理器上并行执行任务的框架。它提供了一种简单的编程模型,可以让开发者更容易地实现并行算法和任务。
-
NIO 2.0:Java SE 7引入了NIO 2.0,它提供了更加强大和灵活的文件系统API。新的API支持异步IO和文件锁定等功能,提供了更高效和可伸缩的IO操作。
-
G1垃圾回收器:Java SE 7引入了G1垃圾回收器,它是一种可预测的垃圾回收器,可以在多处理器和大内存环境中提高性能。
-
增强的Java安全性:Java SE 7引入了许多新的安全性特性,如增强的XML处理器、增强的启动类加载器和支持加密协议的JSSE等。这些功能为Java应用程序提供了更高的安全性。
以上是JDK 7中一些比较重要的新特性。