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

```
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. FireflySoft.LeaderElection增加基于ZooKeeper的Leader选举

    FireflySoft.LeaderElection的第一个版本实现了基于Consul的Leader选举,考虑到ZooKeeper的一个常见用途也是选主,所以此类库把ZooKeeper也集成了进来.并 ...

  2. 懒人的百宝箱「GitHub 热点速览」

    本周 GitHub Trending 除了 lazydocker 之外,还有多个 lazy 项目上线,比如大家熟悉的 lazyvim,可见,这个世界对懒人还是很友好的.除此之外,主打一个密码免输入,绕 ...

  3. Linux 问题:普通用户(non-root)无法ssh登录

    vi /etc/pam.d/sshd ## 将下面那行注释,保存文件即可. # Disallow non-root logins when /etc/nologin exists. account r ...

  4. shell: xcall

    #!/bin/bash ips=( 1.1.1.2 1.1.1.1 ) port= user= passwd= for i in ${ips[@]} do echo "== $i ==&qu ...

  5. CSS:粘性定位 使正文标题置顶

    案例效果 关键代码 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  6. 王道oj/problem18

    网址:略 思路:见注释:有bug:插入时1和2的结果正好相反,稍后编辑. 代码: #define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#incl ...

  7. [nginx]借助nginx实现自动获取本机IP

    前言 在用脚本自动化部署应用时,有的应用需要指定本机IP,网上找到的方案大多是过滤ifconfig或者ip命令的结果,这里提供一种通过nginx获取本机ip的方法.大致思路为客户端向nginx发起请求 ...

  8. 2023NepCTF-RE部分题解

    2023NepCTF-RE部分题解 九龙拉棺 过反调试 很容易发现 void __stdcall sub_401700() 里面有tea的痕迹 接出来发现只是前半部分 #include <std ...

  9. DevOps |研发效能之环境、程序、配置、SQL变更管理

    本文主要是讲如何建立有效的环境.程序.配置.SQL变更和管理平台. ​几天前和一个朋友聊到环境.程序的配置变更,SQL变更和整个上线流程.之前我们在这块也做了很多,有做的好的也有做的一般的,借机都总结 ...

  10. gitlab与LDAP 联调

    gitlab整理 目录 gitlab整理 1.安装Gitlab依赖包 2.下载,安装 3.配置,访问域名及邮箱 4.初始化,启动 5.访问,以及邮箱测试 5.1汉化 6.问题总结处理 6.1安装时出现 ...