java 批量处理 示例_Java异常处理教程(包含示例和最佳实践)

java 批量处理 示例

异常是可能在程序执行期间发生的错误事件,它会破坏其正常流程。 Java提供了一种健壮且面向对象的方式来处理异常情况,称为Java异常处理 。 我们将在本教程中研究以下主题。

  1. Java异常处理概述
  2. 异常处理关键字
  3. 异常层次
  4. 有用的异常方法
  5. Java 7自动资源管理和捕获块改进
  6. 创建自定义异常类
  7. 异常处理最佳实践

Java异常处理概述

我们不喜欢异常,但是我们总是要处理它们,好消息是Java异常处理框架非常健壮,易于理解和使用。 异常可能源于各种情况,例如用户输入的错误数据,硬件故障,网络连接故障,数据库服务器关闭等。在本节中,我们将学习如何在Java中处理异常。

Java是一种面向对象的编程语言,只要在执行语句时发生错误,就会创建一个异常对象 ,然后程序的正常流程将停止, JRE会尝试寻找可以处理引发异常的人。 异常对象包含许多调试信息,例如方法层次结构,发生异常的行号,异常类型等。当方法中发生异常时,将调用创建异常对象并将其移交给运行时环境的过程。 “抛出异常”

运行时一旦接收到异常对象,它将尝试查找该异常的处理程序。 异常处理程序是可以处理异常对象的代码块。 查找异常处理程序的逻辑很简单–在发生错误的方法中开始搜索,如果找不到合适的处理程序,则转到调用者方法,依此类推。 因此,如果方法调用堆栈为A-> B-> C且方法C中引发了异常,则对适当处理程序的搜索将从C-> B-> A转移。 如果找到合适的异常处理程序,则将异常对象传递给该处理程序以对其进行处理。 据说处理程序正在“捕获异常” 。 如果找不到合适的异常处理程序,则程序将终止有关异常的打印信息。

请注意,Java异常处理是仅用于处理运行时错误的框架,异常处理框架不处理编译时错误。

我们在Java程序中使用特定的关键字来创建异常处理程序块,接下来我们将研究这些关键字。

异常处理关键字

Java提供了用于异常处理目的的特定关键字,我们将首先照顾它们,然后编写一个简单的程序,展示如何使用它们进行异常处理。

  1. throw –我们知道,如果发生任何异常,将创建一个异常对象,然后Java运行时开始处理以处理它们。 有时我们可能想在代码中显式生成异常,例如,在用户身份验证程序中,如果密码为null,则应向客户端抛出异常。 throw关键字用于向运行时抛出异常以对其进行处理。
  2. throws –当我们在方法中抛出任何异常而不对其进行处理时,我们需要在方法签名中使用throws关键字,以使调用方程序知道该方法可能抛出的异常。 调用方方法可以处理这些异常,也可以使用throws关键字将其传播到其调用方方法。 我们可以在throws子句中提供多个异常,它也可以与main()方法一起使用。
  3. try-catch –我们在代码中使用try-catch块进行异常处理。 try是块的开始,catch是try块的末尾,用于处理异常。 我们可以使用try捕获多个catch块,并且try-catch块也可以嵌套。 catch块需要一个应为Exception类型的参数。
  4. 最终 –最终块是可选的,只能与try-catch块一起使用。 由于异常会暂停执行过程,因此我们可能会打开一些不会关闭的资源,因此我们可以使用finally块。 无论是否发生异常,finally块都会始终执行。

让我们看一个简单的程序,显示Java中的异常处理。

package com.journaldev.exceptions;import java.io.FileNotFoundException;
import java.io.IOException;public class ExceptionHandling {public static void main(String[] args) throws FileNotFoundException, IOException {try{testException(-5);testException(-10);}catch(FileNotFoundException e){e.printStackTrace();}catch(IOException e){e.printStackTrace();}finally{System.out.println("Releasing resources");			}testException(15);}public static void testException(int i) throws FileNotFoundException, IOException{if(i < 0){FileNotFoundException myException = new FileNotFoundException("Negative Integer "+i);throw myException;}else if(i > 10){throw new IOException("Only supported for index 0 to 10");}}}

上面程序的输出是:

java.io.FileNotFoundException: Negative Integer -5at com.journaldev.exceptions.ExceptionHandling.testException(ExceptionHandling.java:24)at com.journaldev.exceptions.ExceptionHandling.main(ExceptionHandling.java:10)
Releasing resources
Exception in thread "main" java.io.IOException: Only supported for index 0 to 10at com.journaldev.exceptions.ExceptionHandling.testException(ExceptionHandling.java:27)at com.journaldev.exceptions.ExceptionHandling.main(ExceptionHandling.java:19)

请注意,testException()方法使用throw关键字引发异常,方法签名使用throws关键字告知调用方它可能引发的异常类型。 在main()方法中,我正在使用main()方法中的try-catch块来处理异常,当我不处理它时,我将通过main方法中的throws子句将其传播到运行时。 请注意, testException(-10)永远不会因为异常而执行,然后在try-catch块执行后再执行finally块。 printStackTrace()是Exception类中的一种有用方法,用于调试目的。

  • 没有try语句,我们不能有catch或finally子句。
  • 一个try语句应该具有catch块或finally块,它可以同时具有两个块。
  • 我们不能在try-catch-finally块之间编写任何代码。
  • 一个try语句可以包含多个catch块。
  • try-catch块可以类似于if-else语句进行嵌套。
  • 我们只有一个带有try-catch语句的finally块。

异常层次

如前所述,当引发任何异常时,将创建一个异常对象 。 Java异常是分层的, 继承用于对不同类型的异常进行分类。 Throwable是Java异常层次结构的父类,它具有两个子对象–错误和异常。 异常进一步分为检查异常和运行时异常。

  1. 错误 :错误是超出应用程序范围的特殊情况,无法预见并从中恢复,例如硬件故障,JVM崩溃或内存不足错误。 这就是为什么我们有一个单独的错误层次结构,并且我们不应该尝试处理这些情况。 一些常见的错误是OutOfMemoryError和StackOverflowError。
  2. 检查异常 :检查异常是我们可以在程序中预期并尝试从程序中恢复的异常情况,例如FileNotFoundException。 我们应该捕获此异常,并向用户提供有用的消息,并正确记录它以进行调试。 Exception是所有Checked Exceptions的父类,如果要抛出一个Checked异常,则必须在同一方法中捕获它,否则必须使用throws关键字将其传播给调用方。
  3. 运行时异常 :运行时异常是由不良编程引起的,例如,尝试从数组中检索元素。 在尝试检索元素之前,我们应该首先检查数组的长度,否则它可能会在运行时引发ArrayIndexOutOfBoundException 。 RuntimeException是所有运行时异常的父类。 如果我们在方法中引发任何运行时异常,则无需在方法签名throws子句中指定它们。 更好的编程可以避免运行时异常。

例外层次

有用的异常方法

异常及其所有子类均未提供任何特定方法,并且所有方法均在基类Throwable中定义。 创建异常类是为了指定不同类型的异常情况,以便我们可以轻松识别根本原因并根据异常类型进行处理。 Throwable类实现Serializable接口以实现互操作性。

Throwable类的一些有用方法是;

  1. public String getMessage() –此方法返回Throwable消息字符串,并且可以在通过其构造函数创建异常时提供该消息。
  2. public String getLocalizedMessage() –提供此方法,以便子类可以重写它以向调用程序提供特定于语言环境的消息。 此方法的可抛出类实现仅使用getMessage()方法即可返回异常消息。
  3. 公共同步Throwable getCause() –此方法返回异常的原因,或者返回null id,原因未知。
  4. public String toString() –此方法以String格式返回有关Throwable的信息,返回的String包含Throwable类的名称和本地化消息。
  5. public void printStackTrace() –此方法将堆栈跟踪信息打印到标准错误流,此方法已重载,我们可以传递PrintStream或PrintWriter作为参数,以将堆栈跟踪信息写入文件或流。

Java 7自动资源管理和捕获块改进

如果您在单个try块中捕获了很多异常,则您会注意到catch块代码看起来非常丑陋,并且主要由用于记录错误的冗余代码组成,请记住,Java 7的功能之一是改进了catch块,我们可以在单个catch块中捕获多个异常。 具有此功能的catch块如下所示:

catch(IOException | SQLException | Exception ex){logger.error(ex);throw new MyException(ex.getMessage());
}

存在一些约束,例如异常对象是最终对象,我们无法在catch块内对其进行修改,请在Java 7 Catch Block Improvements上阅读完整的分析。

在大多数情况下,我们使用finally块只是为了关闭资源,有时我们忘记关闭它们并在资源耗尽时获取运行时异常。 这些异常很难调试,我们可能需要调查使用该类型资源的每个位置,以确保将其关闭。 因此,java 7的改进之一是try-with-resources,我们可以在try语句本身中创建资源,并在try-catch块内使用它。 当执行从try-catch块执行时,运行时环境会自动关闭这些资源。 具有这种改进的try-catch块示例为:

try (MyResource mr = new MyResource()) {System.out.println("MyResource created in try-with-resources");} catch (Exception e) {e.printStackTrace();}

在Java 7自动资源管理中阅读有关此功能的详细说明。

创建自定义异常类

Java提供了许多异常类供我们使用,但有时我们可能需要创建自己的自定义异常类,以通过适当的消息以及我们要引入以进行跟踪的任何自定义字段(例如错误代码)来通知调用者有关特定类型的异常的信息。 。 例如,假设我们编写了一种仅处理文本文件的方法,因此当某些其他类型的文件作为输入发送时,我们可以为调用者提供适当的错误代码。

这是自定义异常类的示例,并显示了其用法。

MyException.java

package com.journaldev.exceptions;public class MyException extends Exception {private static final long serialVersionUID = 4664456874499611218L;private String errorCode="Unknown_Exception";public MyException(String message, String errorCode){super(message);this.errorCode=errorCode;}public String getErrorCode(){return this.errorCode;}}

CustomExceptionExample.java

package com.journaldev.exceptions;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;public class CustomExceptionExample {public static void main(String[] args) throws MyException {try {processFile("file.txt");} catch (MyException e) {processErrorCodes(e);}}private static void processErrorCodes(MyException e) throws MyException {switch(e.getErrorCode()){case "BAD_FILE_TYPE":System.out.println("Bad File Type, notify user");throw e;case "FILE_NOT_FOUND_EXCEPTION":System.out.println("File Not Found, notify user");throw e;case "FILE_CLOSE_EXCEPTION":System.out.println("File Close failed, just log it.");break;default:System.out.println("Unknown exception occured, lets log it for further debugging."+e.getMessage());e.printStackTrace();}}private static void processFile(String file) throws MyException {		InputStream fis = null;try {fis = new FileInputStream(file);} catch (FileNotFoundException e) {throw new MyException(e.getMessage(),"FILE_NOT_FOUND_EXCEPTION");}finally{try {if(fis !=null)fis.close();} catch (IOException e) {throw new MyException(e.getMessage(),"FILE_CLOSE_EXCEPTION");}}}}

请注意,我们可以有一个单独的方法来处理从不同方法中获取的不同类型的错误代码,其中一些被消耗掉是因为我们可能不想为此通知用户,或者其中一些我们将返回以通知用户有关错误代码。问题。

在这里,我扩展了Exception,以便每当产生此异常时,都必须在方法中对其进行处理或将其返回给调用程序,如果我们扩展RuntimeException,则无需在throws子句中指定它。 这是一个设计决策,但是我始终喜欢检查异常,因为我知道调用任何方法并采取适当的措施来处理它们时可以得到哪些异常。

异常处理最佳实践

  1. 使用特定的异常 -异常层次结构的基类没有提供任何有用的信息,这就是Java具有如此多的异常类的原因,例如IOException以及诸如FileNotFoundException,EOFException等其他子类。我们应该始终抛出并捕获特定的异常类,因此该调用者将很容易知道异常的根本原因并进行处理。 这使调试变得容易,并帮助客户端应用程序适当地处理异常。
  2. 尽早抛出或失败 -我们应该尽早抛出异常。 考虑上面的processFile()方法,如果将null参数传递给此方法,则会得到以下异常。
    Exception in thread "main" java.lang.NullPointerExceptionat java.io.FileInputStream.<init>(FileInputStream.java:134)at java.io.FileInputStream.<init>(FileInputStream.java:97)at com.journaldev.exceptions.CustomExceptionExample.processFile(CustomExceptionExample.java:42)at com.journaldev.exceptions.CustomExceptionExample.main(CustomExceptionExample.java:12)

    在调试时,我们将必须仔细查看堆栈跟踪,以识别异常的实际位置。 如果我们更改实现逻辑以如下所述检查这些异常;

    private static void processFile(String file) throws MyException {if(file == null) throw new MyException("File name can't be null", "NULL_FILE_NAME");
    //further processing
    }

    然后,异常堆栈跟踪将如下所示,以清晰的消息清楚地显示异常发生的位置。

    com.journaldev.exceptions.MyException: File name can't be nullat com.journaldev.exceptions.CustomExceptionExample.processFile(CustomExceptionExample.java:37)at com.journaldev.exceptions.CustomExceptionExample.main(CustomExceptionExample.java:12)
  3. 延迟捕获 -由于Java强制处理已检查的异常或在方法签名中声明它,因此有时开发人员倾向于捕获异常并记录错误。 但是这种做法是有害的,因为调用程序不会收到有关该异常的任何通知。 仅当我们可以适当地处理异常时,才应捕获异常。 例如,在上述方法中,我将异常抛出给调用方方法以进行处理。 可能希望以不同方式处理异常的其他应用程序可以使用相同的方法。 在实现任何功能时,我们应始终将异常抛出给调用者,并让他们决定如何处理它。
  4. 关闭资源 –由于异常会中断程序的处理,因此我们应在finally块中关闭所有资源,或使用Java 7 try-with-resources增强功能让Java运行时为您关闭它。
  5. 记录异常 –我们应始终记录异常消息,并在抛出异常时提供清晰的消息,以便调用者可以轻松知道发生异常的原因。 我们应该始终避免空的catch块,它只​​会消耗异常,并且不会为调试提供任何有意义的异常细节。
  6. 用于多个异常的单个catch块 –大多数时候,我们记录异常详细信息并向用户提供消息,在这种情况下,我们应该使用Java 7功能在单个catch块中处理多个异常。 这种方法将减少我们的代码大小,并且看起来也会更干净。
  7. 使用自定义异常 –最好在设计时定义异常处理策略,而不是抛出并捕获多个异常,我们可以使用错误代码创建自定义异常,并且调用程序可以处理这些错误代码。 创建实用程序方法来处理不同的错误代码并使用它也是一个好主意。
  8. 命名约定和打包 –创建自定义异常时,请确保它以Exception结尾,以便从名称本身就可以清楚看出它是一个异常。 还要确保像在JDK中一样包装它们,例如IOException是所有IO操作的基本异常。
  9. 明智地使用异常 –异常代价高昂,有时甚至根本不需要引发异常,我们可以向调用者程序返回一个布尔变量,以指示操作是否成功。 如果操作是可选的,并且您不希望程序由于失败而卡住,则这很有用。 例如,在从第三方Web服务更新数据库中的股票报价时,如果连接失败,我们可能希望避免引发异常。
  10. 记录抛出的异常 –使用javadoc @throws明确指定方法抛出的异常,当您提供要使用的其他应用程序的接口时,这将非常有用。

这就是Java中异常处理的全部,希望您喜欢它并从中学到一些东西。

参考: Java异常处理教程,包括我们的JCG合作伙伴 Pankaj Kumar的示例和最佳实践 ,位于Developer Recipes博客上。

翻译自: https://www.javacodegeeks.com/2013/07/java-exception-handling-tutorial-with-examples-and-best-practices.html

java 批量处理 示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java德才论宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之 小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若

题目描述&#xff1a; 宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”&#xff1a;“是故才德全尽谓之圣人&#xff0c;才德兼亡谓之愚人&#xff0c;德胜才谓之君子&#xff0c;才胜德谓之小人。凡取人之术&#xff0c;苟不得圣人&#xff0c;君子而与之&#xff0c…

Windows编程之多媒体

一、语音接口的使用: 第一步&#xff0c;安装MSSpeech SDK。 MSSpeech SDK可从网络课堂安装&#xff0c;也可在微软公司直接下载&#xff0c;安装完毕后具有了语音处理能力。 安装过程全选默认即可。 安装完毕后&#xff0c;在开始菜单中会增加MS Speech SDK 5.1&#xff0…

Java的@Serial批注

JDK可能正在使用JDK 11 &#xff1a; Serial获得另一个标准&#xff08;预定义&#xff09;注释 。 JDK-8202385 [“标记与序列相关的字段和方法的注释”]的目的是添加“某种“ SerialRelated”注释&#xff0c;以促进对序列字段和方法的声明的自动检查。” 这种想法是为了更好…

Java部分A+B正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。现给定A、DA

题目描述&#xff1a; 正整数A的“DA&#xff08;为1位整数&#xff09;部分”定义为由A中所有DA组成的新整数PA。例如&#xff1a;给定A 3862767&#xff0c;DA 6&#xff0c;则A的“6部分”PA是66&#xff0c;因为A中有2个6。现给定A、DA、B、DB&#xff0c;请编写程序计算…

Windows编程之调用Matlab

一、选择matlab&#xff1a; 注意。Matlab的安装需要较长时间&#xff0c;建议本拓展在同学们自己的电脑上运行。 Matlab是大多数工科学生必修的科目&#xff0c;是一个口碑极佳的数学计算工具&#xff0c;可以支持立即运算和程序设计两种形式。Matlab较新的版本均提供32位版本…

JavaA除以B本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

题目描述&#xff1a; 本题要求计算A/B&#xff0c;其中A是不超过1000位的正整数&#xff0c;B是1位正整数。你需要输出商数Q和余数R&#xff0c;使得A B * Q R成立。 输入描述: 输入在1行中依次给出A和B&#xff0c;中间以1空格分隔。 输出描述: 在1行中依次输出Q和R&…

Windows编程之使用外部动态链接库——纸牌

C语言功能强大的一个重要原因是因为具有丰富的库函数&#xff0c;例如字符串处理有string库&#xff0c;数学处理有math库。微软公司对程序库的支持又更进一步&#xff0c;提供了丰富的动态链接库。下面以微软操作系统内嵌的纸牌链接库为例写一个简单的小程序。 由于我们已经较…

netbeans7.4_使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试

netbeans7.4在上一篇文章中 &#xff0c;我写了NetBeans 7.4 beta中提供的提示 &#xff0c;这些提示提高了开发人员避免Java异常处理带来的讨厌的运行时问题的能力。 在本文中&#xff0c;我将探讨如何使用NetBeans 7.4 beta提供的另外两个提示使单元测试在执行单元测试期间更…

Java锤子剪刀布大家应该都会玩“锤子剪刀布”的游戏: 现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

题目描述&#xff1a; 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;现给出两人的交锋记录&#xff0c;请统计双方的胜、平、负次数&#xff0c;并且给出双方分别出什么手势的胜算最大。 输入描述: 输入第1行给出正整数N&#xff08;<105&#xff09;&#xff0c;即双方…

【MATLAB函数系列】fskmod函数参数及源代码详解

关注回复【fskmod】可看 在用matlab仿真生成fsk信号时&#xff0c;发现matlab库提供fskmod函数可以直接生成fsk信号&#xff0c;但生成的信号为复信号&#xff0c;于是查看其源码&#xff0c;结果对其原理看了好久都没明白&#xff0c;在网上查询资料也少得可怜&#xff0c;唯一…

Java数字黑洞给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到 一个新的数字。一直重复这样做,我们很快会停在有“数字

题目描述&#xff1a; 给定任一个各位数字不完全相同的4位正整数&#xff0c;如果我们先把4个数字按非递增排序&#xff0c;再按非递减排序&#xff0c;然后用第1个数字减第2个数字&#xff0c;将得到 一个新的数字。一直重复这样做&#xff0c;我们很快会停在有“数字黑洞”之…

Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法

LDAP身份验证是全球范围内最流行的企业应用程序身份验证机制之一&#xff0c;而Active Directory &#xff08;Microsoft针对Windows的LDAP实现&#xff09;是另一种广泛使用的LDAP服务器。 在许多项目中&#xff0c;我们需要通过登录屏幕中提供的凭据使用LDAP对活动目录进行身…

C语言文件读写操作之换行符处理

getc&#xff0c;fgetc&#xff1a; -1代表结束符&#xff0c;不但能接收键盘输入的内容&#xff0c;也能从文件中读取一个字符&#xff1b; getchar() 等价于 getc(stdin); putc,fputc: putchar© 等价于 putc(c,stdout); 文件操作 t模式 与 b模式&#xff1a; windo…

Java月饼月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需 求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一

题目描述&#xff1a; 月饼是中国人在中秋佳节时吃的一种传统食品&#xff0c;不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量&#xff0c;请你计算可以获得的最大收益是多少。 注意&#xff1a;销售时允许取出一部分库存。样例给出…

【各种信噪比联系与区别详解】实信号、复信号Es、N0、符号信噪比EsN0、带内信噪比、比特信噪比EbN0、SNR的含义及关系详解

引言 关于EsN0、EbN0与SNR三者关系的描述,在MATLAB帮助文档中搜索词条“AWGN Channel”有比较详细的描述,但有些细节没有讲清楚。 简单翻译解释一下,就是 SNR表示每个采样点的信号噪声比。EbN0表示每个比特能量与噪声功率谱密度的比值。EsN0表示每个符号能量与噪声功率谱密…

非科班Java尝试全国高校计算机能力挑战赛第三届计挑赛

写在前面&#xff1a;①大佬勿在意&#xff0c;小打小闹&#xff01;②若不决参加与否&#xff0c;希望下文可以给你帮助&#xff08;仅限程序设计赛项&#xff09;。 文章目录一、个人真实情况二、比赛最细简介三、最全参赛准备四、比赛时候遇到不会做怎么办&#xff1f;一、个…

加密数据的检索_透明地持久保存并从数据库中检索加密的数据

加密数据的检索自从我在这里发表上一个帖子以来已经有两个多月了&#xff0c;但是今年六月和七月非常忙碌而密集。 首先&#xff0c; Confitura的组织&#xff08;欧洲最大的Java开发人员免费会议&#xff09;参加了我所有的免费晚会&#xff0c;然后在相当紧张的住院期间&…

微信小程序云开发日记类日记记录分享动态

微信公众号&#xff1a;创享日记&#xff08;微信号csds992022&#xff09; 发送关键词&#xff1a;日记类小程序 免费获取源码 1 概述 1.1 关于本手册 为了使您对研岸日记记录社交软件的使用有清晰详尽的了解&#xff0c;特此编写《用户手册》&#xff0c;为了保障您的利益&a…

使用Arquillian(远程)测试OpenLiberty

听到许多好评后&#xff0c;我想我会尝试一下Open Liberty 。 在这篇文章中&#xff0c;我将讨论以下内容&#xff1a; 开放自由的设置 设置JDBC连接 设置Arquillian 测试REST端点 安装开放自由 在撰写本文时&#xff0c;我正在使用Open Liberty 18.0.0.1&#xff0c;并且…

Windows编程初步(三)【说明:有敏感字眼已全删,不知道为啥还审核不通过】

第三节 设计输出及利用在线帮助 在Windows中&#xff0c;消息ON_PAINT是专门用来处理输出的。基本所有的输出代码应放在这里。 。其输出方式不再限于从上往下&#xff0c;而是全屏可控&#xff0c;因此每个输出都需要告知系统输出位置。典型的文字输出代码是TextOut函数。 将…