-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.[ERROR] Maven execution terminated abnormally (exit code 1)解决方法

今天给同事的Mac配置JAVA项目IDEA开发环境的时候遇到了一个问题:
-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.[ERROR] Maven execution terminated abnormally (exit code 1)
Check了电脑的M2_HOME系统环境变量,都没有错误,于是在IDEA中File->Maven->Runner的VM options中增加配置:
-Dmaven.multiModuleProjectDirectory=$M2_HOME
保存解决问题。

IDEA出现[FATAL_ERROR] Cannot start Maven: Project JDK is not specified. 的解决办法

最近在给一个同事的Mac配置JAVA项目的开发环境的时候,启动项目IDEA报错:
[FATAL_ERROR] Cannot start Maven: Project JDK is not specified. <a href=’#’>Configure</a>
那么估计就是IDEA的JDK没有配置好,打开IDEA的preference,找到Maven->Runner,发现JRE项目的配置是“Use Project JDK (not defined yet)”,而那个Internal JRE的版本太低,所以我们需要配置Project JDK,配置的方法是点击顶部的File->Project Structure…->左边的“Project”->Project SDK
jdk
这时候现实的应该是“<No SDK>”,点开看看有没有其他选项,如果没有就点击New…->JDK,选择你的JDK目录到“Contents/Home”下。如果有,就选择配置好的例如:“1.7”。
以上操作之后,问题就解决了。

JAVA的String、StringBuffer、StringBuilder对比

1. String
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。

String a = "a"; //假设a指向地址0x0001
a = "b"; //重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a已经指向了其它地址。

因此String的操作都是改变赋值地址而不是改变值操作。

2. StringBuffer
StringBuffer是可变类,线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量:

StringBuffer buf = new StringBuffer(); //分配长16字节的字符缓冲区
StringBuffer buf = new StringBuffer(512); //分配长512字节的字符缓冲区
StringBuffer buf = new StringBuffer("this is a test"); //在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。

3. StringBuilder
StringBuilder和StringBuffer类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。

4. 线程安全
StringBuffer 线程安全
StringBuilder 线程不安全
意思是一个全局范围的StringBuffer和StringBuilder,两个线程不能同时修改StringBuffer中的内容,而能同时修改StringBuilder中的内容。

5. 运行速度
一般情况下,速度从快到慢:StringBuilder > StringBuffer > String。

6. 使用场景
(1)如果要操作少量的数据用String
(2)单线程操作字符串缓冲区下操作大量数据用StringBuilder
(3)多线程操作字符串缓冲区下操作大量数据用StringBuffer

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常的解决方法

今天在写一个JAVA程序的时候出现了异常:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result
发现报错的语句是:

foo.divide(bar));

原来JAVA中如果用BigDecimal做除法的时候一定要在divide方法中传递第二个参数,定义精确到小数点后几位,否则在不整除的情况下,结果是无限循环小数时,就会抛出以上异常。
解决方法:

foo.divide(bar, 2, BigDecimal.ROUND_HALF_UP);

注意这个divide方法有两个重载的方法,一个是传两个参数的,一个是传三个参数的:

两个参数的方法:

@param divisor value by which this {@code BigDecimal} is to be divided. 传入除数

@param roundingMode rounding mode to apply. 传入round的模式

三个参数的方法:

@param divisor value by which this {@code BigDecimal} is to be divided. 传入除数
@param scale scale of the {@code BigDecimal} quotient to be returned. 传入精度
@param roundingMode rounding mode to apply. 传入round的模式

IDEA集成开发工具Debug Cannot start Maven问题解决方法

最近接手了一个新的JAVA项目,在IDEA中配置好了Debug了,点击Debug,在控制台报错如下:

[FATAL_ERROR] Cannot start Maven: No valid Maven installation found. Either set the home directory in the <a href="#">configuration dialog</a> or set the M2_HOME environment variable on your system.

我以前的项目都可以正常使用Maven,这个项目居然不能使用了,我的~/.zshrc一切配置都正常,真是奇怪了。后来去stackoverflow上查了下,原来是Mac的Shell环境变量未必能够被GUI应用读到。解决方法如下:

sudo vim /etc/launchd.conf  //一般Mac上默认是没有这个文件的

在这个文件中加上你的M2_HOME的配置:

setenv M2_HOME /usr/local/maven/apache-maven-3.2.1

然后你一定要重新启动Mac这个配置才会生效,重启之后Debug就正常了。