Java知识大全 - 五、Java高级编程

2023-11-20

1. 异常和错误处理

  • 在 Java 中,异常用于处理程序执行期间可能发生的错误和其他异常情况。异常允许开发人员以结构化和一致的方式处理错误,从而使代码更加健壮和可靠。

  • 发生错误时,Java 会创建一个异常对象,其中包含有关错误的信息,例如错误的类型和发生错误的位置。然后抛出异常对象,或向上传递调用堆栈,直到它被相应的异常处理程序捕获。

  • Java 提供了几个内置的异常类,例如 RuntimeException 和 IOException 类,它们可用于处理各种类型的错误。此外,Java 还允许开发人员创建自己的自定义异常类来处理特定于应用程序的错误。

  • 为了在 Java 中处理异常,开发人员可以使用 try-catch 块,该块由一个 try 块和一个或多个 catch 块组成,其中执行可能引发异常的代码,以及一个或多个 catch 块,用于处理异常。catch 块指定它可以处理的异常类型,并包含用于处理异常的代码。

例如,下面的代码演示了一个简单的 try-catch 块,用于处理除以零错误:

int numerator = 10;
int denominator = 0;
try {
    int result = numerator / denominator;
} catch (ArithmeticException e) {
    System.out.println("Cannot divide by zero!");
}

在此示例中,try 块中的代码尝试将分子除以分母,分母为零。这将抛出一个算术异常。catch 块捕获异常,并将消息打印到控制台。

通过在 Java 中使用异常和错误处理技术,开发人员可以创建更健壮、更可靠的应用程序,从而更好地处理错误和异常情况。

除了 try-catch 块之外,Java 还提供了一个 finally 块,可用于执行无论是否抛出异常都应运行的代码。finally 块在 try 和 catch 块之后执行,通常用于释放资源或执行其他清理任务。

Java 还提供了 throws 关键字,该关键字用于指定方法可以引发异常。这允许方法将处理异常的责任传递给其调用方,而不是在方法本身中处理它。

例如,下面的代码演示了一个使用 throws 关键字引发异常的方法:

public void readFile(String fileName) throws IOException {
    FileReader reader = null;
    try {
        reader = new FileReader(fileName);
        // Code to read file
    } finally {
        if (reader != null) {
            reader.close();
        }
    }
}

在此示例中,方法读取由 fileName 参数指定的文件。如果在读取文件时发生 IOException,该方法将使用 throws 关键字引发异常。该方法的调用方负责处理异常。

总之,异常和错误处理是Java编程的重要组成部分,它允许开发人员以结构化和一致的方式处理错误和异常情况。通过使用 try-catch 块、finally 块和 throws 关键字,开发人员可以创建更健壮、更可靠的应用程序,从而更好地处理错误和异常情况。

Java 提供了几个内置的异常类,例如 RuntimeException 和 IOException 类,它们可用于处理各种类型的错误。此外,Java 还允许开发人员创建自己的自定义异常类来处理特定于应用程序的错误。

若要在 Java 中创建自定义异常类,开发人员可以创建一个扩展 Exception 或 RuntimeException 类的新类。自定义异常类通常应具有将消息作为参数的构造函数,该构造函数可用于提供有关错误的详细信息。

例如,下面的代码演示了一个名为 MyException 的自定义异常类,该类扩展了 RuntimeException 类:

public class MyException extends RuntimeException {
    public MyException(String message) {
        super(message);
    }
}

在此示例中,MyException 类扩展了 RuntimeException 类,并提供了一个将消息作为参数的构造函数。这允许开发人员创建 MyException 类的实例,其中包含可用于提供有关错误的详细信息的特定消息。

创建自定义异常类后,可以使用 throw 关键字引发它,就像任何其他异常类一样。例如,下面的代码演示如何引发 MyException 类的实例:

int value = -1;
if (value < 0) {
    throw new MyException("Value cannot be negative");
}

在此示例中,代码检查值是否为负数,如果是,则会引发 MyException 类的实例,并显示指示错误的消息。

通过使用自定义异常类,开发人员可以创建更有意义和更具体的错误消息,以帮助诊断和修复应用程序中的问题。

与 Java 中的异常相关的另一个重要概念是异常链接。异常链接允许异常沿调用堆栈向上传播,同时保留原始异常信息。

当捕获异常时,可以将其包装在另一个异常中并重新引发,从而保留原始异常信息。这对于调试和诊断目的非常有用,因为它允许记录或向用户显示原始异常信息。

例如:

public void myMethod() {
    try {
        // Some code that may throw an exception
    } catch (IOException e) {
        throw new MyException("An error occurred while processing data", e);
    }
}

在此示例中,myMethod() 方法可能会抛出 IOException。如果捕获了 IOException,该方法将创建 MyException 类的新实例,并将原始异常作为参数传递给构造函数。这允许 MyException 类“包装”原始异常并保留其信息。

通过使用异常链接,开发人员可以创建信息更丰富的错误消息,其中包含有关错误原始原因的信息,从而更轻松地诊断和修复应用程序中的问题。

总之,异常处理是 Java 编程的重要组成部分,它允许开发人员以结构化和一致的方式处理错误和异常情况。通过使用内置异常类、自定义异常类和异常链接,开发人员可以创建更可靠、更可靠的应用程序,从而更好地处理错误和异常情况。

2. 多线程和并发

Java 编程中的另一个重要概念是多线程。多线程允许程序同时执行多个执行线程,从而更有效地使用系统资源并提高应用程序性能。

在Java中,多线程是使用Thread类和Runnable接口实现的。Thread 类表示执行线程,而 Runnable 接口定义将由线程执行的代码。

若要创建新线程,开发人员必须首先创建 Runnable 接口的实例,然后将该实例传递给 Thread 类的新实例。然后在新的 Thread 实例上调用 start() 方法以开始执行线程。

下面是一个示例:

public class MyRunnable implements Runnable {
    public void run() {
        // Code to be executed by the thread
    }
}

public class Main {
    public static void main(String[] args) {
        MyRunnable r = new MyRunnable();
        Thread t = new Thread(r);
        t.start();
    }
}

在此示例中,MyRunnable 类实现了 Runnable 接口,并为 run() 方法提供了一个实现,该方法包含要由新线程执行的代码。Main 类创建 MyRunnable 类的新实例,然后将其传递给 Thread 类的新实例。然后在新的 Thread 实例上调用 start() 方法以开始执行新线程。

Java还提供了许多内置的方法和类来帮助进行多线程编程。例如,sync 关键字可用于防止多个线程同时访问共享资源,wait() 和 notify() 方法可用于允许线程等待满足某些条件。

总之,多线程是 Java 编程中的一个重要概念,它允许开发人员利用并发执行的性能优势。通过使用 Thread 类和 Runnable 接口,以及内置的同步和通信机制,开发人员可以创建更高效、响应更快的应用程序,从而更好地处理多个并发任务。

多线程和并发是 Java 编程中的相关概念。并发是指程序同时处理多个任务或进程的能力,而多线程是通过允许多个执行线程在单个程序中并发运行来实现并发的特定技术。

在 Java 中,并发和多线程是使用许多内置类和方法实现的。例如,java.util.concurrent 包提供了多种用于管理并发执行的类和接口,例如 Executor 接口,它定义了用于在单独线程中执行任务的标准接口,以及 Executors 类,它提供了许多用于创建具有不同特征的 Executor 类实例的方法。

此外,sync 关键字可用于控制对共享资源的访问并防止多个线程同时访问它们,并且 wait() 和 notify() 方法可用于允许线程等待满足某些条件。

在 Java 中使用多线程和并发时的一些关键注意事项包括:

  • 同步:当多个线程访问共享资源时,同步其访问以防止数据损坏和其他问题非常重要。这可以使用 Java API 提供的同步关键字或其他同步构造来实现。

  • 线程安全:为了确保类是线程安全的,必须以允许多个线程访问和操作它而不会导致任何意外行为的方式设计和实现该类。

  • 死锁:当两个或多个线程相互等待对方释放资源时,可能会发生死锁。这可能会导致整个程序挂起,并且可能难以诊断和修复。

  • 线程池:线程池可用于管理一组可用于执行一组相关任务的工作线程。这有助于提高性能并减少创建和管理线程的开销。

  • 异步编程:异步编程可用于允许多个任务同时执行,而不会阻塞程序的主线程。这有助于提高性能和响应能力,尤其是在涉及 I/O 操作或其他耗时任务的应用程序中。

  • 易失性变量:在某些情况下,由于 Java 缓存变量以提高性能的方式,在多个线程之间共享的变量可能会导致问题。使用 volatile 关键字有助于确保变量始终是最新的,并且在线程之间保持一致。

  • 库中的线程安全:使用第三方库时,请务必考虑它们是否线程安全,并以与其线程安全保证一致的方式使用它们。

  • 调试和测试:多线程程序可能比单线程程序更难调试和测试。重要的是要有良好的测试和调试实践,以便在问题成为严重问题之前捕获和修复问题。

  • 性能调优:与单线程程序相比,多线程程序更难优化性能。仔细分析和性能调整有助于识别可能影响性能的瓶颈和其他问题。

  • 并发实用程序:Java 提供了许多用于处理并发的内置实用程序,例如 Executor 框架,它提供了一种管理线程池和计划任务的方法。

  • 原子变量:在某些情况下,有必要对非原子变量(即不能在单个指令中执行)执行操作。在这些情况下,可以使用原子变量来确保以原子方式执行操作,并且不会发生争用条件。

  • 并发数据结构:Java提供了许多内置的并发数据结构,如ConcurrentHashMap和ConcurrentLinkedQueue,它们旨在用于多线程程序并提供对数据的线程安全访问。

  • 易失性关键字:易失性关键字用于标记可能被多个线程修改的变量。此关键字可确保对变量的任何更改对所有线程可见,这有助于防止过时数据或争用条件等问题。

  • 线程局部变量:线程局部变量是特定线程的局部变量,不与其他线程共享。这对于每个线程都需要自己的特定变量或对象副本的情况很有用。

  • 不可变对象:不可变对象是创建后无法修改的对象。这对于多个线程需要访问同一对象而没有争用条件或其他问题风险的情况非常有用。

  • 线程中断:线程中断是一种机制,可用于向正在运行的线程发出应停止执行的信号。这对于线程正在执行长时间运行或可能阻塞操作并且由于某种原因需要停止的情况非常有用。

  • 执行程序和线程池:执行程序和线程池是 Java 类和工具,它们提供了一种管理和重用线程的方法,这有助于提高性能并减少开销。线程池还可以帮助限制创建的线程数,这可以防止线程不足或资源耗尽等问题。

  • Fork/Join Framework:Fork/Join Framework 是一个用于并行化递归算法的 Java 框架。它提供了一种将任务拆分为较小的子任务的方法,然后组合这些子任务的结果以产生最终结果。这对于需要并行处理大型数据集的情况非常有用。

  • 读/写锁:读/写锁是一种可用于管理对共享资源或数据结构的访问的锁。读锁可以由多个线程同时持有,而写锁是独占的,只能由单个线程持有。这有助于提高并发性,并在多个线程需要读取或写入共享资源的情况下减少争用。

  • 并发集合:并发集合是设计为线程安全并允许多个线程并发访问的集合。这些集合对于多个线程需要访问或修改同一数据结构而无需锁定或同步的情况非常有用。

3. 网络和 I/O

除了多线程和并发之外,Java 还提供了一组丰富的工具和 API,用于处理网络和 I/O。其中包括:

  • Sockets 套接字:套接字是 Java 中网络通信的最基本构建块。它们为进程提供了一种使用 TCP 或 UDP 协议通过网络相互通信的方法。

  • URL 和 URI:URL 和 URI 类提供了一种在 Java 中使用 URL 和 URI 的方法。它们可用于解析、构造和操作 URL,以及通过网络打开与远程资源的连接。

  • 网络 API:Java 提供了一组网络 API,可用于构建复杂的网络应用程序。其中包括用于使用 HTTP、FTP 和其他网络协议的 API。

  • I/O 流:Java 提供了一组 I/O 类,可用于从流、文件和其他源读取和写入数据。这些类包括 FileInputStream、FileOutputStream、DataInputStream 和 DataOutputStream。

  • NIO:NIO(new I/O)API提供了一种在Java中使用非阻塞I/O的方法。这对于构建高性能、可扩展的网络应用程序非常有用。

  • 序列化:Java 提供了一种使用 ObjectOutputStream 和 ObjectInputStream 类序列化和反序列化对象的方法。这对于通过网络传输对象或将它们存储在文件中非常有用。

  • 异步 I/O:Java 提供了一个异步 I/O API,可用于以非阻塞、异步的方式执行 I/O 操作。这对于构建高度可扩展的高性能网络应用程序非常有用。

  • SocketChannel:套接字通道是网络套接字的可选通道。它为套接字通道提供非阻塞模式,允许在不阻塞线程的情况下执行 I/O 操作。

  • DatagramChannel:数据报通道是面向数据报的套接字的可选通道。它为数据报通道提供非阻塞模式,允许在不阻塞线程的情况下执行 I/O 操作。

  • ServerSocketChannel:ServerSocketChannel 是服务器套接字的可选通道。它为服务器套接字通道提供非阻塞模式,允许在不阻塞线程的情况下执行 I/O 操作。

  • Selector:选择器是可选通道对象的多路复用器。它可用于管理多个通道,并在单个线程中对它们执行 I/O 操作。

  • AsynchronousSocketChannel:异步套接字通道是支持网络套接字的异步 I/O 操作的通道。

  • AsynchronousServerSocketChannel:异步服务器套接字通道是支持服务器套接字的异步 I/O 操作的通道。

  • FileChannel:文件通道是支持读取和写入文件的通道。

  • ByteBuffer:ByteBuffer是一个类,它提供了一种以字节形式读取和写入数据的方法。它可以与上述通道结合使用,以实现高效的 I/O 操作。

除了上面提到的 I/O 和网络 API 之外,Java 还提供了几个实用程序类来处理文件、目录、流和其他相关任务。一些常用的实用程序类是:

  • File:File类为文件和目录路径提供抽象。它可用于创建,删除,移动和重命名文件和目录。

  • Path:Path类是一个接口,它提供了一种表示文件或目录路径的方法。它可用于对文件路径执行各种操作,例如解析、相对化和比较路径。

  • FileInputStream 和 FileOutputStream:这些类提供输入和输出流,用于在文件中读取和写入字节。

  • BufferedReader 和 BufferedWriter:这些类提供缓冲流,以有效地从文件读取和写入字符。

  • ZipInputStream 和 ZipOutputStream:这些类提供输入和输出流,用于读取和写入 ZIP 格式的压缩数据。

  • ByteArrayInputStream 和 ByteArrayOutputStream:这些类提供输入和输出流,用于在字节数组中读取和写入字节。

  • ObjectInputStream 和 ObjectOutputStream:这些类提供输入和输出流,用于在流中读取和写入 Java 对象。

这些实用程序类为 Java 中的常见文件和流相关操作提供了方便且易于使用的 API。它们可以与 I/O 和网络 API 结合使用,以构建复杂而高效的应用程序。

Java 提供了多个 API 来处理网络协议和服务,如 HTTP、FTP、SMTP 和 DNS。一些常用的网络 API 包括:

  • java.net 包:此包包含用于网络操作(如创建套接字、连接到服务器、通过网络发送和接收数据以及解析主机名)的类和接口。

  • java.nio 包:此包包含用于非阻塞 I/O 操作的类和接口,可用于构建高性能网络应用程序。

  • java.security 包:此包提供使用 SSL/TLS 协议的安全网络通信的类和接口。

  • javax.xml.ws 包:此包提供用于生成使用 SOAP 协议的 Web 服务和客户端的类和接口。

  • java.rmi 包:此包提供了使用 Java 远程方法调用 (RMI) 技术构建分布式应用程序的类和接口。

Java 提供了多个用于处理 I/O 操作的 API,例如读取和写入文件、访问数据库以及处理流。一些常用的 I/O API 包括:

  • java.io 包:此包包含用于在不同类型的源(如文件、网络连接和内存缓冲区)中读取和写入数据的类和接口。

  • java.nio.file 包:此包提供了用于处理文件和目录的现代 API,包括对符号链接、文件权限和文件属性的支持。

  • java.sql 包:此包提供用于处理关系数据库的类和接口,包括对执行 SQL 语句、管理事务和处理结果集的支持。

  • javax.xml.parsers 包:此包提供用于解析和处理 XML 文档的类和接口。

  • java.util.zip 包:此包提供了用于处理压缩文件和存档(如 ZIP 和 JAR 文件)的类和接口。

下面是一个简单的示例,展示了如何使用 Java 的网络和 I/O 功能来创建简单的客户端-服务器聊天应用程序

首先,让我们创建一个简单的服务器类,该类侦听特定端口上的传入连接并将消息广播到所有连接的客户端

import java.io.*;
import java.net.*;

public class ChatServer {
    public static void main(String[] args) {
        int port = 12345;
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("Chat server started on port " + port);
            while (true) {
                Socket clientSocket = serverSocket.accept();
                System.out.println("New client connected from " + clientSocket.getInetAddress().getHostName());
                Thread clientThread = new Thread(new ClientHandler(clientSocket));
                clientThread.start();
            }
        } catch (IOException ex) {
            System.out.println("Error starting chat server: " + ex.getMessage());
        }
    }

    private static class ClientHandler implements Runnable {
        private Socket clientSocket;
        private BufferedReader in;
        private PrintWriter out;

        public ClientHandler(Socket socket) throws IOException {
            this.clientSocket = socket;
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            out = new PrintWriter(clientSocket.getOutputStream(), true);
        }

        public void run() {
            String message;
            try {
                while ((message = in.readLine()) != null) {
                    System.out.println("Message received from " + clientSocket.getInetAddress().getHostName() + ": " + message);
                    broadcastMessage(message);
                }
            } catch (IOException ex) {
                System.out.println("Error reading from client: " + ex.getMessage());
            } finally {
                try {
                    clientSocket.close();
                } catch (IOException ex) {
                    System.out.println("Error closing client socket: " + ex.getMessage());
                }
            }
        }

        private void broadcastMessage(String message) {
            for (ClientHandler client : ChatServer.getClientHandlers()) {
                client.out.println(message);
            }
        }
    }
}

此服务器侦听端口 12345 上的传入连接,并创建一个新的ClientHandler从客户端读取消息并将其广播到所有连接的客户端。

接下来,让我们创建一个简单的客户端类,该类连接到服务器并允许用户发送聊天消息:

import java.io.*;
import java.net.*;

public class ChatClient {
    public static void main(String[] args) {
        String serverHost = "localhost";
        int serverPort = 12345;
        try (Socket socket = new Socket(serverHost, serverPort);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader consoleIn = new BufferedReader(new InputStreamReader(System.in))) {
            System.out.println("Connected to chat server " + serverHost + " on port " + serverPort);
            while (true) {
                String message = consoleIn.readLine();
                out.println(message);
                System.out.println("Sent message to server: " + message);
                String response = in.readLine();
                System.out.println("Received message from server: " + response);
            }
        } catch (IOException ex) {
            System.out.println("Error communicating with chat server: " + ex.getMessage());
        }
    }
}

此客户端连接到位于“本地主机:123 ”的服务器

4. 反射和动态类加载

Java包括对反射的支持,它允许程序在运行时检查和修改类和对象的结构和行为。反射可用于访问和修改类和对象的字段和方法,以及创建类的新实例、调用方法和检查类层次结构。

Java 还提供了对动态类加载的支持,这允许在运行时根据类的完全限定类名加载和实例化类。动态类装入对于创建可扩展的应用程序以及加载类以响应用户输入或配置文件非常有用。

java.lang.Class 类是 Java 中反射和动态类加载的核心组件。它提供了用于检查类的字段、方法、构造函数和其他成员的方法,以及用于创建类的新实例和获取有关类的继承层次结构和接口的信息的方法。

Java的反射API允许程序在运行时检查和修改类和对象的结构和行为。这在各种情况下都很有用,例如,在编写需要使用编译时未知的类的代码时,或者在编写需要在运行时动态适应不断变化的条件的代码时。

反射 API 提供了一系列方法,可用于检查类、字段、方法和构造函数,以及在运行时调用方法和访问字段。例如,Class 类提供了诸如 getFields()、getMethods() 和 getConstructors() 之类的方法,这些方法可用于获取有关类成员的信息。同样,Field 类提供了 get() 和 set() 等方法,可用于在运行时读取和写入字段的值。

Java 的动态类加载机制允许在运行时根据类的完全限定类名加载和实例化类。这在需要根据用户输入、配置文件或其他动态条件加载类的情况下非常有用。

要在 Java 中动态加载类,通常使用 Class.forName() 方法,将类的完全限定名作为字符串传入。此方法返回可用于检查和实例化类的 Class 对象。一旦你有一个类对象,你可以使用 newInstance() 等方法来创建类的新实例,或者使用 getDeclaredMethods() 来获取有关类的方法的信息。

总的来说,反射和动态类加载是 Java 的强大功能,通过在运行时检查和修改类和对象的行为,程序可以更加灵活和可扩展。但是,如果不小心使用,它们也可能很复杂且有潜在风险,因为它们涉及动态修改正在运行的程序的行为。因此,它们通常用于高级编程场景和经验丰富的 Java 开发人员。

反射提供了一种检查和修改对象和类的内部属性和行为的方法,即使无权访问源代码也是如此。通过反射,可以执行以下任务:

  • 检查类的字段、方法和构造函数
  • 在运行时动态调用方法和构造函数
  • 检查和修改字段值
  • 创建类的新实例
  • 动态类加载是在运行时而不是在编译时加载类的能力。当在运行时之前不知道所需类的名称时,或者当想要根据某些条件动态加载类时,这可能很有用。动态类加载通常用于插件架构,其中应用程序可以在运行时加载新模块或扩展。

Java 提供了许多用于处理反射和动态类加载的类和接口,包括:

  • java.lang.Class:在运行时表示类,并提供用于检查其属性和创建新实例的方法。
  • java.lang.reflect:提供用于处理反射的类和接口的包,包括 、 和 。FieldMethodConstructor
  • java.lang.ClassLoader:提供动态类装入功能的类,还可以通过子类化和覆盖其方法来创建自己的类装入器。动态类加载是 Java 中的一项功能,它使程序能够在运行时加载和使用类,而无需事先知道它们的名称或位置。此功能在创建模块化和可扩展程序(如插件和附加组件)时非常有用。它还使程序能够加载和使用在编译时可能不存在或可用的类。

总体而言,反射和动态类加载是 Java 中的强大功能,使程序能够创建通用、模块化和可扩展的代码。但是,如果使用不当,它们也可能带来安全风险和性能开销。因此,应谨慎使用它们。

下面有一个在 Java 中反射和动态类加载的简单示例:

假设有一个名为"MyClass" 的类,其中包含一个名为"name"的私有字段和一个名为"sayHello" 的公共方法。可以使用反射来访问和修改类的私有字段,如下所示:

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        // Load the class dynamically
        Class<?> clazz = Class.forName("MyClass");

        // Create an instance of the class
        Object obj = clazz.getDeclaredConstructor().newInstance();

        // Access the private field
        Field field = clazz.getDeclaredField("name");
        field.setAccessible(true);
        field.set(obj, "John");

        // Invoke the public method
        Method method = clazz.getDeclaredMethod("sayHello");
        method.invoke(obj);
    }
}

class MyClass {
    private String name;

    public void sayHello() {
        System.out.println("Hello, " + name + "!");
    }
}

在上面的代码中,我们使用Class.forName()方法在运行时动态加载类。然后我们使用MyClassnewInstance()方法创建类的实例。

然后,我们使用反射通过getDeclaredField()方法访问类的私有字段,并使用set()方法设置其值。最后,我们使用getDeclaredMethod()方法访问sayHello()方法,并使用invoke()方法调用它。

此示例演示如何使用反射和动态类加载在运行时访问和修改类的私有字段和方法,这在某些情况下非常有用,例如创建可与实现特定接口或扩展特定类的任何类一起使用的泛型代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java知识大全 - 五、Java高级编程 的相关文章

  • Java 类查找工具

    任何经常使用 Java 的人都知道类路径中的多个 jar 会给我们带来多少麻烦 我正在寻找一个可以帮助我的工具 在 jar 中搜索类文件类路径 在 jar 中搜索类文件具体位置 也许要求太多 但请告诉我同一个类是否存在于多个罐子中 不用说它
  • 使用 BlobOutputStream 在 Azure 中上传 blob

    我正在尝试直接从流上传 blob 因为我不知道我决定尝试的流的长度这个答案 https stackoverflow com a 24621538 3695939 这不起作用 即使它从流中读取并且不会抛出任何异常 内容也不会上传到我的容器 我
  • string.split("(?!^)") 解释

    我正在尝试将字符串的字符拆分为字符串数组 我找到了解决方案here https stackoverflow com questions 5235401 split string into array of character strings
  • Google App Engine 数据存储写入:如何远程启用/禁用只读模式?

    在阅读备份时GAE 的数据存储 https developers google com appengine docs adminconsole datastoreadmin where 我们强烈建议您在备份或恢复期间将应用程序设置为只读模式
  • Java中如何合并两个数组?

    它不是连接而是合并两个数组 使它们成为名称值对的数组 firstarray a aa aaa secondarray b bb bbb result a b aa bb aaa bbb 最好的方法是什么 in Java public sta
  • 将键与多个值对象关联的有效集合[重复]

    这个问题在这里已经有答案了 有任何有效的集合可以将键与多个值关联起来 例如 new HashMap
  • 从SQLite列中获取所有数字字符串并进行总和计算

    我是 Android 和 SQLite 的新手 我在 SQLite 中有一个只有数字的 AMOUNT 列 我可以在 ListView 中显示它 但我无法找到任何我理解的方法来将它们全部添加并显示在 TextView 中 这是数据库助手 im
  • selenium 2.0 中的 isElementPresent

    大家好 我正在使用 webdriver 所以如果我想使用 selenium s rc 函数 isElementPresent 我必须模拟 selenium rc 所以我会执行以下操作 import org openqa selenium B
  • Eclipse 与 IntelliJ 热部署

    我的应用程序配置 Tomcat 8 Spring Spring MVC Hibernate 在 Eclipse 中 我创建了 Tomcat 服务器 并将我的应用程序添加到资源中 JSP JS CSS 和 JAVA 类热部署的工作原理就是这样
  • Java:将二维字符串数组打印为右对齐表格

    是什么best打印a的单元格的方法String 数组作为右对齐表 例如 输入 x xxx yyy y zz zz 应该产生输出 x xxx yyy y zz zz 这似乎是一个should能够完成使用java util Formatter
  • grails 中的 log4j:如何登录文件?

    我的 grails config groovy 中有这个 log4j 配置 log4j error org codehaus groovy grails web servlet controllers org codehaus groovy
  • Java 套接字 - 读和写

    问题 客户端没有收到任何消息 这是客户端和服务器的完整代码 CLIENT public class Client extends Socket public Client String hostName int port throws Un
  • 检查更新时 Maven 无限期挂起

    我正在使用 Maven 构建一个项目 我是新手 并且它挂起 mvn package INFO Scanning for projects INFO INFO Building Presentation Reports INFO task s
  • 无法删除临时文件夹(有时)

    当我启动应用程序时 我创建一个临时文件夹 public static File createTempDir String name throws IOException File tempDir File createTempFile na
  • Tomcat下的Spring CXF Soap Web服务:找不到服务

    我正在尝试使用 CXF 和 Spring 设置一个在 Tomcat 上运行的简单 CXF Web 服务 我有一个 Web 应用程序初始化程序来引导 CXF servlet public class WebAppInitializer ext
  • java charAt() 和startsWith() 哪个更快? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题是 如果我想检查特定索引中字符串的一个字符 仅检查一个字符 哪种方法非常有效charAt or startsWith 我的意思是 据我所
  • 有没有办法删除 JShell 中的导入?

    我正在发现 JShell 并且发现默认添加的导入 jshell gt imports import java io import java math import java net import java nio file import j
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 在 Spark MLlib 上使用 Java 中的 Breeze

    在尝试从Java使用MLlib时 使用微风矩阵运算的正确方法是什么 例如scala 中的乘法很简单 matrix vector 相应的功能在Java中是如何表达的 有一些方法 例如 colon times 可以通过正确的方式调用 breez
  • Selenium Webdriver - 单击多个下拉菜单时出现陈旧元素异常,而 HTML DOM 不会更改

    我尝试自动化一个场景 其中条件是我必须从下拉列表中选择一个选项 然后它旁边有另一个下拉列表 我必须单击下一个下拉列表中的一个选项才能启用按钮 我尝试使用代码 但它仅单击第一个选项 并显示错误为过时的元素引用 元素未附加到页面文档 请帮忙 如

随机推荐

  • 【70】爬楼梯问题求解

    题目描述 思路分析 当阶数为 1 时 解法为 1 当阶数为 2 时 解法为 2 当阶数为 3 时 解法为 3 当阶数为 4 时 解法为 5 很明显可以分析出 一下公式 代码实现 递归法 class Solution public int c
  • MATLAB实现遗传算法求解n维变量函数的最小值问题

    一 问题简述 本文以遗传算法求解30维变量函数的最小值问题举例 式中 且 二 遗传算法概述 遗传算法 genetic algorithm GA 是一种仿效生物界中 物竞天择 适者生存 演化法则的进化算法 将问题参数编码为染色体 利用迭代的方
  • cv2.minAreaRect()

    功能 求出在点集下的最小面积矩形 输入 格式 points array shape n 1 2 解释 其中points是点集 数据类型为ndarray array x1 y1 x2 y2 xn yn 输出 格式 rect tuple x y
  • Centos7 安装 postgreSQL

    谷明科技 专注于大数据和人工智能领域的创新者 PostgreSQL 介绍 PostgreSQL 是一个开源且强大的关系型数据库 且具有多平台扩展能力 不同于传统的关系型数据库 例如mysql sqlserver等 PostgreSQL使用S
  • this调用本类的其他构造器

    Student类 package Java project 1 public class Student private String name private String schoolName public Student public
  • javascript的函数中this指向判断

    前言 最近在写 React 项目 然后补习了下 es6 的 class 发现 实例方法被赋值后 this 指向 undefined 这里对 this 指向作一次总结 一 通过 函数的 调用方式 来判断 this 指向 1 函数名 通过 函数
  • Zero-ETL、大模型和数据工程的未来

    编者按 本文探讨了数据工程领域的未来趋势和挑战 以及其不断变化 甚至经常出现 重塑 的特点 在数据工程领域 大数据的性能 容量提升总是有一定的上限 每一次进步都会带来一定的技术提升 从而提高上限 但是很快我们就能到达这个上限 直到下一次技术
  • 【Bugfix】flutter GetX 使用 Obx 监听 GetxController 时,页面退出 GetxController 无法销毁

    背景 我的页面数据全来自 GetxController 每次进入时需要重置数据 但 GetX 似乎把 GetxController 保留了 下次在进入页面直接复用了之前的数据 导致数据混乱 尝试 一下调用均不能销毁 GetxControll
  • 设置windos电脑开机自动启动chrome浏览器,并且打开指定网页

    需求 web项目设置windos电脑开机自动启动chrome浏览器 打开指定网页地址 并设置为全屏显示 解决 使用windos的bat脚本 设置为开机自启动 代码如下 echo off cd d dp0 title Chrome taskl
  • Unity中UI组件

    一 Canvers 画布组件 Canvers下面是添加Button和Image组件 Rect Transform 1 Position 坐标位置 2 Width Height 高宽尺寸 3 Anchors 锚点 4 Pivot中心点 即UI
  • VRRP和DHCP配置

    1 VRRP术语 2 VRRP工作过程 3 DHCP的优势 4 DHCP的工作原理 1 VRRP术语 VRRP 也即虚拟路由器冗余协议 利用VRRP 一组路由器 同一个LAN中的接口 协同工作 但只有一个处于Master状态 处于该状态的路
  • 7-3 删除字符 (30 分)

    这位更是重量级 输入一个字符串 str 再输入要删除字符 c 大小写不区分 将字符串 str 中出现的所有字符 c 删除 提示 去掉两端的空格 输入格式 在第一行中输入一行字符 在第二行输入待删除的字符 输出格式 在一行中输出删除后的字符串
  • java中String作为参数传递终极解决

    今天我遇到一个问题就是string的传值问题 它虽然是一个引用数据类型 但是却和基本数据类型一样无法被改变 我看到网上的很多解释都很离谱 比如说很多解释说String要看成和Integer一样的包装类 看成 是char 的包装类 所以和其一
  • 快速开始一个 CakePHP project 的 基础/步骤

    请参考 CakePhP cookbook4 0 好的这就是本文和全部与核心 你可以跳出去了 好 正经一点 回来 1 下载xampp php集成环境 2 下载cakephp 框架 查看cookbook中的installation a 若用的x
  • 引进包类

    使用Support Library 支持库 Using the Support Library 负责人 River 完成时间 7月18日 原文链接 http developer android com training basics fra
  • (六)Spring Cloud Alibaba Sentinel(含案例源码、案例解析及软件)

    案例源码gitee地址 https gitee com BanSheng spring cloud alibaba examples tree master sentinel example client Spring Cloud Alib
  • 人工智能技术应用中机器学习里的6种偏差

    在人工智能的学习过程中 偏差会以多种不同的形式出现在机器学习中 Bias的定义 Bias 对某人或某一群体的倾向或偏见 尤指被认为不公平的方式 Bias被解释为偏差也可解释为偏见 其定义包括 不公平 一词 偏差几乎可以在每个阶段影响机器学习
  • msm8953-配置I2C 速率

    前言 本文记录调试高通平台某I2C 器件通讯出现异常 尝试修改I2C 时钟速率时所做的记录 平台 MSM8953 系统 Android 9 0 分类 I2C CLK 结论 先说结论 经过分析以及验证 平台支持的I2C特性如下 默认速度 10
  • eclipse json转为java类

    1 安装GsonFormat插件 插件地址 https github com wenxunyu GsonFormat 安装步骤在上面的地址中有 2 注意 直接放在dropins根目录下 不要放在子文件夹下 否则报错 不能正常使用插件
  • Java知识大全 - 五、Java高级编程

    1 异常和错误处理 在 Java 中 异常用于处理程序执行期间可能发生的错误和其他异常情况 异常允许开发人员以结构化和一致的方式处理错误 从而使代码更加健壮和可靠 发生错误时 Java 会创建一个异常对象 其中包含有关错误的信息 例如错误的