提交 facc6bd5 编写于 作者: W wizardforcel

2020-06-13 10:48:07

上级 37cdaaf2
......@@ -50,7 +50,7 @@ Java 中的异常层次结构
#### 非受检的异常
这些是不需要在`throws`子句中声明的异常。 JVM 不会强迫您处理它们,因为它们大多数是由于程序错误在运行时生成的。 它们扩展了`RuntimeException`。 最常见的示例是`NullPointerException`(很吓人。不是吗?)。 非受检的异常可能不应该重试,正确的操作通常应该是什么也不做,然后让它从方法中出来并通过执行栈。 在高级别执行时,应记录此类异常。
这些是不需要在`throws`子句中声明的异常。 JVM 不会强迫您处理它们,因为它们大多数是由于程序错误在运行时生成的。 它们扩展了`RuntimeException`。 最常见的示例是`NullPointerException`(很吓人。不是吗?)。 非受检的异常可能不应该重试,正确的操作通常应该是什么也不做,然后让它从方法中出来并通过执行栈。 在高级别执行时,应记录此类异常。
#### 错误
......@@ -75,7 +75,7 @@ Java 中的异常层次结构
}
```
包装异常可以通过添加您自己的消息/上下文信息来向用户提供额外的信息,同时仍保留原始异常的栈跟踪和消息。 它还允许您隐藏代码的实现细节,这是包装异常的最重要原因。
包装异常可以通过添加您自己的消息/上下文信息来向用户提供额外的信息,同时仍保留原始异常的栈跟踪和消息。 它还允许您隐藏代码的实现细节,这是包装异常的最重要原因。
现在让我们开始探索在异常处理方面明智的最佳实践。
......@@ -125,7 +125,7 @@ try {
好吧,这是更严重的麻烦了。 因为 Java 错误也是`Throwable`的子类。 错误是不可逆的条件,JVM 本身无法处理。 对于某些 JVM 实现,JVM 甚至可能实际上不会在`Error`上调用您的`catch`子句。
#### 3.5 始终正确地将异常包装在自定义异常中,以便不会丢失栈跟踪
#### 3.5 始终正确地将异常包装在自定义异常中,以便不会丢失栈跟踪
```java
catch (NoSuchMethodException e) {
......@@ -134,7 +134,7 @@ catch (NoSuchMethodException e) {
```
这破坏了原始异常的栈跟踪,并且总是错误的。 正确的方法是:
这破坏了原始异常的栈跟踪,并且总是错误的。 正确的方法是:
```java
catch (NoSuchMethodException e) {
......@@ -181,7 +181,7 @@ catch (NoSuchMethodException e) {
#### 3.9 不要使用`printStackTrace()`语句或类似方法
完成代码后,切勿离开`printStackTrace()`。 很有可能是您的同事之一,最终将获得这些栈跟踪中的一个,并且对如何处理它的知识完全为零,因为它不会附加任何上下文信息。
完成代码后,切勿离开`printStackTrace()`。 很有可能是您的同事之一,最终将获得这些栈跟踪中的一个,并且对如何处理它的知识完全为零,因为它不会附加任何上下文信息。
#### 3.10 如果您不打算处理异常,请使用`finally`块而不是`catch`块
......@@ -200,7 +200,7 @@ try {
这可能是有关异常处理的最著名的原理。 它基本上说您应该尽快抛出异常,并尽可能晚地捕获它。 您应该等待,直到掌握了正确处理所有信息为止。
该原则隐含地表明,您将更有可能将其扔到低级方法中,在这种方法中,您将检查单个值是否为`null`或不合适。 并且您将使异常爬升到栈跟踪相当多个级别,直到达到足够的抽象级别以能够解决问题为止。
该原则隐含地表明,您将更有可能将其扔到低级方法中,在这种方法中,您将检查单个值是否为`null`或不合适。 并且您将使异常爬升到栈跟踪相当多个级别,直到达到足够的抽象级别以能够解决问题为止。
#### 3.12 处理异常后请务必清理
......@@ -253,7 +253,7 @@ LOGGER.debug("Using cache sector A, using retry sector B");
#### 3.17 将所有相关信息传递给异常,以使它们尽可能多地提供信息
这对于使异常消息和栈跟踪有用和提供信息也非常重要。 如果您无法从中确定任何内容,则日志的用途是什么。 这些类型的日志仅存在于您的代码中用于装饰。
这对于使异常消息和栈跟踪有用和提供信息也非常重要。 如果您无法从中确定任何内容,则日志的用途是什么。 这些类型的日志仅存在于您的代码中用于装饰。
#### 3.18 总是终止被中断的线程
......
......@@ -101,7 +101,7 @@ randomTuple[0] = 0 # TypeError: 'tuple' object does not support item assignment
**字典**或字典是项的键值对的**有序集合**。 键可以保存任何原始数据类型,而值是任意的 Python 对象。
字典中的目用逗号分隔并括在花括号`{, }`中。
字典中的目用逗号分隔并括在花括号`{, }`中。
```py
charsMap = {1:'a', 2:'b', 3:'c', 4:'d'};
......
......@@ -4,7 +4,7 @@
## 1.什么是优先队列
* [优先级队列](https://en.wikipedia.org/wiki/Priority_queue)是一种抽象数据类型,类似于常规队列或栈数据结构,但每个元素还具有与之关联的“优先级”。
* [优先级队列](https://en.wikipedia.org/wiki/Priority_queue)是一种抽象数据类型,类似于常规队列或栈数据结构,但每个元素还具有与之关联的“优先级”。
* 在优先级队列中,优先级高的元素先于优先级低的元素提供。
* 如果两个元素具有相同的优先级,则将根据它们在队列中的顺序为其提供服务。
......
# [已解决]无法找到 ref-name 引用的拦截器类
# [已解决] 无法找到`ref-name`引用的拦截器类
> 原文: [https://howtodoinjava.com/struts2/solved-unable-to-find-interceptor-class-referenced-by-ref-name/](https://howtodoinjava.com/struts2/solved-unable-to-find-interceptor-class-referenced-by-ref-name/)
在为 [**@InterceptorRef 示例**](//howtodoinjava.com/struts-2/struts-2-custom-interceptor-with-interceptorref-example/ "Struts2 custom interceptor with @InterceptorRef example") 编写代码时,我才知道此功能。 我必须在 struts.xml 文件中声明拦截器定义,而我想通过注释使用拦截器。 第一次尝试时,失败并显示以下错误:
在为[**`@InterceptorRef`示例**](//howtodoinjava.com/struts-2/struts-2-custom-interceptor-with-interceptorref-example/ "Struts2 custom interceptor with @InterceptorRef example")编写代码时,我才知道此功能。 我必须在`struts.xml`文件中声明拦截器定义,而我想通过注释使用拦截器。 第一次尝试时,失败并显示以下错误:
```java
Unable to load configuration. - [unknown location]
......@@ -19,11 +19,11 @@ Caused by: Unable to find interceptor class referenced by ref-name customStack -
## 原因:
默认情况下,Convention 插件使用其自己的包 Convention-default,其中不包含您在 struts.xml 中定义的包。 这意味着 Convention 将在其中放置您的操作的包不会扩展定义拦截器的包。
默认情况下,`Convention`插件使用其自己的包`Convention-default`,其中不包含您在`struts.xml`中定义的包。 这意味着`Convention`将在其中放置您的操作的包不会扩展定义拦截器的包。
![Random exceptions](img/bfcee52d8f51b09dd5024f261008e635.png)
Random exceptions
随机异常
......@@ -31,8 +31,9 @@ Random exceptions
要更改,您有两个选择:
1) Use of `@ParentPackage` annotation
2) Define <constant name=”struts.convention.default.parent.package” value=”default”/ > in struts.xml
1) 使用`@ParentPackage`注解
2) 在`struts.xml`中定义`<constant name=”struts.convention.default.parent.package” value=”default”/ >`
例如:
......
# [已解决]:找不到扩展名[属性]或[xml]的结果类型
# [已解决]:找不到扩展名`properties`或`xml`的结果类型
> 原文: [https://howtodoinjava.com/struts2/solved-unable-to-find-a-result-type-for-extension-properties-or-xml/](https://howtodoinjava.com/struts2/solved-unable-to-find-a-result-type-for-extension-properties-or-xml/)
如果您刚刚开始编写 Struts2 应用,并且正在配置它,那么您可能会遇到此异常。 完整的栈跟踪如下所示:
如果您刚刚开始编写 Struts2 应用,并且正在配置它,那么您可能会遇到此异常。 完整的栈跟踪如下所示:
```java
SEVERE: Dispatcher initialization failed
......@@ -84,7 +84,7 @@ at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(Configur
## 解决方案
出现此异常是因为为属性“ struts.convention.result.path” 配置了**错误的路径,该路径通常如下所示:**
出现此异常是因为为属性“`struts.convention.result.path`” 配置了**错误的路径**,该路径通常如下所示:
```java
<constant name="struts.convention.result.path" value="/" />
......
# 使用数组的 Java 栈实现
# 使用数组的 Java 栈实现
> 原文: [https://howtodoinjava.com/data-structure/java-stack-implementation-array/](https://howtodoinjava.com/data-structure/java-stack-implementation-array/)
本教程给出了**使用数组**实现[堆栈](https://en.wikipedia.org/wiki/Stack_(abstract_data_type))数据结构的示例。 堆栈提供了将新对象放入堆栈(方法 push())并从堆栈中获取对象(方法 pop())。 堆栈根据后进先出(LIFO)返回对象。 请注意,JDK 提供了默认的 Java 堆栈实现作为类`java.util.Stack`
本教程给出了**使用数组**实现[](https://en.wikipedia.org/wiki/Stack_(abstract_data_type))数据结构的示例。 栈提供了将新对象放入栈(方法`push()`)并从栈中获取对象(方法`pop()`)。 栈根据后进先出(LIFO)返回对象。 请注意,JDK 提供了默认的 Java 栈实现作为类`java.util.Stack`
适用于所有栈实现的两个强制操作是:
适用于所有栈实现的两个强制操作是:
* **push()**:将数据项放置在堆栈指针指向的位置。
* **pop()**:在其中删除数据项并从堆栈指针指向的位置返回该数据项。
* **`push()`**:将数据项放置在栈指针指向的位置。
* **`pop()`**:在其中删除数据项并从栈指针指向的位置返回该数据项。
某些严重依赖栈的环境可能会根据要求提供其他操作。 Stack 最常见的用法是表达式求值和语法解析。 您也可以在文本处理器的撤消/重做操作中找到它们。
某些严重依赖栈的环境可能会根据要求提供其他操作。 Stack 最常见的用法是表达式求值和语法解析。 您也可以在文本处理器的撤消/重做操作中找到它们。
## Java Stack 实现源代码
## Java 实现源代码
下面的程序是 Stack 数据结构的示例实现。 可以根据需要随意修改源代码。
下面的程序是数据结构的示例实现。 可以根据需要随意修改源代码。
```java
package com.howtodoinjava.datastructure;
......@@ -67,7 +67,7 @@ public class CustomStack <E>
```
现在,通过从堆栈中推送和弹出一些条目来测试我们的堆栈实现。
现在,通过从栈中推送和弹出一些项目来测试我们的栈实现。
```java
public class Main
......@@ -103,6 +103,6 @@ Output:
[10]
```
这就是有关 **Java 栈实现**示例的简单但重要的概念。
这就是有关 **Java 栈实现**示例的简单但重要的概念。
学习愉快!
\ No newline at end of file
......@@ -2,11 +2,11 @@
> 原文: [https://howtodoinjava.com/data-structure/list-implementation-example-in-java/](https://howtodoinjava.com/data-structure/list-implementation-example-in-java/)
在本教程中,我将给出 Java 中 List 的示例**实现。 通过在`DemoList`类中添加或删除方法,可以随意自定义列表的行为。 如果您有一些想法可以改善此实现,请与我们分享。**
在本教程中,我将给出 Java 中`List`的示例**实现**。 通过在`DemoList`类中添加或删除方法,可以随意自定义列表的行为。 如果您有一些想法可以改善此实现,请与我们分享。
## Java 列表实现示例
在此类`DemoList.java`中,我们将创建具有以下功能的 List 实现:
在此类`DemoList.java`中,我们将创建具有以下功能的`List`实现:
* 列表可能会从零增长到无限大小(至少在理论上是这样)。
* 创建列表时,将使用最少 10 个元素初始化列表。
......@@ -94,7 +94,7 @@ public class DataList<E>
```
让我们快速测试一下 List 的实现。
让我们快速测试一下`List`的实现。
```java
package com.howtodoinjava.datastructure;
......
......@@ -30,6 +30,6 @@ System.out.println(map.put("test key 4", "test value 4"));
首次添加“测试键 4”时,它在映射中不存在,因此映射返回值是 null。
下次存储“测试键 4”时,该时间目已经存在,因此将值返回为“测试值 4”
下次存储“测试键 4”时,该时间目已经存在,因此将值返回为“测试值 4”
**祝您学习愉快!**
\ No newline at end of file
......@@ -26,7 +26,7 @@ Reverse String -> moc.avaJnIoDoTwoH
## Java 程序通过单词反转字符串
**通过单词**反转字符串内容时,最自然的方法是使用`StringTokenizer``Stack`。 如您所知,`Stack`是一个实现易于使用的**后进先出(LIFO)**对象栈的类。
**通过单词**反转字符串内容时,最自然的方法是使用`StringTokenizer``Stack`。 如您所知,`Stack`是一个实现易于使用的**后进先出(LIFO)**对象栈的类。
```java
]
......
......@@ -53,7 +53,7 @@ HashMap 不是线程安全的。 我们可以在并发应用中使用 **HashTabl
我是否应该建议您准备**集合框架**及其所有主要类别? 我想你已经足够聪明了。
如果没有任何与集合框架有关的问题,则任何面试(初中和中级)都将是不完整的。 它真正测试您的编程技能和对核心 Java API 的了解。 问题可能像集合层次结构一样简单,而困难的问题例如队列和栈。 这是此类常见收藏采访问题的列表:
如果没有任何与集合框架有关的问题,则任何面试(初中和中级)都将是不完整的。 它真正测试您的编程技能和对核心 Java API 的了解。 问题可能像集合层次结构一样简单,而困难的问题例如队列和栈。 这是此类常见收藏采访问题的列表:
* 解释集合层次?
* **设置****列表**之间的区别?
......@@ -72,7 +72,7 @@ HashMap 不是线程安全的。 我们可以在并发应用中使用 **HashTabl
* **故障快速****故障安全**有什么区别?
* 什么是**比较器****比较器**接口?
* 什么是集合和**数组**类?
* 什么是**队列****栈**? 列出他们的差异?
* 什么是**队列****栈**? 列出他们的差异?
#### 1.7 [Java 中的多态是什么?](//howtodoinjava.com/object-oriented/what-is-polymorphism-in-java/)
......
......@@ -139,7 +139,7 @@ final int hash;
* 现在,调用`indexFor(hash, table.length)`函数来计算用于存储 Entry 对象的精确索引位置。
* Here comes the main part. Now, as we know that two unequal objects can have same hash code value, how two different objects will be stored in same array location [called bucket]. Answer is `LinkedList`. If you remember, `Entry` class had an attribute “`next`”. This attribute always points to next object in chain. This is exactly the behavior of `LinkedList`.
因此,在发生碰撞的情况下,`Entry`对象以`LinkedList`形式存储。 当`Entry`对象需要存储在特定索引中时,`HashMap`检查是否已经有一个条目? 如果尚无条目,则`Entry`对象存储在此位置。
因此,在发生碰撞的情况下,`Entry`对象以`LinkedList`形式存储。 当`Entry`对象需要存储在特定索引中时,`HashMap`检查是否已经有一个项目? 如果尚无项目,则`Entry`对象存储在此位置。
如果已经有一个对象位于计算索引上,则检查其`next`属性。 如果为**,则为**,并且当前`Entry`对象成为`LinkedList`中的`next`节点。 如果`next`变量不为空,则遵循步骤直到`next`被求值为空。
......
......@@ -225,7 +225,7 @@ Map 接口是一种特殊的集合类型,它是**,用于存储键值对**。
**IdentityHashMap** 与 HashMap 相似,不同之处在于**在比较元素**时使用引用相等性。 IdentityHashMap 类不是一种广泛使用的 Map 实现。 尽管此类实现了 Map 接口,但它有意违反 Map 的一般协定,该协定要求在比较对象时必须使用 equals()方法。 IdentityHashMap 设计为仅在少数情况下使用,其中需要引用相等语义。
**WeakHashMap** 是 Map 接口**的实现,该接口仅存储对其键**的弱引用。 当不再在 WeakHashMap 外部引用键值对时,仅存储弱引用将允许对键值对进行垃圾回收。 该类主要用于与 equals 方法使用==运算符测试对象标识的键对象一起使用。 一旦丢弃了这样的键,就永远无法重新创建它,因此以后不可能在 WeakHashMap 中对该键进行查找,并且会惊讶地发现它的目已被删除。
**WeakHashMap** 是 Map 接口**的实现,该接口仅存储对其键**的弱引用。 当不再在 WeakHashMap 外部引用键值对时,仅存储弱引用将允许对键值对进行垃圾回收。 该类主要用于与 equals 方法使用==运算符测试对象标识的键对象一起使用。 一旦丢弃了这样的键,就永远无法重新创建它,因此以后不可能在 WeakHashMap 中对该键进行查找,并且会惊讶地发现它的目已被删除。
#### 13)解释 ConcurrentHashMap 吗? 怎么运行的?
......@@ -253,7 +253,7 @@ final int hash;
```
此处,键和值变量用于存储键 - 值对。 整个目对象存储在数组中。
此处,键和值变量用于存储键 - 值对。 整个目对象存储在数组中。
```java
/**
......@@ -281,7 +281,7 @@ Map 界面提供了 3 个存储在其中的键值对的视图:
* 键集视图
* 值集视图
* 目集视图
* 目集视图
可以使用迭代器浏览所有视图。
......@@ -434,17 +434,17 @@ BlockingQueue 方法有四种形式:一种抛出异常,第二种返回一个
阅读 post 中的阻塞队列示例用法: [**如何使用阻塞队列?**](//howtodoinjava.com/java-5/how-to-use-blockingqueue-and-threadpoolexecutor-in-java/ "How to use BlockingQueue and ThreadPoolExecutor in java")
#### 37)什么是队列和栈,列出它们之间的差异?
#### 37)什么是队列和栈,列出它们之间的差异?
**设计用于在处理之前保存元素的集合。** 除了基本的 Collection 操作之外,队列还提供其他插入,提取和检查操作。
**通常但不一定以 FIFO(先进先出)的方式对元素进行排序。**
**栈也是队列的一种形式,但有一个区别,那就是 LIFO(后进先出)。**
**栈也是队列的一种形式,但有一个区别,那就是 LIFO(后进先出)。**
无论使用哪种顺序,队列的开头都是该元素,可以通过调用 remove()或 poll()将其删除。 另请注意,栈和向量都已同步。
无论使用哪种顺序,队列的开头都是该元素,可以通过调用 remove()或 poll()将其删除。 另请注意,栈和向量都已同步。
**用法:**如果要按接收顺序处理传入流,请使用队列。适用于工作列表和处理请求。
如果只想从堆栈顶部推动并弹出,请使用堆栈。 适用于递归算法。
如果只想从栈顶部推动并弹出,请使用栈。 适用于递归算法。
#### 38)什么是可比较和比较器界面?
......
......@@ -44,7 +44,7 @@ ConcurrentHashMap Internal Structure
换句话说, **ConcurrentHashMap 使用多个锁,每个锁控制映射**的一个段。 在特定段中设置数据时,将获得该段的锁。 因此,基本上**更新操作是同步的**
**获取数据时,将使用易失性读取**,而不会进行任何同步。 如果易失性读取导致未命中,则将获得该段的锁定,并在同步块中再次搜索目。
**获取数据时,将使用易失性读取**,而不会进行任何同步。 如果易失性读取导致未命中,则将获得该段的锁定,并在同步块中再次搜索目。
## 3\. HashMap 和 Collections.synchronizedMap(HashMap)之间的区别
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/jaxb/solved-javax-xml-bind-jaxbexception-class-java-util-arraylist-nor-any-of-its-super-class-is-known-to-this-context/](https://howtodoinjava.com/jaxb/solved-javax-xml-bind-jaxbexception-class-java-util-arraylist-nor-any-of-its-super-class-is-known-to-this-context/)
当您使用 [**JAXB**](//howtodoinjava.com/category/frameworks/jaxb/ "JAXB tutorials") 将 Java 对象(集合类型)编组为 xml 格式时,会发生此异常。 栈跟踪如下所示:
当您使用 [**JAXB**](//howtodoinjava.com/category/frameworks/jaxb/ "JAXB tutorials") 将 Java 对象(集合类型)编组为 xml 格式时,会发生此异常。 栈跟踪如下所示:
```java
Exception in thread "main" javax.xml.bind.JAXBException: class java.util.ArrayList nor any of its super class is known to this context.
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/jaxb/solved-exception-in-thread-main-com-sun-xml-internal-bind-v2-runtime-illegalannotationsexception-3-counts-of-illegalannotationexceptions/](https://howtodoinjava.com/jaxb/solved-exception-in-thread-main-com-sun-xml-internal-bind-v2-runtime-illegalannotationsexception-3-counts-of-illegalannotationexceptions/)
当您使用 [**JAXB**](//howtodoinjava.com/category/frameworks/jaxb/ "JAXB tutorials") 将 Java 对象(集合类型)编组为 xml 格式时,会发生此异常。 栈跟踪如下所示:
当您使用 [**JAXB**](//howtodoinjava.com/category/frameworks/jaxb/ "JAXB tutorials") 将 Java 对象(集合类型)编组为 xml 格式时,会发生此异常。 栈跟踪如下所示:
```java
Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
......
......@@ -79,7 +79,7 @@ AJP 连接器使 Tomcat 只处理动态网页,而让纯 HTML 服务器(例
**主机是网络名称的关联,例如`www.yourdomain.com`,访问 Tomcat 服务器。** 主机可以包含任意数量的上下文(即应用)。 您可以在同一服务器上定义多个主机。 例如,如果您已注册域`yourdomain.com`,则可以定义主机名,例如`w1.yourdomain.com``w2.yourdomain.com`。 请记住,只有当域名服务器将其名称映射到计算机的 IP 地址时,才可以从互联网访问它。
Tomcat 的默认配置包括名为 **localhost** 的主机。 可以通过在文件`C:\Windows\System32\drivers\etc\hosts`中写入一个目来完成 **localhost** 与您的计算机之间的关联。
Tomcat 的默认配置包括名为 **localhost** 的主机。 可以通过在文件`C:\Windows\System32\drivers\etc\hosts`中写入一个目来完成 **localhost** 与您的计算机之间的关联。
主机属性“`appBase`”定义了 Tomcat 安装文件夹中的应用目录。 然后,每个应用通过该目录中的路径进行标识。 唯一的例外是根路径,该路径已映射到空字符串。 本地主机的应用基本目录是`webapps`。 这意味着目录“`C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\ROOT\`”中的应用由空字符串标识。 因此,其 URL 为“`http://localhost:8080/`”。 对于驻留在根以外的目录中的其他应用,如“`C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\myapp\`”,URL 类似于“`http://localhost:8080/myapp/`”。
......
......@@ -4,7 +4,7 @@
默认情况下,tomcat 配置为在端口 8080 上运行。这就是为什么可以通过`http://localhost:8080/yourapp`之类的 URL 访问所有已部署的 Web 应用的原因。 如果要在`http://localhost/yourapp`之类的 URL 上运行应用,则需要将默认端口 8080 更改为 80,这是 HTTP 连接器的默认端口。
要更改此端口,请打开`server.xml`并找到以下目:
要更改此端口,请打开`server.xml`并找到以下目:
```java
<Connector port="8080" //Change this
......@@ -14,7 +14,7 @@
/>
```
并将其更改为以下目:
并将其更改为以下目:
```java
<Connector port="80" //Changed
......
......@@ -10,7 +10,7 @@
## 如何添加 tomcat Maven 插件
编辑项目的`pom.xml`文件和`build`标签内的插件目。
编辑项目的`pom.xml`文件和`build`标签内的插件目。
```java
<build>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册