一

{"type":"编程笔记"}


  • Home

  • Archives
  • Search

java lost exception stack traces

Posted on 2018-01-26   |   In java

tomcat运行时报错,但查看日志时,只能看到一句NPE,却没有相关的异常栈信息。

java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException

示例代码

public class NullPointerExceptionMissingStack {    public static void main(String[] args) {        int i = 0;        int j = 0;        String x = null;        while (i++ < 1_000_000) {            try {                throwNPE(x);            } catch (Exception e) {                int length = e.getStackTrace().length;                e.printStackTrace();                if (length == 0) {                    j++;                    if (j > 100) {                        System.out.println(i);                        System.out.println(j);                        return;                    }                }            }        }    }    private static void throwNPE(String x) {        x.toString();    }}
Read more »

mysqltimeoutexception: statement cancelled due to timeout or client request

Posted on 2018-01-25   |   In java

SQL 执行超时异常

项目中有个 SQL 语句执行了 30 秒还没执行完成,最后抛出异常MySQLTimeoutException: Statement cancelled due to timeout or client request:

2018-01-25 04:10:00.032 -INFO  --- [ Thread-34] com.example.test.task.CustomerTask : start execute task2018-01-25 04:10:30.062 -ERROR --- [ Thread-34] com.example.test.task.CustomerTask : execute task failureorg.springframework.dao.QueryTimeoutException:### Error querying database. Cause: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request### Cause: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request; SQL []; Statement cancelled due to timeout or client request;nested exception is com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:118)    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)    at com.sun.proxy.$Proxy142.selectOne(Unknown Source)    at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166)    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)    at com.sun.proxy.$Proxy215.syncCoffeeStock(Unknown Source)

解决方法

在对应的 Service 方法上指定事务超时的时间为 120 秒:

@Transactional(timeout = 120)

或者是为某个 Service 中的方法打开新事务:

@Transactional(timeout = 60, propagation = Propagation.REQUIRES_NEW)
Read more »

java names shadowing and obscuring

Posted on 2018-01-21   |   In java

本文通过几个简单示例了解一下java局部变量定义的作用域scope,变量名字的遮蔽shadowing和简单名的遮掩obscuring,这2者具体区别下面会示例说明,先说一下规范里定义的2个名词:简单名和限定名。

Simple Name and Qualified Name

java中的name可以被用来引用在程序中声明的实体entity,其有两种形式:简单名和限定名,即Simple Name和Qualified Name。

  1. 简单名是单个的标识符。
  2. 限定名是由一个名字,一个.号,再一个标识符组成。

完全限定名为Fully Qualified Name,缩写即FQN,该名字在整个命名空间中具有唯一性,局部类没有完全限定名。

Every primitive type, named package, top level class, and top level interface has a fully qualified name.

局部变量声明及其初始化

public class VariableNamesScope {    static int x; // 类加载之后 x 被初始化为0    public static void main(String[] args) {        // 类变量 x 已经被局部变量 x 遮蔽(shadowed)了        // int x = x; // 编译错误        int y;        y = 2;        y = y * 3;        System.out.println("y = " + y); // y = 6        int x = (x = 2) * 3, w = x * 4; // 局部变量 x 在使用之前已经被赋值了        System.out.println("x = " + x); // x = 6        System.out.println("w = " + w); // w = 24        System.out.println("VariableNamesScope.x = " + VariableNamesScope.x);    }}

上述代码运行后,结果如下:

y = 6
x = 6
w = 24
VariableNamesScope.x = 0

其中代码int x = x;这句编译错误,因为局部变量x已经遮蔽了类变量x,此时的x并没有被初始化,作为右值进行赋值是错误的。

在某个块中的局部变量声明的作用域,是在该声明所在的块中的剩余部分,从它的初始化语句开始,包括变量声明语句中右侧出现的此变量声明。所以上述代码int x = (x = 2) * 3中的局部变量x在使用之前已经被初始化赋值为2,然后再乘以3,所以可以编译通过。

Read more »

spring boot guide

Posted on 2017-12-07   |   In java

当前Spring项目中的问题

  1. 大量的XML配置
  2. 配置很重复
  3. 配置很困难
  4. 配置难维护
  5. 复杂的依赖管理

Spring Boot 解决方案

  1. 约定大于配置(Convention over configuration)。
  2. 默认配置及不同优先级的可覆盖配置。

Spring Boot 目标和特性

  1. 快速创建独立部署的Spring应用程序。
  2. 使用嵌入式Tomcat,Jetty容器,无需部署WAR包,直接运行jar包。
  3. 简化Maven及Gradle配置。
  4. 尽可能的自动化配置Spring。
  5. 直接植入产品环境下的实用功能,比如度量指标、健康检查及扩展配置等。
  6. 无需代码生成及XML配置。

Spring Boot 项目结构示例

├─── src│    ├─── main│    │    ├─── java│    │    │    └─── com│    │    │         └─── example│    │    │              └─── myproject│    │    │                   ├─── Application.java│    │    │                   ││    │    │                   ├─── domain│    │    │                   │    ├─── Customer.java│    │    │                   │    └─── CustomerRepository.java│    │    │                   ││    │    │                   ├─── service│    │    │                   │    └─── CustomerService.java│    │    │                   ││    │    │                   └─── web│    │    │                        └─── CustomerController.java│    │    ├─── resources│    │    │    ├─── templates│    │    │    ││    │    │    ├─── static│    │    │    │    ├─── error│    │    │    │    │    ├─── 404.html│    │    │    │    │    └─── 500.html│    │    │    │    ││    │    │    │    └─── index.html│    │    │    ││    │    │    ├─── favicon.ico│    │    │    ├─── logback-spring.xml│    │    │    └─── application.properties│    │    ││    │    └─── webapp│    │         └─── WEB-INF│    │              └─── jsp│    │                   └─── index.jsp│    ││    └─── test│         ├─── java│         └─── resources│└─── pom.xml
Read more »

byte order - little-endian and big-endian

Posted on 2017-10-11   |   In linux

什么是 little-endian 和 big-endian

字节序(byte order)又称端序或尾序(Endianness),多字节对象都被存储为连续的字节序列,存储地址内的排列有两个通用规则:

  1. little-endian: 小端序,就是低位字节放在内存的起始地址,即最低有效位在最高有效位的前面。
  2. big-endian: 大端序,就是高位字节放在内存的起始地址,即最高有效位在最低有效位的前面。

示例

比如 16 进制数字0x12345678(10 进制为305419896)在内存中的表示形式为:

大端模式

低地址     ------------------------>  高地址0x12      |  0x34     |  0x56     |  0x7800010010  |  00110100 |  01010110 |  01111000

小端模式

低地址     ------------------------>  高地址0x78      |  0x56     |  0x34     |  0x1201111000  |  01010110 |  00110100 |  00010010
  1. 上面 2 者比较可见,大端模式和直接阅读数字的习惯一致。
  2. 这 2 个模式中,共同点就是每个字节byte都是由8bit组成,而bit只有 2 个值,即0和1。
  3. 比如上面0x78在内存中保存在一个字节中,其表现是一样的,其 8 个 bit 都是自右向左,和数学数字表示法一样,高位在左边,即01111000。
Read more »
1…101112…99
yuweijun

yuweijun

492 posts
12 categories
RSS
GitHub Twitter
© 2021 yuweijun
Powered by Hexo
Theme - NexT.Mist.KISS