JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();动态编译出现空指针问题

问题出现及其编译环境

编写工具是Eclipse IDE for Java Developers - 2020-03
想要实现动态编译一个简单的java文件
java的运行环境是jre,而我们安装jdk1.8的时候,同时安装一个jdk1.8.0_191和一个jre1.8.0_221,而在前者文件夹内还有一个jre文件夹,其内容和后者一样。
通过在elipse编辑页面中的Window–>preferences–>Java–>Installed JREs中可以看到。默认的runtime environment是jre1.8.0-221,这是因为我们在开发程序的时候需要用到jdk1.8.0_191–jre,而在只运行java程序的时候,使用的是jre1.8.0-221。后者没有相应的编译所需要的javac.exe。
如下:
在jre1.8.0-221中查找javac.exe的结果
在jdk1.8.1-191中查找javac.exe的结果
所以在运行以下程序的时候会出现NullPointException,通过debug观察发现返回值是null,也就是没有javac.exe
以下是运行的程序:

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;

public class demo01 {

    public static void main(String[] args) {
	JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
	int result = compiler.run(null, null, null, "d:/School/Hello world/HelloWorld.java");
	System.out.println(result==0?"编译成功":"编译失败");
    }
}

解决方法

知道了缘故,便知道了解决方法。
首先在**elipse-->window-->peferences-->java-->installed JREs**中观察到只有一个jre1.8.0_191,因此,**search-->**找到jdk1.8.0_221中的jre,添加jre,变成为如下:

添加之后
可勾选也可不勾选,看心情的选择。是吧
然后再次run,发现依旧NullPointException,神奇吧
然后在项目下的JRE System Library会发现是javaSE-1.8
右键单击–>properties(or Alt+Enter)
选中第二个alternate JRE(自带翻译:备用JRE or 交替JRE):改成我们添加进去的jre,在运行就ok了
当然,也可以在这里添加那个jre,点击Alternate JRE后的Installed JREs,会进入到相同的页面进行添加。

扩展:

可以不选择第二行的alternate LRE,改选择第三个Workspace default JRE,这个地方的内容是会随着你所勾选的jre内容改变的,如果你把installed JREs中勾选jre之后,效果一样。
不过还是喜欢第二个,alternate JRE,然后勾选,jre1.8.0_221, run起来依旧没问题。但区别不大。看心情吧。

参考:

http://blog.sina.com.cn/s/blog_544c72960102w235.html
这里面介绍的是1.6版本的这个问题,那时候可能更改installed JREs之后选中,默认的就是那个Workspace default JRE,所以会直接改变,解决问题。思路right,版本没跟上。写的内容扩展了其他,推荐观看,知旧懂新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值