ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2

本文探讨了使用Eclipse编译特定Java程序时遇到的奇怪错误,尽管能够生成.class文件并正常输出,但与直接使用JDK编译存在差异。文章分析了错误原因,提供了两种解决方案,并强调了阅读官方文档的重要性。

今天早上开始编译书中的一个小例子。发现了这个错误,很奇怪,因为直接用jdk编译就没有问题,可是如果用eclipse编译,就会出现这个错误,但是一样可以生成.class文件,并且控制台的输出也正常。
我用的就是下面的这个例子:
public class CountInstances {
    private static int numInstances = 0;
    protected static int getNumInstances() {
        return numInstances;
    }
    private static void addInstance() {
        numInstances++;
    }
    CountInstances() {
        CountInstances.addInstance();
    }
    public static void main(String[] arguments) {
        System.out.println("Starting with " +
            CountInstances.getNumInstances() + " instances");
        for (int  i = 0; i < 10; ++i)
            new CountInstances();
        System.out.println("Created " +
            CountInstances.getNumInstances() + " instances");
    }
}
上网搜了一下,原因是:eclipse和jdk1.6的版本冲突 sun的网站上有 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6476706 目前还没有解决。
还发现了一段精彩的评论,如下:
经过我仔细的查阅Java Doc,发现其中有这么一段话:
http://download.java.net/jdk6/docs/api/java/io/Console.html
"Whether a virtual machine has a console is dependent upon the underlying platform and also upon the manner in which the virtual machine is invoked. If the virtual machine is started from an interactive command line without redirecting the standard input and output streams then its console will exist and will typically be connected to the keyboard and display from which the virtual machine was launched. If the virtual machine is started automatically, for example by a background job scheduler, then it will typically not have a console." ">http://download.java.net/jdk6/docs/api/java/io/Con..."
翻译一下:
虚拟机是否有一个控制台Console取决于所依赖的平台和虚拟机解析该方法的方式。如果虚拟机是从一个交互式的命令行中启动的,而没有重定向标准输入和输出流,那么虚拟机会自动的连接到键盘作为标准输入,并且把启动虚拟机的地方作为标准输出。如果虚拟机是自动启动的,例如通过后台的一个任务计划,那么典型的情况就是没有Console控制台……。
于是,思考一下我们运行上面程序的地点——Eclipse等集成开发环境,这对于上面描述中的把启动虚拟机的地方作为标准输出来说是不合适的,这里的Console()返回的默认情况下是Null,于是就产生了上面的出错信息。(也许未来Eclipse会有所改进吧)
怎么解决该问题呢?这里提供两条思路给大家(已经实际操作过,可以实现功能的正常运作)
1、使用命令行进行运行,编译可以使用集成开发环境。这样可以完成标准输出。
2、在程序中重定向标准输出到其他的设备或者方式(例如写到文本文件),这样也可以“比较不方便的”完成该功能。
总结:
重申!!文档很重要,特别是官方文档和一些说明书性质的文献资料。预期看什么XX天精通YY技术,还不如首先把官方的文档通读一遍。推荐Java Doc和MSDN Library。
 

package org.找车位; import com.sun.xml.internal.ws.util.QNameMap; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Scanner; public class test { /* 有 n 辆汽车去停车场找车位,这些汽车从0开始依次编号。 停车场里有无数个车位,也从0开始依次编号。当一辆汽车到达停车场时,会停在编号最小且空闲的车位。 比方说,当一辆汽车到达时,如果车位 0 ,1 和 5 被占据了,那么它会停在 2 号车位。 当一辆汽车离开停车场时,这个车位会立刻释放变成空闲状态;如果同一时刻有另一辆汽车到达,且该车位满足”编号最小且空闲”条件,则新来车辆可以立即停在这个车位。 给你汽车数量n和它们到达和离开的时刻,所有汽车到达时刻互不相同。 请你返回目标编号汽车所停的车位编号。 输入 输入有两行 第一行表示汽车数量n和目标汽车编号 第二行表示所有汽车到达和离开的时刻,共有2n个值,比如如下输入表示有三辆汽车,编号为0的汽车到达时刻为1,离开时刻为4;编号为1的汽车到达时刻为2,离开时刻为3;编号为2的汽车到达时刻为4,离开时刻为6 3 1 1 4 2 3 4 6 输出 目标编号汽车所停的车位编号 */ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 输入汽车的数量 int n = scanner.nextInt(); //目标汽车编号 int y = scanner.nextInt(); //汽车所在车位 HashMap<Integer, HashMap<Integer, Integer&gt;&gt; Car_position = new HashMap<&gt;(); HashMap<Integer, Integer&gt; parkState = new HashMap<&gt;(); // 定义一个长度为10000的数组,表示10000个车位 int[] park = new int[n]; // 输入n行,每行两个数,分别表示汽车的到达和离开时刻 for (int i = 0; i < n; i++) { //i为汽车编号 int in = scanner.nextInt(); int out = scanner.nextInt(); // InAndOut.put(i,new HashMap<&gt;(in,out)); for (int j=0;j<park.length;j++){ //j为车位编号 if (park[j]==0){ if (Car_position.get(j)==null) { Car_position.put(j,new HashMap<&gt;(i,out)); parkState.put(i,j); park[j]=1; i++; break; } // PriorityQueue<Integer&gt; priorityQueue = new PriorityQueue<&gt;(); }else if (Car_position.get(j).get(CarByPark(parkState,j))&gt;out){ Car_position.put(j,new HashMap<&gt;(i,out)); parkState.put(i,j); i++; break; } } } System.out.println("目标汽车车位号为"+ y + "停车场编号为"+parkState.get(y)); } static Integer CarByPark(HashMap<Integer, Integer&gt; map, int y){ // 存储匹配的键 Integer p = null; for (Map.Entry<Integer, Integer&gt; entry : map.entrySet()) { if (entry.getValue().equals(y)) { p=entry.getKey(); } } return p; } } 报错C:\dev\jdk1.8.0_332\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:56884,suspend=y,server=n -javaagent:C:\Users\yWX1446235\AppData\Local\JetBrains\IntelliJIdea2024.3\captureAgent\debugger-agent.jar -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Ddebugger.agent.enable.coroutines=true -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -Dfile.encoding=UTF-8 -classpath "C:\dev\jdk1.8.0_332\jre\lib\charsets.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\access-bridge-64.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\cldrdata.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\dnsns.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\jaccess.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\jfxrt.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\localedata.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\nashorn.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\sunec.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\sunjce_provider.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\sunmscapi.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\sunpkcs11.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\zipfs.jar;C:\dev\jdk1.8.0_332\jre\lib\jce.jar;C:\dev\jdk1.8.0_332\jre\lib\jfr.jar;C:\dev\jdk1.8.0_332\jre\lib\jfxswt.jar;C:\dev\jdk1.8.0_332\jre\lib\jsse.jar;C:\dev\jdk1.8.0_332\jre\lib\management-agent.jar;C:\dev\jdk1.8.0_332\jre\lib\resources.jar;C:\dev\jdk1.8.0_332\jre\lib\rt.jar;D:\dev\oj\test\Oj\target\classes;C:\dev\IntelliJ IDEA 2024.3.2.2\lib\idea_rt.jar" org.找车位.test Connected to the target VM, address: '127.0.0.1:56884', transport: 'socket' 3 1 1 4 2 3 4 6Exception in thread "main" java.lang.NullPointerException at org.找车位.test.main(test.java:58) ERROR: JDWP Unable to get JNI 1.2 environment, jvm-&gt;GetEnv() return code = -2 JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [util.c:840] Disconnected from the target VM, address: '127.0.0.1:56884', transport: 'socket' Process finished with exit code 1
最新发布
11-01
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值