最近收到一个求助信息,异常堆栈如下:

```
java.lang.RuntimeException: FF1C1005
at test_ssh.sftp.Pool.get(Pool.java:25) ~[test-ssh-0.0.1-SNAPSHOT.jar:na]
... 116 common frames omitted
Caused by: java.lang.NullPointerException: null
at test_ssh.sftp.Pool.get(Pool.java:23) ~[test-ssh-0.0.1-SNAPSHOT.jar:na]
```

从堆栈信息看就是一个NPE,其他什么也看不出,再看代码(简化的示例代码):

 1 package test_ssh.sftp;
2
3 import java.util.concurrent.ConcurrentHashMap;
4 import com.trilead.ssh2.Connection;
5
6 public class Pool {
7 private static ConcurrentHashMap<String, Connection> pool = new ConcurrentHashMap<String, Connection>();
8
9 public synchronized static Connection get(String host, int ftpport) {
10 Connection connection = pool.get(host) == null ? connect(host, ftpport) : pool.get(host);
11 try {
12 connection.ping();
13 } catch (Exception e) {
14 throw new RuntimeException("FF1C1005", e);
15 }
16 return connection;
17
18 }
19
20 private static Connection connect(String host, int ftpport) {
21 Connection connection = new Connection(host, ftpport);
22 try {
23 connection.connect();
24 } catch (Throwable e) {
25 return null;
26 }
27 return connection;
28 }
29 }

代码没有在适当的点抛出异常,把原始异常信息丢了~先修正下代码,该抛的异常抛出来:

public synchronized static Connection get(String host, int ftpport) {
Connection connection = pool.get(host) == null ? connect(host, ftpport) : pool.get(host);
try {
connection.ping();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("FF1C1005", e);
}
return connection;
} private static Connection connect(String host, int ftpport) {
Connection connection = new Connection(host, ftpport);
try {
connection.connect();
} catch (IOException e) {
throw e;
}
return connection; } }

重新打包运行,然后用新开会话运行tail -f 命令追踪日志,准备查看异常信息,然而并未如预期看到异常信息~难道IO被重定向了? 停止服务,在控制终端下重新启动服务,果然日志刷新到标准输出了:

java.io.IOException: There was a problem while connecting to 10.246.186.37:10022
at com.trilead.ssh2.Connection.connect(Connection.java:843)
... 119 more
Caused by: java.io.IOException: Cannot negotiate, proposals do not match.
at com.trilead.ssh2.transport.KexManager.handleMessage(KexManager.java:399)

**Linux会话使用技巧**

服务端程序通常会以守护进程方式启动,不能随意重启,那如果想查看程序输出到stdout(通常不会这么做,但不排除意外)的信息怎么办呢?两个办法:

[1]tail -f /proc/PID/fd/1 这里1是标准输出,当然也可以是2 stderr
[2]sudo strace -p PID -e write

  

JAVA异常的不正确处理方式的更多相关文章

  1. Java中断异常 InterruptedException 的正确处理方式

    你看到这篇文件可能是因为你已经调用了一个抛出 InterruptedException 异常的方法,并且需要以某种方式处理它. 首先,需要了解为一个方法为啥会 throws InterruptedEx ...

  2. 在日志中记录Java异常信息的正确姿势

    遇到的问题 今天遇到一个线上的BUG,在执行表单提交时失败,但是从程序日志中看不到任何异常信息. 在Review源代码时发现,当catch到异常时只是输出了e.getMessage(),如下所示: l ...

  3. Java - 异常解析基础

    java提高篇(十六)-----异常(一) 一.为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率.虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位 ...

  4. Java异常的正确使用姿势

    最近在项目代码中,遇见异常滥用的情形,会带来什么样的后果呢? 1. 代码可读性变差,业务逻辑难以理解 异常流与业务状态流混在一起,无法从接口协议层面理解业务代码,只能深入到方法(Method)内部才能 ...

  5. Redis实现分布式锁的正确使用方式(java版本)

    Redis实现分布式锁的正确使用方式(java版本) 本文使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 分布式锁一般有三种实现方式: 1. 数据库乐观锁: ...

  6. “全栈2019”Java异常第七章:try-catch-finally组合方式

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  7. Java 异常的处理方式--throws和try catch

    异常的第一种处理方式throws. 看以下例子: import java.io.*;public class ExceptionTest04{ public static void main(Stri ...

  8. Java修炼——异常的概念以及处理方式(捕获异常)

    异常概念分类 异常( Exception 也称例外)就是在程序的运行过程中 所发生的不正常的事件,它会中断正在运行的程序  所需文件找不到  网络连接不通或中断  算术运算错 (被零除-)  ...

  9. 浅谈java异常[Exception]

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...

  10. Java 异常讲解(转)

    六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗?   1 OutputStreamWrite ...

随机推荐

  1. 更快的训练和推理: 对比 Habana Gaudi®2 和英伟达 A100 80GB

    通过本文,你将学习如何使用 Habana Gaudi2 加速模型训练和推理,以及如何使用 Optimum Habana 训练更大的模型.然后,我们展示了几个基准测例,包括 BERT 预训练.Stabl ...

  2. Oracle内存管理方式介绍(转载)

    "Oracle内存管理可分为两大类,自动内存管理和手动内存管理.其中手动内存管理又可分为自动共享内存管理,手动共享内存管理,自动PGA内存管理以及手动PGA内存管理.本文会简单的介绍不同的内 ...

  3. 【pandas小技巧】--日期相关处理

    日期处理相关内容之前pandas基础系列中有一篇专门介绍过,本篇补充两个常用的技巧. 1. 多列合并为日期 当收集来的数据中,年月日等信息分散在多个列时,往往需要先合并成日期类型,然后才能做分析处理. ...

  4. Linux cpu 亲缘性 绑核

    前言 https://www.cnblogs.com/studywithallofyou/p/17435497.html https://www.cnblogs.com/studywithallofy ...

  5. 2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化 后变成字符串 str2 每一次转化时,你可以将

    2023-08-14:用go语言写算法.给出两个长度相同的字符串 str1 和 str2, 请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化 后变成字符串 str2, 每一次转化时,你可以 ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (83)-- 算法导论8.1 4题

    四.用go语言,假设现有一个包含n个元素的待排序序列.该序列由 n/k 个子序列组成,每个子序列包含k个元素.一个给定子序列中的每个元素都小于其后继子序列中的所有元素,且大于其前驱子序列中的每个元素. ...

  7. tomcat远程部署

    使用maven的插件对tomcat进行远程部署,大大降低了部署步骤,对于远程部署调试也有一定的帮助 要让maven对够进行远程部署,我们需要对tomcat进行配置,主要是配置tomcat-user.x ...

  8. 开源通用型流式大数据统计系统XL-LightHouse介绍

    概述 XL-LightHouse是针对互联网领域繁杂的流式数据统计需求而开发的一套集成了数据写入.数据运算.数据存储和数据可视化等一系列功能,支持大数据量,支持高并发的[通用型流式大数据统计平台]: ...

  9. PLC通过Modbus转Profinet网关连接变频器控制电机案例

    在本案例中,通过使用Modbus转Profinet网关(XD-MDPN100),PLC可以通过Profinet协议与变频器进行通信和控制.这样,PLC可以实现对电机的转速调节.启停控制等功能. 同时, ...

  10. C++ RAII在HotSpot VM中的重要应用

    RAII(Resource Acquisition Is Initialization),也称为"资源获取就是初始化",是C++语言的一种管理资源.避免泄漏的惯用法.C++标准保证 ...