基础类:基类、系统实用和系统功能类、错误异常类
- 一、基类
- 二、系统实用和系统功能类
- (一)System
- (二)Runtime
- (三)Process
- (四)ProcessBuilder
- (五)SecurityManager - JDK17版本之后被设为不可用
- (六)Shutdown - Java标准库并没有公开名为 `Shutdown` 的类
- 三、错误异常类
一、基类
- 用途:所有类的基类,提供基本机制。
- 类名:
Object
,Class
- 功能:对象基本方法(如
toString
,equals
)及反射机制。 - 目的:提供类的基础结构和运行时类信息。
- 作用:启用对象操作和反射。
- 使用场景:对象比较、反射操作、类信息获取。
(一)Object
Java 中的 java.lang.Object
类是所有类的祖先类,每个类都直接或间接地继承自 Object
。Object
类提供了一些基础的方法,这些方法可以被所有的 Java 对象使用。以下是 Object
类中所有方法的详细讲解,并按照用途、功能、目的、作用、使用场景等方面进行分类和整理,并附上测试用例。
一、对象的基础方法
这些方法提供了对象的基础功能,如比较、哈希码、字符串表示等。
1. equals(Object obj)
功能: 比较两个对象是否相等。默认实现是比较对象的内存地址,子类通常会重写这个方法以实现自定义比较逻辑。
参数:
obj
- 需要比较的对象。
返回值: boolean
- 如果两个对象相等,返回 true
,否则返回 false
。
示例:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return Objects.equals(name, person.name);
}
}
Person p1 = new Person("Alice");
Person p2 = new Person("Alice");
System.out.println(p1.equals(p2)); // true
2. hashCode()
功能: 返回对象的哈希码。默认实现根据内存地址等相关信息来计算哈希码,子类通常会重写这个方法以实现自定义哈希码计算。
返回值: int
- 对象的哈希码。
示例:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
Person p1 = new Person("Alice");
System.out.println(p1.hashCode()); // 哈希码值
3. toString()
功能: 返回对象的字符串表示。默认实现返回类的名称和该对象的用无符号十六进制表示形式的哈希码,子类通常会重写这个方法以提供更有意义的字符串表示。
返回值: String
- 对象的字符串表示。
示例:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{name='" + name + "'}";
}
}
Person p1 = new Person("Alice");
System.out.println(p1); // Person{name='Alice'}
二、对象的同步方法
这些方法用于实现对象的同步与线程通信。
1. wait()
功能: 使当前线程等待,直到另一个线程调用 notify()
或 notifyAll()
方法来唤醒当前线程,或等待超时。
示例:
public class WaitNotifyExample {
private static final Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread1: Waiting for lock...");
lock.wait();
System.out.println("Thread1: Notified!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (lock) {
System.out.println("Thread2: Holding lock...");
lock.notify();
System.out.println("Thread2: Notified thread1!");
}
});
thread1.start();
Thread.sleep(1000); // Ensure thread1 starts waiting
thread2.start();
}
}
2. wait(long timeout)
功能: 使当前线程等待指定的时间(以毫秒为单位),直到另一个线程调用 notify()
或 notifyAll()
方法来唤醒当前线程,或等待超时。
参数:
timeout
- 最大等待时间(以毫秒为单位)。
示例:
public class WaitNotifyExample {
private static final Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread1: Waiting for lock...");
lock.wait(2000); // Wait for 2 seconds
System.out.println("Thread1: Notified or timeout!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread1.start();
Thread.sleep(1000); // Ensure thread1 starts waiting
}
}
3. wait(long timeout, int nanos)
功能: 使当前线程等待指定的时间(以毫秒和纳秒为单位),直到另一个线程调用 notify()
或 notifyAll()
方法来唤醒当前线程,或等待超时。
参数:
timeout
- 最大等待时间(以毫秒为单位)。nanos
- 额外的等待时间(以纳秒为单位)。
示例:
public class WaitNotifyExample {
private static final Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread1: Waiting for lock...");
lock.wait(2000, 500); // Wait for 2 seconds and 500 nanoseconds
System.out.println("Thread1: Notified or timeout!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread1.start();
Thread.sleep(1000); // Ensure thread1 starts waiting
}
}
4. notify()
功能: 唤醒一个正在等待对象锁的线程。如果有多个线程在等待对象锁,则随机选择一个线程被唤醒。
示例:
public class WaitNotifyExample {
private static final Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread1: Waiting for lock...");
lock.wait();
System.out.println("Thread1: Notified!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (lock) {
System.out.println("Thread2: Holding lock...");
lock.notify();
System.out.println("Thread2: Notified thread1!");
}
});
thread1.start();
Thread.sleep(1000); // Ensure thread1 starts waiting
thread2.start();
}
}
5. notifyAll()
功能: 唤醒所有正在等待对象锁的线程。
示例:
public class WaitNotifyExample {
private static final Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread1: Waiting for lock...");
lock.wait();
System.out.println("Thread1: Notified!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread2: Waiting for lock...");
lock.wait();
System.out.println("Thread2: Notified!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread notifier = new Thread(() -> {
synchronized (lock) {
System.out.println("Notifier: Holding lock...");
lock.notifyAll();
System.out.println("Notifier: Notified all threads!");
}
});
thread1.start();
thread2.start();
Thread.sleep(1000); // Ensure thread1 and thread2 start waiting
notifier.start();
}
}
三、对象的克隆方法
这些方法用于对象的克隆操作。
1. clone()
功能: 创建并返回对象的一个副本。类必须实现 Cloneable
接口,并重写 clone()
方法。
返回值: Object
- 对象的副本。
示例:
public class Person implements Cloneable {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public Person clone() {
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError(); // 不会发生,因为实现了 Cloneable 接口
}
}
@Override
public String toString() {
return "Person{name='" + name + "'}";
}
}
Person p1 = new Person("Alice");
Person p2 = p1.clone();
System.out.println(p1); // Person{name='Alice'}
System.out.println(p2); // Person{name='Alice'}
四、对象的类信息方法
这些方法用于获取对象的类信息。
1. getClass()
功能: 返回对象运行时的 Class
对象。
返回值: Class<?>
- 对象运行时的类对象。
示例:
Person p1 = new Person("Alice");
Class<?> clazz = p1.getClass();
System.out.println(clazz.getName()); // com.example.Person
五、对象的最终方法
这些方法用于对象的清理操作。
1. finalize()
功能: 当垃圾回收器确定不再有对该对象的引用时,调用此方法。通常用于释放资源。注意,从 Java 9 开始,该方法已被弃用,不推荐使用。
示例:
public class Resource {
@Override
protected void finalize() throws Throwable {
try {
System.out.println("Resource is being finalized");
} finally {
super.finalize();
}
}
}
Resource res = new Resource();
res = null;
System.gc(); // 触发垃圾回收
总结
Java 中的 Object
类提供了一些基础方法,用于对象的比较、哈希码、字符串表示、同步、克隆、类信息和清理操作。这些方法是所有 Java 对象都可以使用的基础功能。
(二)Class
java.lang.Class
是 Java 反射机制的核心类之一,它提供了许多方法用于在运行时获取类的信息以及操作类的成员。以下是 Class
类中所有方法的详细讲解,并按照用途、功能、目的、作用、使用场景等方面进行分类和整理,并附上测试用例。
一、获取类的信息
这些方法用于获取类的基本信息,如名称、修饰符、包、父类、接口等。
1. getName()
功能: 获取类的全限定名称。
返回值: String
- 类的全限定名称。
示例:
Class<?> clazz = String.class;
System.out.println(clazz.getName()); // java.lang.String
2. getSimpleName()
功能: 获取类的简单名称。
返回值: String
- 类的简单名称。
示例:
Class<?> clazz = String.class;
System.out.println(clazz.getSimpleName()); // String
3. getCanonicalName()
功能: 获取类的规范名称。
返回值: String
- 类的规范名称。
示例:
Class<?> clazz = String.class;
System.out.println(clazz.getCanonicalName()); // java.lang.String
4. getModifiers()
功能: 获取类的修饰符。
返回值: int
- 类的修饰符,可以使用 Modifier
类的方法来解读。
示例:
Class<?> clazz = String.class;
int modifiers = clazz.getModifiers();
System.out.println(Modifier.toString(modifiers)); // public final
5. getPackage()
功能: 获取类的包信息。
返回值: Package
- 表示包的对象。
示例:
Class<?> clazz = String.class;
Package pkg = clazz.getPackage();
System.out.println(pkg.getName()); // java.lang
6. getSuperclass()
功能: 获取类的直接父类。
返回值: Class<?>
- 类的父类。
示例:
Class<?> clazz = Integer.class;
Class<?> superClass = clazz.getSuperclass();
System.out.println(superClass.getName()); // java.lang.Number
7. getInterfaces()
功能: 获取类实现的所有接口。
返回值: Class<?>[]
- 所有接口的数组。
示例:
Class<?> clazz = ArrayList.class;
Class<?>[] interfaces = clazz.getInterfaces();
for (Class<?> iface : interfaces) {
System.out.println(iface.getName());
}
// java.util.List
// java.util.RandomAccess
// java.lang.Cloneable
// java.io.Serializable
二、创建类的实例
这些方法用于创建类的新实例。
1. newInstance()
功能: 创建类的新实例(已被弃用,建议使用构造器)。
返回值: Object
- 类的新实例。
示例:
Class<?> clazz = String.class;
try {
String str = (String) clazz.getDeclaredConstructor().newInstance();
System.out.println(str); // ""
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}
三、获取成员信息
这些方法用于获取类的成员信息,如字段、方法、构造器等。
1. getDeclaredFields()
功能: 获取类或接口声明的所有字段,不包括继承的字段。
返回值: Field[]
- 所有字段的数组。
示例:
Class<?> clazz = String.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
}
// value
// coder
// hash
// serialVersionUID
// COMPACT_STRINGS
// LATIN1
// UTF16
2. getFields()
功能: 获取类或接口的所有公共字段,包括继承的字段。
返回值: Field[]
- 所有公共字段的数组。
示例:
Class<?> clazz = System.class;
Field[] fields = clazz.getFields();
for (Field field : fields) {
System.out.println(field.getName());
}
// out
// err
// in
3. getDeclaredMethods()
功能: 获取类或接口声明的所有方法,不包括继承的方法。
返回值: Method[]
- 所有方法的数组。
示例:
Class<?> clazz = String.class;
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
// indexOfSupplementary
// compareTo
// compareToIgnoreCase
// ...
4. getMethods()
功能: 获取类或接口的所有公共方法,包括继承的方法。
返回值: Method[]
- 所有公共方法的数组。
示例:
Class<?> clazz = String.class;
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
// equals
// toString
// hashCode
// wait
// notify
// notifyAll
// getClass
// ...
5. getDeclaredConstructors()
功能: 获取类声明的所有构造器。
返回值: Constructor<?>[]
- 所有构造器的数组。
示例:
Class<?> clazz = String.class;
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
// public java.lang.String()
// public java.lang.String(java.lang.String)
// public java.lang.String(char[])
// ...
6. getConstructors()
功能: 获取类的所有公共构造器。
返回值: Constructor<?>[]
- 所有公共构造器的数组。
示例:
Class<?> clazz = String.class;
Constructor<?>[] constructors = clazz.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
// public java.lang.String()
// public java.lang.String(byte[],int,int,java.lang.String) throws java.io.UnsupportedEncodingException
// public java.lang.String(byte[],java.lang.String) throws java.io.UnsupportedEncodingException
// ...
四、操作成员
这些方法用于操作类的成员,如字段和方法的值。
1. getDeclaredField(String name)
功能: 获取类或接口声明的指定名称的字段。
参数:
name
- 字段的名称。
返回值: Field
- 指定名称的字段对象。
示例:
Class<?> clazz = String.class;
try {
Field field = clazz.getDeclaredField("value");
field.setAccessible(true);
char[] value = (char[]) field.get("Hello");
System.out.println(Arrays.toString(value)); // [H, e, l, l, o]
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
2. getDeclaredMethod(String name, Class<?>... parameterTypes)
功能: 获取类或接口声明的指定名称和参数类型的方法。
参数:
name
- 方法的名称。parameterTypes
- 方法的参数类型。
返回值: Method
- 指定名称和参数类型的方法对象。
示例:
Class<?> clazz = String.class;
try {
Method method = clazz.getDeclaredMethod("indexOf", int.class, int.class);
int index = (int) method.invoke("Hello", (int) 'o', 0);
System.out.println(index); // 4
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
3. getDeclaredConstructor(Class<?>... parameterTypes)
功能: 获取类声明的指定参数类型的构造器。
参数:
parameterTypes
- 构造器的参数类型。
返回值: Constructor<?>
- 指定参数类型的构造器对象。
示例:
Class<?> clazz = String.class;
try {
Constructor<?> constructor = clazz.getDeclaredConstructor(char[].class);
char[] data = {'H', 'e', 'l', 'l', 'o'};
String str = (String) constructor.newInstance((Object) data);
System.out.println(str); // Hello
} catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
e.printStackTrace();
}
五、其他功能
这些方法用于其他一些特殊功能,如枚举常量、注解、组件类型等。
1. getEnumConstants()
功能: 获取枚举类的所有枚举常量。
返回值: T[]
- 所有枚举常量的数组。
示例:
Class<?> clazz = Thread.State.class;
Object[] enumConstants = clazz.getEnumConstants();
for (Object constant : enumConstants) {
System.out.println(constant);
}
// NEW
// RUNNABLE
// BLOCKED
// WAITING
// TIMED_WAITING
// TERMINATED
2. getAnnotation(Class<A> annotationClass)
功能: 获取类上指定类型的注解。
参数:
annotationClass
- 注解的类型。
返回值: A
- 指定类型的注解对象。
示例:
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface MyAnnotation {
String value();
}
@MyAnnotation("ExampleClass")
public class ExampleClass {}
Class<?> clazz = ExampleClass.class;
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
if (annotation != null) {
System.out.println(annotation.value()); // ExampleClass
}
六、总结
Java 中的 Class
类提供了丰富的方法来操作和获取类的信息。通过详细了解和使用这些方法,可以在运行时动态地操作类,提高程序的灵活性和动态性。
二、系统实用和系统功能类
- 用途:提供系统级服务。
- 类名:
System
,Runtime
,Process
,ProcessBuilder
,SecurityManager
- 功能:系统资源管理,配置参数获取,进程控制及安全管理。
- 目的:与JVM和操作系统交互。
- 作用:执行系统级任务,如垃圾回收、启动外部进程。
- 使用场景:获取系统属性、执行系统命令、处理JVM退出。
(一)System
java.lang.System
类包含一些有用的类字段和方法,用于标准输入、输出、错误输出流、访问外部定义的属性和环境变量,以及加载文件和库的方法。以下是 System
类中所有方法的详细讲解,并按照用途、功能、目的、作用、使用场景等方面进行分类和整理,并附上测试用例。
一、标准输入、输出和错误输出流
这些方法用于操作标准的输入、输出和错误输出流。
1. setIn(InputStream in)
功能: 重新分配系统的标准输入流。
参数:
in
- 新的标准输入流。
示例:
InputStream originalIn = System.in;
System.setIn(new ByteArrayInputStream("Hello, world!".getBytes()));
Scanner scanner = new Scanner(System.in);
System.out.println(scanner.nextLine()); // Hello, world!
System.setIn(originalIn); // 恢复原始输入流
2. setOut(PrintStream out)
功能: 重新分配系统的标准输出流。
参数:
out
- 新的标准输出流。
示例:
PrintStream originalOut = System.out;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
System.setOut(new PrintStream(baos));
System.out.println("Hello, world!");
System.setOut(originalOut); // 恢复原始输出流
System.out.println(baos.toString()); // Hello, world!
3. setErr(PrintStream err)
功能: 重新分配系统的标准错误输出流。
参数:
err
- 新的标准错误输出流。
示例:
PrintStream originalErr = System.err;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
System.setErr(new PrintStream(baos));
System.err.println("Error occurred!");
System.setErr(originalErr); // 恢复原始错误输出流
System.out.println(baos.toString()); // Error occurred!
二、系统属性和环境变量
这些方法用于访问和操作系统属性和环境变量。
1. getProperty(String key)
功能: 获取指定键的系统属性。
参数:
key
- 系统属性的键。
返回值: String
- 对应键的属性值。如果没有对应的键,返回 null
。
示例:
String javaVersion = System.getProperty("java.version");
System.out.println(javaVersion); // 当前的 Java 版本
2. getProperty(String key, String def)
功能: 获取指定键的系统属性,如果没有对应的键,返回默认值。
参数:
key
- 系统属性的键。def
- 默认值。
返回值: String
- 对应键的属性值。如果没有对应的键,返回默认值。
示例:
String userCountry = System.getProperty("user.country", "Unknown");
System.out.println(userCountry); // 当前用户所在的国家,若无则为 "Unknown"
3. setProperty(String key, String value)
功能: 设置系统属性。
参数:
key
- 系统属性的键。value
- 系统属性的值。
返回值: String
- 之前的属性值,如果没有则返回 null
。
示例:
String oldValue = System.setProperty("my.custom.property", "myValue");
System.out.println(oldValue); // 之前的属性值,若无则为 null
System.out.println(System.getProperty("my.custom.property")); // myValue
4. clearProperty(String key)
功能: 清除指定键的系统属性。
参数:
key
- 系统属性的键。
返回值: String
- 之前的属性值,如果没有则返回 null
。
示例:
System.setProperty("my.custom.property", "myValue");
String oldValue = System.clearProperty("my.custom.property");
System.out.println(oldValue); // myValue
System.out.println(System.getProperty("my.custom.property")); // null
5. getProperties()
功能: 获取当前系统的所有属性。
返回值: Properties
- 包含所有系统属性的对象。
示例:
Properties properties = System.getProperties();
properties.forEach((key, value) -> System.out.println(key + ": " + value));
6. getenv(String name)
功能: 获取指定名称的环境变量。
参数:
name
- 环境变量的名称。
返回值: String
- 对应名称的环境变量值。如果没有对应的名称,返回 null
。
示例:
String path = System.getenv("PATH");
System.out.println(path); // 当前的 PATH 环境变量
7. getenv()
功能: 获取所有环境变量。
返回值: Map<String, String>
- 包含所有环境变量的映射。
示例:
Map<String, String> env = System.getenv();
env.forEach((key, value) -> System.out.println(key + ": " + value));
三、时间和纳秒级操作
这些方法用于获取当前时间,以毫秒或纳秒为单位。
1. currentTimeMillis()
功能: 获取当前时间,以毫秒为单位。
返回值: long
- 当前时间的毫秒数,从1970年1月1日00:00:00 UTC开始的毫秒数。
示例:
long currentTimeMillis = System.currentTimeMillis();
System.out.println(currentTimeMillis); // 当前时间的毫秒数
2. nanoTime()
功能: 获取当前时间,以纳秒为单位。
返回值: long
- 当前时间的纳秒数(相对时间)。
示例:
long startTime = System.nanoTime();
// 进行一些操作
long endTime = System.nanoTime();
System.out.println("操作耗时: " + (endTime - startTime) + " 纳秒");
四、数组操作
这些方法用于操作数组,如复制数组。
1. arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
功能: 将一个数组从指定源位置复制到另一个数组的指定位置。
参数:
src
- 源数组。srcPos
- 源数组中的起始位置。dest
- 目标数组。destPos
- 目标数组中的起始位置。length
- 要复制的数组元素的数量。
示例:
int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[5];
System.arraycopy(src, 1, dest, 2, 3);
System.out.println(Arrays.toString(dest)); // [0, 0, 2, 3, 4]
五、垃圾收集
这些方法用于和垃圾收集器进行交互。
1. gc()
功能: 运行垃圾收集器。
示例:
System.gc();
System.out.println("垃圾收集器已运行");
六、加载文件和库
这些方法用于加载动态链接库或者文件。
1. load(String filename)
功能: 加载指定的动态链接库文件。
参数:
filename
- 文件的完全限定名。
示例:
// 假设我们有一个本地库文件 example.dll 或者 libexample.so
System.load("/path/to/example.dll");
2. loadLibrary(String libname)
功能: 加载指定库名的本地库。
参数:
libname
- 库的名称。
示例:
// 假设我们有一个名为 example 的本地库
System.loadLibrary("example");
七、其他实用方法
这些方法用于其他一些实用功能,如安全管理器、标准流等。
1. exit(int status)
功能: 终止当前运行中的 Java 虚拟机。
参数:
status
- 退出状态码。非零表示异常终止。
示例:
System.exit(0); // 正常终止
2. runFinalization()
功能: 运行挂起的终结器。
示例:
System.runFinalization();
System.out.println("挂起的终结器已运行");
3. setSecurityManager(SecurityManager s)
功能: 设置当前的安全管理器。
参数:
s
- 新的安全管理器。
示例:
SecurityManager sm = new SecurityManager();
System.setSecurityManager(sm);
System.out.println("安全管理器已设置");
4. getSecurityManager()
功能: 获取当前的安全管理器。
返回值: SecurityManager
- 当前的安全管理器,如果没有设置则返回 null
。
示例:
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
System.out.println("当前安全管理器: " + sm);
} else {
System.out.println("没有设置安全管理器");
}
总结
Java 中的 System
类提供了一系列静态方法,用于标准输入、输出、系统属性、环境变量、时间和纳秒级操作、数组操作、垃圾收集、文件和库加载等。这些方法在实际开发中非常有用,能帮助我们更好地操作和管理系统资源。
(二)Runtime
java.lang.Runtime
类是一个用来与 Java 虚拟机进行交互的类。它提供了一些方法来与 JVM 进行交互,如执行进程、内存管理、垃圾收集等。以下是 Runtime
类中所有方法的详细讲解,并按照用途、功能、目的、作用、使用场景等方面进行分类和整理,并附上测试用例。
一、获取 Runtime 实例
1. getRuntime()
功能: 获取与当前 Java 应用程序关联的单例 Runtime
实例。
返回值: Runtime
- 当前 Java 应用程序的 Runtime
实例。
示例:
Runtime runtime = Runtime.getRuntime();
System.out.println(runtime);
二、进程管理
这些方法用于创建和管理外部进程。
1. exec(String command)
功能: 执行指定的命令和命令行参数。
参数:
command
- 要执行的命令和命令行参数。
返回值: Process
- 表示子进程的对象。
示例:
Runtime runtime = Runtime.getRuntime();
try {
Process process = runtime.exec("notepad");
process.waitFor(); // 等待进程终止
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
2. exec(String[] cmdarray)
功能: 执行指定命令和命令行参数的数组。
参数:
cmdarray
- 包含命令和命令行参数的数组。
返回值: Process
- 表示子进程的对象。
示例:
Runtime runtime = Runtime.getRuntime();
try {
String[] cmdarray = {"cmd.exe", "/c", "dir"};
Process process = runtime.exec(cmdarray);
process.waitFor(); // 等待进程终止
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
3. exec(String command, String[] envp)
功能: 执行指定的命令和命令行参数,并使用指定的环境变量。
参数:
command
- 要执行的命令和命令行参数。envp
- 环境变量设置的数组,格式为name=value
。如果为null
,将继承当前进程的环境变量。
返回值: Process
- 表示子进程的对象。
示例:
Runtime runtime = Runtime.getRuntime();
try {
String[] envp = {"MY_VAR=my_value"};
Process process = runtime.exec("notepad", envp);
process.waitFor(); // 等待进程终止
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
4. exec(String[] cmdarray, String[] envp)
功能: 执行指定命令和命令行参数数组,并使用指定的环境变量。
参数:
cmdarray
- 包含命令和命令行参数的数组。envp
- 环境变量设置的数组,格式为name=value
。如果为null
,将继承当前进程的环境变量。
返回值: Process
- 表示子进程的对象。
示例:
Runtime runtime = Runtime.getRuntime();
try {
String[] cmdarray = {"cmd.exe", "/c", "dir"};
String[] envp = {"MY_VAR=my_value"};
Process process = runtime.exec(cmdarray, envp);
process.waitFor(); // 等待进程终止
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
5. exec(String command, String[] envp, File dir)
功能: 执行指定的命令和命令行参数,并使用指定的环境变量和工作目录。
参数:
command
- 要执行的命令和命令行参数。envp
- 环境变量设置的数组,格式为name=value
。如果为null
,将继承当前进程的环境变量。dir
- 工作目录。如果为null
,将使用当前工作目录。
返回值: Process
- 表示子进程的对象。
示例:
Runtime runtime = Runtime.getRuntime();
try {
String[] envp = {"MY_VAR=my_value"};
File dir = new File("C:/Examples");
Process process = runtime.exec("notepad", envp, dir);
process.waitFor(); // 等待进程终止
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
6. exec(String[] cmdarray, String[] envp, File dir)
功能: 执行指定命令和命令行参数数组,并使用指定的环境变量和工作目录。
参数:
cmdarray
- 包含命令和命令行参数的数组。envp
- 环境变量设置的数组,格式为name=value
。如果为null
,将继承当前进程的环境变量。dir
- 工作目录。如果为null
,将使用当前工作目录。
返回值: Process
- 表示子进程的对象。
示例:
Runtime runtime = Runtime.getRuntime();
try {
String[] cmdarray = {"cmd.exe", "/c", "dir"};
String[] envp = {"MY_VAR=my_value"};
File dir = new File("C:/Examples");
Process process = runtime.exec(cmdarray, envp, dir);
process.waitFor(); // 等待进程终止
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
三、内存管理
这些方法用于获取 JVM 的内存使用情况,并触发垃圾收集。
1. gc()
功能: 运行垃圾收集器,试图回收未使用的对象。
示例:
Runtime runtime = Runtime.getRuntime();
System.out.println("调用垃圾收集器前的空闲内存: " + runtime.freeMemory());
runtime.gc();
System.out.println("调用垃圾收集器后的空闲内存: " + runtime.freeMemory());
2. totalMemory()
功能: 返回 Java 虚拟机中的内存总量。
返回值: long
- Java 虚拟机中的内存总量(以字节为单位)。
示例:
Runtime runtime = Runtime.getRuntime();
System.out.println("总内存: " + runtime.totalMemory());
3. freeMemory()
功能: 返回 Java 虚拟机中的空闲内存量。
返回值: long
- Java 虚拟机中的空闲内存量(以字节为单位)。
示例:
Runtime runtime = Runtime.getRuntime();
System.out.println("空闲内存: " + runtime.freeMemory());
4. maxMemory()
功能: 返回 Java 虚拟机试图使用的最大内存量。如果没有内存限制,将返回 Long.MAX_VALUE
。
返回值: long
- Java 虚拟机试图使用的最大内存量(以字节为单位)。
示例:
Runtime runtime = Runtime.getRuntime();
System.out.println("最大内存: " + runtime.maxMemory());
四、关闭和退出
这些方法用于关闭和退出 JVM。
1. exit(int status)
功能: 终止当前运行中的 Java 虚拟机。
参数:
status
- 退出状态码。非零表示异常终止。
示例:
Runtime runtime = Runtime.getRuntime();
runtime.exit(0); // 正常终止
2. halt(int status)
功能: 终止当前运行中的 Java 虚拟机,不执行任何关闭钩子或终结器。
参数:
status
- 退出状态码。非零表示异常终止。
示例:
Runtime runtime = Runtime.getRuntime();
runtime.halt(0); // 强制终止
五、添加关闭钩子
这些方法用于在 JVM 关闭时执行特定的操作。
1. addShutdownHook(Thread hook)
功能: 注册一个新的虚拟机关闭钩子。
参数:
hook
- 要注册的虚拟机关闭钩子线程。
示例:
Runtime runtime = Runtime.getRuntime();
runtime.addShutdownHook(new Thread(() -> {
System.out.println("JVM is shutting down...");
}));
System.out.println("退出程序");
runtime.exit(0);
2. removeShutdownHook(Thread hook)
功能: 注销一个虚拟机关闭钩子。
参数:
hook
- 要注销的虚拟机关闭钩子线程。
示例:
Runtime runtime = Runtime.getRuntime();
Thread hook = new Thread(() -> {
System.out.println("JVM is shutting down...");
});
runtime.addShutdownHook(hook);
runtime.removeShutdownHook(hook);
System.out.println("退出程序");
runtime.exit(0);
六、加载文件和库
这些方法用于加载动态链接库或者文件。
1. load(String filename)
功能: 加载指定的动态链接库文件。
参数:
filename
- 动态链接库文件的完全限定名。
示例:
Runtime runtime = Runtime.getRuntime();
runtime.load("/path/to/example.dll");
2. loadLibrary(String libname)
功能: 加载指定库名的本地库。
参数:
libname
- 动态链接库的名称。
示例:
Runtime runtime = Runtime.getRuntime();
runtime.loadLibrary("example");
七、其他实用方法
这些方法用于标识 Java 虚拟机的版本信息等。
1. availableProcessors()
功能: 返回 Java 虚拟机可用的逻辑上的处理器数量。
返回值: int
- 可用的逻辑上的处理器数量。
示例:
Runtime runtime = Runtime.getRuntime();
System.out.println("可用的逻辑处理器数量: " + runtime.availableProcessors());
总结
java.lang.Runtime
类提供了一系列静态方法,用于与 Java 虚拟机进行交互。通过使用这些方法,可以有效地管理和控制 JVM 的进程、内存、垃圾收集、退出操作等。
(三)Process
java.lang.Process
类是用于管理和控制操作系统进程的抽象类。通过 Runtime.exec()
或 ProcessBuilder
启动的子进程会返回一个 Process
对象。下面是 Process
类中所有方法的详细讲解,并按照用途、功能、目的、作用、使用场景等方面进行分类和整理,并附上测试用例。
一、获取进程信息
这些方法用于获取子进程的信息。
1. exitValue()
功能: 返回子进程的退出值。子进程正常终止时,返回值为 0
;如果进程非正常终止,则返回一个具体的退出代码。
返回值: int
- 子进程的退出值。
异常: 如果进程尚未终止,会抛出 IllegalThreadStateException
。
示例:
public class ProcessExample {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("notepad");
Thread.sleep(5000); // 等待进程执行
// 尝试获取退出值
System.out.println("退出值: " + process.exitValue());
} catch (IOException | InterruptedException | IllegalThreadStateException e) {
e.printStackTrace();
}
}
}
2. isAlive()
功能: 检查子进程是否仍在运行。
返回值: boolean
- 如果子进程仍在运行,返回 true
;否则返回 false
。
示例:
public class ProcessExample {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("notepad");
Thread.sleep(5000); // 等待进程执行
// 检查进程是否仍在运行
System.out.println("进程是否仍在运行: " + process.isAlive());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
3. pid()
功能: 返回进程的唯一标识符(PID)。
返回值: long
- 子进程的 PID。
示例:
public class ProcessExample {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("notepad");
System.out.println("进程ID: " + process.pid());
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、进程控制
这些方法用于控制子进程的生命周期。
1. destroy()
功能: 终止子进程。
示例:
public class ProcessExample {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("notepad");
Thread.sleep(5000); // 等待进程执行
process.destroy();
System.out.println("进程已终止");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
2. destroyForcibly()
功能: 强制终止子进程。
返回值: Process
- 该方法会返回调用它的 Process
对象。
示例:
public class ProcessExample {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("notepad");
Thread.sleep(5000); // 等待进程执行
process.destroyForcibly();
System.out.println("进程已强制终止");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
3. waitFor()
功能: 使当前线程等待,如果必要,一直等到子进程终止。
返回值: int
- 子进程的退出值。
异常: 如果线程被中断,会抛出 InterruptedException
。
示例:
public class ProcessExample {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("notepad");
int exitValue = process.waitFor();
System.out.println("进程已终止,退出值: " + exitValue);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
4. waitFor(long timeout, TimeUnit unit)
功能: 使当前线程等待,如果必要,一直等到子进程终止或给定的等待时间到期。
参数:
timeout
- 等待时间。unit
- 时间单位。
返回值: boolean
- 如果在等待时间内子进程终止,返回 true
;否则返回 false
。
异常: 如果线程被中断,会抛出 InterruptedException
。
示例:
import java.util.concurrent.TimeUnit;
public class ProcessExample {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("notepad");
boolean terminated = process.waitFor(5, TimeUnit.SECONDS);
System.out.println("进程是否在等待时间内终止: " + terminated);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
三、输入输出流处理
这些方法用于处理子进程的标准输入、标准输出和标准错误流。
1. getInputStream()
功能: 返回子进程的标准输入流。
返回值: InputStream
- 子进程的标准输入流。
示例:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ProcessExample {
public static void main(String[] args) {
//将子进程执行命令后得到的结果通过输入流传给BufferedReader,进而打印出来该结构
try {
Process process = Runtime.getRuntime().exec("cmd /c dir");
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. getErrorStream()
功能: 返回子进程的标准错误流。
返回值: InputStream
- 子进程的标准错误流。
示例:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ProcessExample {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("cmd /c invalidcommand");
InputStream errorStream = process.getErrorStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(errorStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("错误信息: " + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. getOutputStream()
功能: 返回子进程的标准输出流。
返回值: OutputStream
- 子进程的标准输出流。
示例:
import java.io.IOException;
import java.io.OutputStream;
public class ProcessExample {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("cmd");
OutputStream outputStream = process.getOutputStream();
outputStream.write("dir\n".getBytes());
outputStream.flush();
// 读取输出流到输入流中并打印出来
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、进程信息
这些方法用于获取与子进程相关的系统信息和状态。
1. info()
功能: 返回与子进程关联的 ProcessHandle.Info
对象,包含启动时间、总 CPU 时间等信息。
返回值: ProcessHandle.Info
- 包含进程信息的对象。
示例:
public class ProcessExample {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("notepad");
ProcessHandle.Info processInfo = process.info();
System.out.println("进程信息: " + processInfo);
} catch (IOException e) {
e.printStackTrace();
}
}
}
五、平台特定方法
这些方法用于获取与子进程关联的句柄,但这些方法在一些平台可能不可用。
1. toHandle()
功能: 返回表示此进程的 ProcessHandle
。
返回值: ProcessHandle
- 此进程的句柄。
示例:
public class ProcessExample {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("notepad");
ProcessHandle handle = process.toHandle();
System.out.println("进程句柄: " + handle);
} catch (IOException e) {
e.printStackTrace();
}
}
}
总结
java.lang.Process
类提供了一系列方法,用于启动、控制和管理操作系统进程。
(四)ProcessBuilder
java.lang.ProcessBuilder
类用于创建操作系统进程,它提供了比 Runtime.exec()
更加灵活和强大的功能。通过 ProcessBuilder
,你可以设置进程的工作目录、环境变量、输入输出重定向等。下面是 ProcessBuilder
类中所有方法的详细讲解,并按照用途、功能、目的、作用、使用场景等方面进行分类和整理,并附上测试用例。
一、构造方法
1. ProcessBuilder(List<String> command)
功能: 使用指定的命令列表来构造一个新的 ProcessBuilder
实例。
参数:
command
- 包含命令和命令行参数的列表。
示例:
import java.util.Arrays;
import java.util.List;
public class ProcessBuilderExample {
public static void main(String[] args) {
List<String> command = Arrays.asList("cmd", "/c", "dir");
ProcessBuilder processBuilder = new ProcessBuilder(command);
System.out.println("构造方法示例: " + processBuilder.command());
}
}
2. ProcessBuilder(String... command)
功能: 使用指定的命令数组来构造一个新的 ProcessBuilder
实例。
参数:
command
- 包含命令和命令行参数的数组。
示例:
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
System.out.println("构造方法示例: " + processBuilder.command());
}
}
二、设置和获取命令
这些方法用于设置和获取将被执行的命令。
1. command(List<String> command)
功能: 设置将要执行的命令。
参数:
command
- 包含命令和命令行参数的列表。
返回值: ProcessBuilder
- 返回当前 ProcessBuilder
实例,以便进行链式调用。
示例:
import java.util.Arrays;
import java.util.List;
public class ProcessBuilderExample {
public static void main(String[] args) {
List<String> command = Arrays.asList("cmd", "/c", "dir");
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command(command);
System.out.println("设置命令: " + processBuilder.command());
}
}
2. command(String... command)
功能: 设置将要执行的命令。
参数:
command
- 包含命令和命令行参数的数组。
返回值: ProcessBuilder
- 返回当前 ProcessBuilder
实例,以便进行链式调用。
示例:
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("cmd", "/c", "dir");
System.out.println("设置命令: " + processBuilder.command());
}
}
3. command()
功能: 获取将要执行的命令列表。
返回值: List<String>
- 包含命令和命令行参数的列表。
示例:
import java.util.List;
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
List<String> command = processBuilder.command();
System.out.println("获取命令: " + command);
}
}
三、设置和获取环境变量
这些方法用于设置和获取进程的环境变量。
1. environment()
功能: 获取子进程的环境变量映射。
返回值: Map<String, String>
- 环境变量映射。
示例:
import java.util.Map;
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
Map<String, String> env = processBuilder.environment();
env.put("MY_VAR", "my_value");
System.out.println("环境变量: " + env);
}
}
四、设置和获取工作目录
这些方法用于设置和获取进程的工作目录。
1. directory(File directory)
功能: 设置子进程的工作目录。
参数:
directory
- 子进程的工作目录。如果为null
,则使用当前工作目录。
返回值: ProcessBuilder
- 返回当前 ProcessBuilder
实例,以便进行链式调用。
示例:
import java.io.File;
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
processBuilder.directory(new File("C:/"));
System.out.println("工作目录: " + processBuilder.directory());
}
}
2. directory()
功能: 获取子进程的工作目录。
返回值: File
- 子进程的工作目录。
示例:
import java.io.File;
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
File dir = processBuilder.directory();
System.out.println("获取工作目录: " + dir);
}
}
五、设置和获取输入输出重定向
这些方法用于设置和获取进程的输入、输出和错误流的重定向。
1. redirectInput(File file)
功能: 将子进程的标准输入重定向到指定的文件。
参数:
file
- 用于重定向标准输入的文件。
返回值: ProcessBuilder
- 返回当前 ProcessBuilder
实例,以便进行链式调用。
示例:
import java.io.File;
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
processBuilder.redirectInput(new File("input.txt"));
System.out.println("重定向输入: " + processBuilder.redirectInput());
}
}
2. redirectOutput(File file)
功能: 将子进程的标准输出重定向到指定的文件。
参数:
file
- 用于重定向标准输出的文件。
返回值: ProcessBuilder
- 返回当前 ProcessBuilder
实例,以便进行链式调用。
示例:
import java.io.File;
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
processBuilder.redirectOutput(new File("output.txt"));
System.out.println("重定向输出: " + processBuilder.redirectOutput());
}
}
3. redirectError(File file)
功能: 将子进程的标准错误重定向到指定的文件。
参数:
file
- 用于重定向标准错误的文件。
返回值: ProcessBuilder
- 返回当前 ProcessBuilder
实例,以便进行链式调用。
示例:
import java.io.File;
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
processBuilder.redirectError(new File("error.txt"));
System.out.println("重定向错误输出: " + processBuilder.redirectError());
}
}
4. redirectInput()
功能: 获取当前用于子进程标准输入的重定向设置。
返回值: ProcessBuilder.Redirect
- 当前重定向设置。
示例:
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
System.out.println("获取输入重定向: " + processBuilder.redirectInput());
}
}
5. redirectOutput()
功能: 获取当前用于子进程标准输出的重定向设置。
返回值: ProcessBuilder.Redirect
- 当前重定向设置。
示例:
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
System.out.println("获取输出重定向: " + processBuilder.redirectOutput());
}
}
6. redirectError()
功能: 获取当前用于子进程标准错误的重定向设置。
返回值: ProcessBuilder.Redirect
- 当前重定向设置。
示例:
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
System.out.println("获取错误重定向: " + processBuilder.redirectError());
}
}
7. redirectErrorStream(boolean redirectErrorStream)
功能: 设置是否将子进程的标准错误重定向到标准输出。
参数:
redirectErrorStream
- 如果为true
,则将标准错误合并到标准输出。
返回值: ProcessBuilder
- 返回当前 ProcessBuilder
实例,以便进行链式调用。
示例:
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
processBuilder.redirectErrorStream(true);
System.out.println("是否重定向错误流: " + processBuilder.redirectErrorStream());
}
}
8. redirectErrorStream()
功能: 检查是否将子进程的标准错误重定向到标准输出。
返回值: boolean
- 如果标准错误已重定向到标准输出,返回 true
;否则返回 false
。
示例:
public class ProcessBuilderExample {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
System.out.println("是否重定向错误流: " + processBuilder.redirectErrorStream());
}
}
六、启动进程
这些方法用于启动配置好的子进程。
1. start()
功能: 启动一个新的进程,根据当前的 ProcessBuilder
对象的配置。
返回值: Process
- 表示子进程的对象。
异常: 如果进程启动失败,会抛出 IOException
。
示例:
public class ProcessBuilderExample {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
processBuilder.redirectOutput(new File("output.txt"));
Process process = processBuilder.start();
System.out.println("进程已启动: " + process.isAlive());
} catch (IOException e) {
e.printStackTrace();
}
}
}
七、设置和获取继承的IO
这些方法用于设置和获取进程的标准输入、输出和错误流是否应继承当前Java进程的设置。
1. inheritIO()
功能: 设置子进程的标准输入、输出和错误流应继承当前Java进程的。
返回值: ProcessBuilder
- 返回当前 ProcessBuilder
实例,以便进行链式调用。
示例:
public class ProcessBuilderExample {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
processBuilder.inheritIO();
Process process = processBuilder.start();
process.waitFor(); // 等待进程终止
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
总结
java.lang.ProcessBuilder
类提供了一系列方法,用于灵活地创建和管理操作系统进程。通过以上分类和示例代码,您可以全面了解和熟练使用 ProcessBuilder
类的所有方法。
(五)SecurityManager - JDK17版本之后被设为不可用
java.lang.SecurityManager
类用于实现 Java 安全模型中的安全策略。它充当了安全检查的核心机制,决定哪些操作被允许、哪些操作被禁止。通过扩展 SecurityManager
类并重写其方法,可以定制化安全策略。下面是对 SecurityManager
类中所有方法的详细讲解,并按照用途、功能、目的、作用、使用场景等方面进行分类和整理,附上测试用例,让您能够彻底理解和熟练运用这些方法。
一、构造方法
1. SecurityManager()
功能: 构造一个新的 SecurityManager
实例。
示例:
public class CustomSecurityManager extends SecurityManager {
public CustomSecurityManager() {
super();
System.out.println("CustomSecurityManager initialized");
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
CustomSecurityManager securityManager = new CustomSecurityManager();
System.setSecurityManager(securityManager);
System.out.println("SecurityManager set");
}
}
二、检查文件操作
这些方法用于检查文件读取、写入和删除操作。
1. checkRead(String file)
功能: 检查是否允许读取指定文件。
参数:
file
- 要读取的文件名。
异常: 如果不允许读取文件,会抛出 SecurityException
。
示例:
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkRead(String file) {
System.out.println("检查读取文件: " + file);
super.checkRead(file);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
System.out.println("File content: " + new java.util.Scanner(new java.io.File("test.txt")).nextLine());
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. checkWrite(String file)
功能: 检查是否允许写入指定文件。
参数:
file
- 要写入的文件名。
异常: 如果不允许写入文件,会抛出 SecurityException
。
示例:
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkWrite(String file) {
System.out.println("检查写入文件: " + file);
super.checkWrite(file);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
java.nio.file.Files.write(java.nio.file.Paths.get("test.txt"), "Hello, World!".getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. checkDelete(String file)
功能: 检查是否允许删除指定文件。
参数:
file
- 要删除的文件名。
异常: 如果不允许删除文件,会抛出 SecurityException
。
示例:
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkDelete(String file) {
System.out.println("检查删除文件: " + file);
super.checkDelete(file);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
java.nio.file.Files.deleteIfExists(java.nio.file.Paths.get("test.txt"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、检查网络操作
这些方法用于检查网络连接和监听操作。
1. checkConnect(String host, int port)
功能: 检查是否允许连接到指定的主机和端口。
参数:
host
- 主机名。port
- 端口号。
异常: 如果不允许连接,会抛出 SecurityException
。
示例:
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkConnect(String host, int port) {
System.out.println("检查连接到: " + host + ":" + port);
super.checkConnect(host, port);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
java.net.Socket socket = new java.net.Socket("www.example.com", 80);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. checkListen(int port)
功能: 检查是否允许在指定端口上监听。
参数:
port
- 端口号。
异常: 如果不允许监听,会抛出 SecurityException
。
示例:
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkListen(int port) {
System.out.println("检查监听端口: " + port);
super.checkListen(port);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
java.net.ServerSocket serverSocket = new java.net.ServerSocket(8080);
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、检查线程操作
这些方法用于检查线程的创建、修改和访问操作。
1. checkAccess(Thread t)
功能: 检查当前线程是否允许修改指定线程。
参数:
t
- 要检查的线程。
异常: 如果不允许修改线程,会抛出 SecurityException
。
示例:
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkAccess(Thread t) {
System.out.println("检查访问线程: " + t.getName());
super.checkAccess(t);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
Thread thread = new Thread(() -> System.out.println("线程执行中..."));
thread.start();
thread.join();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. checkAccess(ThreadGroup g)
功能: 检查当前线程是否允许修改指定线程组。
参数:
g
- 要检查的线程组。
异常: 如果不允许修改线程组,会抛出 SecurityException
。
示例:
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkAccess(ThreadGroup g) {
System.out.println("检查访问线程组: " + g.getName());
super.checkAccess(g);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
ThreadGroup group = new ThreadGroup("TestGroup");
Thread thread = new Thread(group, () -> System.out.println("线程执行中..."));
thread.start();
thread.join();
} catch (Exception e) {
e.printStackTrace();
}
}
}
五、检查系统属性访问
这些方法用于检查访问系统属性的操作。
1. checkPropertyAccess(String key)
功能: 检查是否允许访问指定的系统属性。
参数:
key
- 要访问的系统属性键。
异常: 如果不允许访问,会抛出 SecurityException
。
示例:
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkPropertyAccess(String key) {
System.out.println("检查访问系统属性: " + key);
super.checkPropertyAccess(key);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
String javaVersion = System.getProperty("java.version");
System.out.println("Java 版本: " + javaVersion);
} catch (Exception e) {
e.printStackTrace();
}
}
}
六、检查系统退出
1. checkExit(int status)
功能: 检查是否允许系统退出。
参数:
status
- 退出状态码。
异常: 如果不允许退出,会抛出 SecurityException
。
示例:
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkExit(int status) {
System.out.println("检查系统退出状态码: " + status);
super.checkExit(status);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
System.exit(0);
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
七、检查包访问和定义
这些方法用于检查访问和定义包的操作。
1. checkPackageAccess(String pkg)
功能: 检查是否允许访问指定的包。
参数:
pkg
- 要访问的包名。
异常: 如果不允许访问,会抛出 SecurityException
。
示例:
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkPackageAccess(String pkg) {
System.out.println("检查访问包: " + pkg);
super.checkPackageAccess(pkg);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
Class.forName("java.lang.String");
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. checkPackageDefinition(String pkg)
功能: 检查是否允许定义指定的包。
参数:
pkg
- 要定义的包名。
异常: 如果不允许定义,会抛出 SecurityException
。
示例:
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkPackageDefinition(String pkg) {
System.out.println("检查定义包: " + pkg);
super.checkPackageDefinition(pkg);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
// 模拟定义包的操作
ClassLoader.getSystemClassLoader().loadClass("java.lang.String");
} catch (Exception e) {
e.printStackTrace();
}
}
}
八、检查权限
1. checkPermission(Permission perm)
功能: 检查是否允许执行指定的权限操作。
参数:
perm
- 要检查的权限。
异常: 如果不允许执行权限操作,会抛出 SecurityException
。
示例:
import java.security.Permission;
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkPermission(Permission perm) {
System.out.println("检查权限: " + perm);
super.checkPermission(perm);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
System.getProperty("user.home");
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
2. checkPermission(Permission perm, Object context)
功能: 带上下文检查是否允许执行指定的权限操作。
参数:
perm
- 要检查的权限。context
- 相关的上下文。
异常: 如果不允许执行权限操作,会抛出 SecurityException
。
示例:
import java.security.Permission;
public class CustomSecurityManager extends SecurityManager {
@Override
public void checkPermission(Permission perm, Object context) {
System.out.println("检查权限: " + perm + " 上下文: " + context);
super.checkPermission(perm, context);
}
}
public class SecurityManagerExample {
public static void main(String[] args) {
System.setSecurityManager(new CustomSecurityManager());
try {
System.getProperty("user.home");
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
总结
java.lang.SecurityManager
类提供了一系列方法,用于检查和控制各种安全敏感操作。通过扩展 SecurityManager
类并重写其方法,可以实现自定义的安全策略。
(六)Shutdown - Java标准库并没有公开名为 Shutdown
的类
在Java中,Shutdown
类可能是一个内部类,用于处理JVM关闭的过程。虽然Java标准库并没有公开名为 Shutdown
的类,但JVM确实提供了一些机制在关闭时执行特定的任务。这些机制主要涉及 Runtime
类和 Thread
类。
接下来,我将详细讲解与JVM关闭相关的所有方法及其参数,并按照用途、功能、目的、作用、使用场景等方面进行分类和整理,并且给出详细的示例代码。
一、添加关闭钩子
1. Runtime.addShutdownHook(Thread hook)
功能: 向JVM注册一个关闭钩子,当JVM关闭时会执行这个钩子线程。
参数:
hook
- 一个线程,当JVM关闭时将会调用它的run
方法。
目的: 在JVM关闭前执行一些清理操作,比如保存数据、释放资源。
使用场景: 用于在正常关闭、用户中断或系统退出时执行清理任务。
示例:
public class ShutdownHookExample {
public static void main(String[] args) {
// 创建一个关闭钩子线程
Thread shutdownHook = new Thread(() -> {
System.out.println("JVM 关闭前执行关闭钩子...");
// 执行清理操作
});
// 向JVM注册关闭钩子
Runtime.getRuntime().addShutdownHook(shutdownHook);
System.out.println("主线程正在运行...");
try {
Thread.sleep(3000); // 主线程休眠3秒,模拟长时间运行
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程执行完毕");
}
}
二、移除关闭钩子
1. Runtime.removeShutdownHook(Thread hook)
功能: 从JVM中移除一个已注册的关闭钩子。
参数:
hook
- 要移除的关闭钩子线程。
目的: 如果在JVM关闭时不再需要执行特定钩子,可以移除它。
使用场景: 动态管理关闭钩子,需要在某些情况下取消预定的清理操作。
示例:
public class ShutdownHookExample {
public static void main(String[] args) {
// 创建一个关闭钩子线程
Thread shutdownHook = new Thread(() -> {
System.out.println("JVM 关闭前执行关闭钩子...");
// 执行清理操作
});
// 向JVM注册关闭钩子
Runtime.getRuntime().addShutdownHook(shutdownHook);
System.out.println("主线程正在运行...");
try {
Thread.sleep(3000); // 主线程休眠3秒,模拟长时间运行
} catch (InterruptedException e) {
e.printStackTrace();
}
// 从JVM中移除关闭钩子
Runtime.getRuntime().removeShutdownHook(shutdownHook);
System.out.println("关闭钩子已移除");
System.out.println("主线程执行完毕");
}
}
三、终止应用程序
1. Runtime.exit(int status)
功能: 终止当前运行的Java虚拟机,退出状态将作为进程的退出状态码。
参数:
status
- 退出状态码。通常,非零状态码表示异常终止。
目的: 立即结束应用程序的执行。
使用场景: 在程序中遇到无法恢复的错误时,或在需要立即终止程序时使用。
示例:
public class ExitExample {
public static void main(String[] args) {
System.out.println("主线程正在运行...");
try {
Thread.sleep(3000); // 主线程休眠3秒,模拟长时间运行
} catch (InterruptedException e) {
e.printStackTrace();
}
// 立即终止应用程序
Runtime.getRuntime().exit(1); // 状态码1表示异常终止
}
}
四、终止应用程序(不执行关闭钩子)
1. Runtime.halt(int status)
功能: 立即终止当前运行的Java虚拟机,不会执行已注册的关闭钩子。
参数:
status
- 退出状态码。通常,非零状态码表示异常终止。
目的: 在极端情况下,立即终止JVM,而不执行任何清理任务。
使用场景: 在紧急情况下,需要立即停止JVM而不进行任何清理操作。
示例:
public class HaltExample {
public static void main(String[] args) {
// 创建一个关闭钩子线程
Thread shutdownHook = new Thread(() -> {
System.out.println("JVM 关闭前执行关闭钩子...");
// 执行清理操作
});
// 向JVM注册关闭钩子
Runtime.getRuntime().addShutdownHook(shutdownHook);
System.out.println("主线程正在运行...");
try {
Thread.sleep(3000); // 主线程休眠3秒,模拟长时间运行
} catch (InterruptedException e) {
e.printStackTrace();
}
// 立即终止应用程序,不执行任何关闭钩子
Runtime.getRuntime().halt(1); // 状态码1表示异常终止
}
}
五、获取运行时实例
1. Runtime.getRuntime()
功能: 获取与当前Java应用程序关联的运行时对象。
返回值: Runtime
- 当前Java应用程序的运行时实例。
目的: 访问与应用程序相关的运行时环境信息。
使用场景: 在应用程序中获取运行时对象以调用与JVM相关的方法。
示例:
public class GetRuntimeExample {
public static void main(String[] args) {
// 获取Runtime实例
Runtime runtime = Runtime.getRuntime();
// 打印当前可用处理器数量
System.out.println("可用处理器数量: " + runtime.availableProcessors());
// 打印JVM最大内存
System.out.println("JVM最大内存: " + runtime.maxMemory());
}
}
总结
以上方法提供了与JVM关闭相关的各种操作和使用场景。通过 Runtime
类中的这些方法,您可以注册和管理关闭钩子,控制JVM的终止行为,以及获取运行时环境的信息。这些机制允许您在应用程序关闭时执行必要的清理操作,确保资源得以正确释放。
三、错误异常类
(一)Throwable
Throwable
类是 Java 的所有错误和异常的基类。它包含了许多方法,用于获取异常的详细信息、堆栈轨迹、原因等。以下是对 Throwable
类中所有方法的详细讲解,并分类整理及提供测试用例,帮助您彻底理解和熟练运用这些方法。
一、构造方法
1. Throwable()
功能: 创建一个新的 Throwable
实例,不包含详细信息信息。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable t = new Throwable();
System.out.println(t.toString());
}
}
2. Throwable(String message)
功能: 创建一个新的 Throwable
实例,包含指定的详细信息。
参数:
message
- 详细信息。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable t = new Throwable("This is an error message");
System.out.println(t.toString());
}
}
3. Throwable(String message, Throwable cause)
功能: 创建一个新的 Throwable
实例,包含指定的详细信息和原因。
参数:
message
- 详细信息。cause
- 异常的原因。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable cause = new Throwable("Cause of the error");
Throwable t = new Throwable("This is an error message", cause);
System.out.println(t.toString());
}
}
4. Throwable(Throwable cause)
功能: 创建一个新的 Throwable
实例,包含指定的原因。
参数:
cause
- 异常的原因。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable cause = new Throwable("Cause of the error");
Throwable t = new Throwable(cause);
System.out.println(t.toString());
}
}
二、获取详细信息
1. String getMessage()
功能: 返回此 Throwable
实例的详细信息。
返回值: 详细信息字符串,如果没有详细信息则返回 null
。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable t = new Throwable("This is an error message");
System.out.println(t.getMessage());
}
}
2. String getLocalizedMessage()
功能: 返回此 Throwable
实例的本地化详细信息。
返回值: 本地化详细信息字符串,如果没有详细信息则返回 null
。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable t = new Throwable("This is an error message");
System.out.println(t.getLocalizedMessage());
}
}
三、获取原因
1. Throwable getCause()
功能: 返回此 Throwable
实例的原因。
返回值: Throwable
对象,如果没有原因则返回 null
。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable cause = new Throwable("Cause of the error");
Throwable t = new Throwable("This is an error message", cause);
System.out.println(t.getCause());
}
}
2. Throwable initCause(Throwable cause)
功能: 初始化此 Throwable
实例的原因。
参数:
cause
- 异常的原因。
返回值: Throwable
对象,初始化后的当前实例。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable t = new Throwable("This is an error message");
t.initCause(new Throwable("Cause of the error"));
System.out.println(t.getCause());
}
}
四、获取堆栈轨迹
1. void printStackTrace()
功能: 将此 Throwable
实例的堆栈轨迹打印到标准错误流。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable t = new Throwable("This is an error message");
t.printStackTrace();
}
}
2. void printStackTrace(PrintStream s)
功能: 将此 Throwable
实例的堆栈轨迹打印到指定的 PrintStream
。
参数:
s
- 打印堆栈轨迹的PrintStream
。
示例:
import java.io.PrintStream;
public class ThrowableExample {
public static void main(String[] args) {
Throwable t = new Throwable("This is an error message");
t.printStackTrace(System.out);
}
}
3. void printStackTrace(PrintWriter s)
功能: 将此 Throwable
实例的堆栈轨迹打印到指定的 PrintWriter
。
参数:
s
- 打印堆栈轨迹的PrintWriter
。
示例:
import java.io.PrintWriter;
public class ThrowableExample {
public static void main(String[] args) {
Throwable t = new Throwable("This is an error message");
t.printStackTrace(new PrintWriter(System.out));
}
}
五、获取和设置堆栈轨迹元素
1. StackTraceElement[] getStackTrace()
功能: 返回此 Throwable
实例的堆栈轨迹元素数组。
返回值: StackTraceElement
数组。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable t = new Throwable("This is an error message");
StackTraceElement[] stackTrace = t.getStackTrace();
for (StackTraceElement element : stackTrace) {
System.out.println(element);
}
}
}
2. void setStackTrace(StackTraceElement[] stackTrace)
功能: 设置此 Throwable
实例的堆栈轨迹元素。
参数:
stackTrace
- 要设置的StackTraceElement
数组。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable t = new Throwable("This is an error message");
StackTraceElement element = new StackTraceElement("MyClass", "myMethod", "MyClass.java", 10);
StackTraceElement[] stackTrace = {element};
t.setStackTrace(stackTrace);
t.printStackTrace();
}
}
六、其他方法
1. Throwable fillInStackTrace()
功能: 用当前线程的堆栈轨迹填充此 Throwable
实例。
返回值: Throwable
对象,当前实例。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable t = new Throwable("This is an error message");
t.fillInStackTrace();
t.printStackTrace();
}
}
2. String toString()
功能: 返回此 Throwable
实例的简短描述,包括类名和详细信息。如果详细信息为 null
,则返回类名。
返回值: String
- 简短描述。
示例:
public class ThrowableExample {
public static void main(String[] args) {
Throwable t = new Throwable("This is an error message");
System.out.println(t.toString());
}
}
总结
Throwable
类提供了一系列方法,用于处理和获取异常的详细信息、原因、堆栈轨迹等。通过这些方法,您可以更好地捕获和处理异常信息,提高程序的健壮性和可维护性。以下是对 Throwable
类方法的分类整理:
- 构造方法: 创建
Throwable
实例,不同的构造方法允许包含详细信息和原因。Throwable()
Throwable(String message)
Throwable(String message, Throwable cause)
Throwable(Throwable cause)
- 获取详细信息: 获取异常的详细信息。
String getMessage()
String getLocalizedMessage()
- 获取原因: 获取和设置异常的原因。
Throwable getCause()
Throwable initCause(Throwable cause)
- 获取堆栈轨迹: 打印和获取堆栈轨迹。
void printStackTrace()
void printStackTrace(PrintStream s)
void printStackTrace(PrintWriter s)
StackTraceElement[] getStackTrace()
void setStackTrace(StackTraceElement[] stackTrace)
- 其他方法: 其他有用的方法。
Throwable fillInStackTrace()
String toString()
通过这些分类和示例代码,您可以全面了解和熟练使用 Throwable
类的所有方法。
(二)Exception
Exception
类是Java中所有可抛出的异常的基类,继承自 Throwable
类。Exception
类本身并没有添加任何新的方法,而是继承了 Throwable
类中的所有方法。为了让您彻底理解和熟练运用这些方法,我将详细讲解 Exception
类所继承的所有方法,包括其参数、作用、用途、使用场景,并提供详细的示例代码。
一、构造方法
1. Exception()
功能: 创建一个新的 Exception
实例,不包含详细信息。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Exception e = new Exception();
System.out.println(e.toString());
}
}
2. Exception(String message)
功能: 创建一个新的 Exception
实例,包含指定的详细信息。
参数:
message
- 详细信息。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Exception e = new Exception("This is an error message");
System.out.println(e.toString());
}
}
3. Exception(String message, Throwable cause)
功能: 创建一个新的 Exception
实例,包含指定的详细信息和原因。
参数:
message
- 详细信息。cause
- 异常的原因。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Throwable cause = new Throwable("Cause of the error");
Exception e = new Exception("This is an error message", cause);
System.out.println(e.toString());
}
}
4. Exception(Throwable cause)
功能: 创建一个新的 Exception
实例,包含指定的原因。
参数:
cause
- 异常的原因。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Throwable cause = new Throwable("Cause of the error");
Exception e = new Exception(cause);
System.out.println(e.toString());
}
}
二、获取详细信息
1. String getMessage()
功能: 返回此 Exception
实例的详细信息。
返回值: 详细信息字符串,如果没有详细信息则返回 null
。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Exception e = new Exception("This is an error message");
System.out.println(e.getMessage());
}
}
2. String getLocalizedMessage()
功能: 返回此 Exception
实例的本地化详细信息。
返回值: 本地化详细信息字符串,如果没有详细信息则返回 null
。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Exception e = new Exception("This is an error message");
System.out.println(e.getLocalizedMessage());
}
}
三、获取原因
1. Throwable getCause()
功能: 返回此 Exception
实例的原因。
返回值: Throwable
对象,如果没有原因则返回 null
。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Throwable cause = new Throwable("Cause of the error");
Exception e = new Exception("This is an error message", cause);
System.out.println(e.getCause());
}
}
2. Throwable initCause(Throwable cause)
功能: 初始化此 Exception
实例的原因。
参数:
cause
- 异常的原因。
返回值: Throwable
对象,初始化后的当前实例。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Exception e = new Exception("This is an error message");
e.initCause(new Throwable("Cause of the error"));
System.out.println(e.getCause());
}
}
四、获取堆栈轨迹
1. void printStackTrace()
功能: 将此 Exception
实例的堆栈轨迹打印到标准错误流。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Exception e = new Exception("This is an error message");
e.printStackTrace();
}
}
2. void printStackTrace(PrintStream s)
功能: 将此 Exception
实例的堆栈轨迹打印到指定的 PrintStream
。
参数:
s
- 打印堆栈轨迹的PrintStream
。
示例:
import java.io.PrintStream;
public class ExceptionExample {
public static void main(String[] args) {
Exception e = new Exception("This is an error message");
e.printStackTrace(System.out);
}
}
3. void printStackTrace(PrintWriter s)
功能: 将此 Exception
实例的堆栈轨迹打印到指定的 PrintWriter
。
参数:
s
- 打印堆栈轨迹的PrintWriter
。
示例:
import java.io.PrintWriter;
public class ExceptionExample {
public static void main(String[] args) {
Exception e = new Exception("This is an error message");
e.printStackTrace(new PrintWriter(System.out));
}
}
五、获取和设置堆栈轨迹元素
1. StackTraceElement[] getStackTrace()
功能: 返回此 Exception
实例的堆栈轨迹元素数组。
返回值: StackTraceElement
数组。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Exception e = new Exception("This is an error message");
StackTraceElement[] stackTrace = e.getStackTrace();
for (StackTraceElement element : stackTrace) {
System.out.println(element);
}
}
}
2. void setStackTrace(StackTraceElement[] stackTrace)
功能: 设置此 Exception
实例的堆栈轨迹元素。
参数:
stackTrace
- 要设置的StackTraceElement
数组。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Exception e = new Exception("This is an error message");
StackTraceElement element = new StackTraceElement("MyClass", "myMethod", "MyClass.java", 10);
StackTraceElement[] stackTrace = {element};
e.setStackTrace(stackTrace);
e.printStackTrace();
}
}
六、其他方法
1. Throwable fillInStackTrace()
功能: 用当前线程的堆栈轨迹填充此 Exception
实例。
返回值: Throwable
对象,当前实例。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Exception e = new Exception("This is an error message");
e.fillInStackTrace();
e.printStackTrace();
}
}
2. String toString()
功能: 返回此 Exception
实例的简短描述,包括类名和详细信息。如果详细信息为 null
,则返回类名。
返回值: String
- 简短描述。
示例:
public class ExceptionExample {
public static void main(String[] args) {
Exception e = new Exception("This is an error message");
System.out.println(e.toString());
}
}
总结
Exception
类提供了一系列方法,用于处理和获取异常的详细信息、原因、堆栈轨迹等。通过这些方法,您可以更好地捕获和处理异常信息,提高程序的健壮性和可维护性。以下是对 Exception
类方法的分类整理:
- 构造方法: 创建
Exception
实例,不同的构造方法允许包含详细信息和原因。Exception()
Exception(String message)
Exception(String message, Throwable cause)
Exception(Throwable cause)
- 获取详细信息: 获取异常的详细信息。
String getMessage()
String getLocalizedMessage()
- 获取原因: 获取和设置异常的原因。
Throwable getCause()
Throwable initCause(Throwable cause)
- 获取堆栈轨迹: 打印和获取堆栈轨迹。
void printStackTrace()
void printStackTrace(PrintStream s)
void printStackTrace(PrintWriter s)
StackTraceElement[] getStackTrace()
void setStackTrace(StackTraceElement[] stackTrace)
- 其他方法: 其他有用的方法。
Throwable fillInStackTrace()
String toString()
通过这些分类和示例代码,您可以全面了解和熟练使用 Exception
类的所有方法。
(三)Error
Error
类是 Java 中所有错误的基类,继承自 Throwable
。与 Exception
类类似,Error
类本身没有增加新的方法,而是继承了 Throwable
类中的所有方法。Error
通常用于标识严重的程序错误,这些错误通常无法被程序自身处理和恢复。以下是对 Error
类中的所有方法的详细讲解,包括其参数、作用、用途、使用场景,并提供详细的示例代码,帮助您彻底理解和熟练运用这些方法。
一、构造方法
1. Error()
功能: 创建一个新的 Error
实例,不包含详细信息。
示例:
public class ErrorExample {
public static void main(String[] args) {
Error e = new Error();
System.out.println(e.toString());
}
}
2. Error(String message)
功能: 创建一个新的 Error
实例,包含指定的详细信息。
参数:
message
- 详细信息。
示例:
public class ErrorExample {
public static void main(String[] args) {
Error e = new Error("This is an error message");
System.out.println(e.toString());
}
}
3. Error(String message, Throwable cause)
功能: 创建一个新的 Error
实例,包含指定的详细信息和原因。
参数:
message
- 详细信息。cause
- 错误的原因。
示例:
public class ErrorExample {
public static void main(String[] args) {
Throwable cause = new Throwable("Cause of the error");
Error e = new Error("This is an error message", cause);
System.out.println(e.toString());
}
}
4. Error(Throwable cause)
功能: 创建一个新的 Error
实例,包含指定的原因。
参数:
cause
- 错误的原因。
示例:
public class ErrorExample {
public static void main(String[] args) {
Throwable cause = new Throwable("Cause of the error");
Error e = new Error(cause);
System.out.println(e.toString());
}
}
二、获取详细信息
1. String getMessage()
功能: 返回此 Error
实例的详细信息。
返回值: 详细信息字符串,如果没有详细信息则返回 null
。
示例:
public class ErrorExample {
public static void main(String[] args) {
Error e = new Error("This is an error message");
System.out.println(e.getMessage());
}
}
2. String getLocalizedMessage()
功能: 返回此 Error
实例的本地化详细信息。
返回值: 本地化详细信息字符串,如果没有详细信息则返回 null
。
示例:
public class ErrorExample {
public static void main(String[] args) {
Error e = new Error("This is an error message");
System.out.println(e.getLocalizedMessage());
}
}
三、获取原因
1. Throwable getCause()
功能: 返回此 Error
实例的原因。
返回值: Throwable
对象,如果没有原因则返回 null
。
示例:
public class ErrorExample {
public static void main(String[] args) {
Throwable cause = new Throwable("Cause of the error");
Error e = new Error("This is an error message", cause);
System.out.println(e.getCause());
}
}
2. Throwable initCause(Throwable cause)
功能: 初始化此 Error
实例的原因。
参数:
cause
- 错误的原因。
返回值: Throwable
对象,初始化后的当前实例。
示例:
public class ErrorExample {
public static void main(String[] args) {
Error e = new Error("This is an error message");
e.initCause(new Throwable("Cause of the error"));
System.out.println(e.getCause());
}
}
四、获取堆栈轨迹
1. void printStackTrace()
功能: 将此 Error
实例的堆栈轨迹打印到标准错误流。
示例:
public class ErrorExample {
public static void main(String[] args) {
Error e = new Error("This is an error message");
e.printStackTrace();
}
}
2. void printStackTrace(PrintStream s)
功能: 将此 Error
实例的堆栈轨迹打印到指定的 PrintStream
。
参数:
s
- 打印堆栈轨迹的PrintStream
。
示例:
import java.io.PrintStream;
public class ErrorExample {
public static void main(String[] args) {
Error e = new Error("This is an error message");
e.printStackTrace(System.out);
}
}
3. void printStackTrace(PrintWriter s)
功能: 将此 Error
实例的堆栈轨迹打印到指定的 PrintWriter
。
参数:
s
- 打印堆栈轨迹的PrintWriter
。
示例:
import java.io.PrintWriter;
public class ErrorExample {
public static void main(String[] args) {
Error e = new Error("This is an error message");
e.printStackTrace(new PrintWriter(System.out));
}
}
五、获取和设置堆栈轨迹元素
1. StackTraceElement[] getStackTrace()
功能: 返回此 Error
实例的堆栈轨迹元素数组。
返回值: StackTraceElement
数组。
示例:
public class ErrorExample {
public static void main(String[] args) {
Error e = new Error("This is an error message");
StackTraceElement[] stackTrace = e.getStackTrace();
for (StackTraceElement element : stackTrace) {
System.out.println(element);
}
}
}
2. void setStackTrace(StackTraceElement[] stackTrace)
功能: 设置此 Error
实例的堆栈轨迹元素。
参数:
stackTrace
- 要设置的StackTraceElement
数组。
示例:
public class ErrorExample {
public static void main(String[] args) {
Error e = new Error("This is an error message");
StackTraceElement element = new StackTraceElement("MyClass", "myMethod", "MyClass.java", 10);
StackTraceElement[] stackTrace = {element};
e.setStackTrace(stackTrace);
e.printStackTrace();
}
}
六、其他方法
1. Throwable fillInStackTrace()
功能: 用当前线程的堆栈轨迹填充此 Error
实例。
返回值: Throwable
对象,当前实例。
示例:
public class ErrorExample {
public static void main(String[] args) {
Error e = new Error("This is an error message");
e.fillInStackTrace();
e.printStackTrace();
}
}
2. String toString()
功能: 返回此 Error
实例的简短描述,包括类名和详细信息。如果详细信息为 null
,则返回类名。
返回值: String
- 简短描述。
示例:
public class ErrorExample {
public static void main(String[] args) {
Error e = new Error("This is an error message");
System.out.println(e.toString());
}
}
总结
Error
类提供了一系列方法,用于处理和获取错误的详细信息、原因、堆栈轨迹等。通过这些方法,您可以更好地捕获和处理错误信息,尽管在大多数情况下,Error
表示严重的系统级错误,通常不应该被程序捕获和处理。以下是对 Error
类方法的分类整理:
- 构造方法: 创建
Error
实例,不同的构造方法允许包含详细信息和原因。Error()
Error(String message)
Error(String message, Throwable cause)
Error(Throwable cause)
- 获取详细信息: 获取错误的详细信息。
String getMessage()
String getLocalizedMessage()
- 获取原因: 获取和设置错误的原因。
Throwable getCause()
Throwable initCause(Throwable cause)
- 获取堆栈轨迹: 打印和获取堆栈轨迹。
void printStackTrace()
void printStackTrace(PrintStream s)
void printStackTrace(PrintWriter s)
StackTraceElement[] getStackTrace()
void setStackTrace(StackTraceElement[] stackTrace)
- 其他方法: 其他有用的方法。
Throwable fillInStackTrace()
String toString()
通过这些分类和示例代码,您可以全面了解和熟练使用 Error
类的所有方法。