JAVA异常的不正确处理方式
最近收到一个求助信息,异常堆栈如下:
```
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异常的不正确处理方式的更多相关文章
- Java中断异常 InterruptedException 的正确处理方式
你看到这篇文件可能是因为你已经调用了一个抛出 InterruptedException 异常的方法,并且需要以某种方式处理它. 首先,需要了解为一个方法为啥会 throws InterruptedEx ...
- 在日志中记录Java异常信息的正确姿势
遇到的问题 今天遇到一个线上的BUG,在执行表单提交时失败,但是从程序日志中看不到任何异常信息. 在Review源代码时发现,当catch到异常时只是输出了e.getMessage(),如下所示: l ...
- Java - 异常解析基础
java提高篇(十六)-----异常(一) 一.为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率.虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位 ...
- Java异常的正确使用姿势
最近在项目代码中,遇见异常滥用的情形,会带来什么样的后果呢? 1. 代码可读性变差,业务逻辑难以理解 异常流与业务状态流混在一起,无法从接口协议层面理解业务代码,只能深入到方法(Method)内部才能 ...
- Redis实现分布式锁的正确使用方式(java版本)
Redis实现分布式锁的正确使用方式(java版本) 本文使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 分布式锁一般有三种实现方式: 1. 数据库乐观锁: ...
- “全栈2019”Java异常第七章:try-catch-finally组合方式
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- Java 异常的处理方式--throws和try catch
异常的第一种处理方式throws. 看以下例子: import java.io.*;public class ExceptionTest04{ public static void main(Stri ...
- Java修炼——异常的概念以及处理方式(捕获异常)
异常概念分类 异常( Exception 也称例外)就是在程序的运行过程中 所发生的不正常的事件,它会中断正在运行的程序 所需文件找不到 网络连接不通或中断 算术运算错 (被零除-) ...
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- Java 异常讲解(转)
六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWrite ...
随机推荐
- influxdb 保留策略
转载请注明出处: InfluxDB 中的保留策略用于定义时间序列数据在数据库中的保留期限.保留策略决定了数据在 InfluxDB 中的存储持续时间和精度.以下是 InfluxDB 的保留策略类型以及如 ...
- ARM Trusted Firmware——编译选项(二)
@ 目录 1. 常用部分 2. 安全相关 2.1 签名 2.2 加密 2.3 哈希 2.4 中断 3.GICv3驱动程序选项 4. 调试选项 1. 常用部分 编译选项 解释 BL2 指定生成fip文件 ...
- Object.equals 和 String.equals的区别
一. 源码展示: 1. Object.equals: ①引用类型地址值比较,直接返回结果:true || false public class Object { public boolean equ ...
- Centos7中Jar快速启动脚本
Centos7中Jar快速启动脚本 创建一个文本,将以下脚本内容复制到文本当中,重命名文本后缀为.sh 注意:根据自己的项目进行更改相关内容,对应注释已说明 #!/bin/sh APP_NAME=ma ...
- 用 Hugging Face 推理端点部署 LLM
开源的 LLM,如 Falcon.(Open-)LLaMA.X-Gen.StarCoder 或 RedPajama,近几个月来取得了长足的进展,能够在某些用例中与闭源模型如 ChatGPT 或 GPT ...
- 快速切换 nodejs 的版本
最近在开发一个常驻进程.定时任务统一调度系统,以应对开发在进程管理方面遇到的各种复杂问题. 组里开发项目,一般来说是一个人承包整个项目,包括调度器设计,还有后台系统.我还有一部分工作,是队列相关的信息 ...
- VUE3、ElementPlus 重构若依vue2 表单构建功能
Vue3 + ElementPlus + Vite 重构 若依Vue2 表单构建功能 若依官方的Vue3 版本发布已经有段时间了,就是这个表单构建功能一直没有安排计划去适配到Vue3! 前段时间公司需 ...
- 【Qt6】QWidgetAction 的使用
在开始主题前,先看一个 C++ 例子: #include <iostream> struct Data { int a; int b; }; // 注意这里 struct Data *s; ...
- [elasticsearch]部署安装单节点和集群
单点安装 进入安装目录:cd /usr/local 获取安装包: wget http://172.29.50.31/download/ProgramPackage/elasticsearch/elas ...
- Redis系列18:过期数据的删除策略
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...