2012-05-09 130 views
3

Java代码:为什么我运行java程序时会收到此消息?

package Package; 

public class MyExceptionTester { 

private native void compute() throws Exception; 

public static void main(String... args) { 
    try { 
     MyExceptionTester met = new MyExceptionTester(); 
     met.compute(); // This method will throw an exception which gets printed from the catch block 
    } catch(Exception exc) { 
     System.out.println("From Java :" + exc); 
    } 
} 

static { 
    System.loadLibrary("MyExceptionTester"); 
} 
} 

C++代码:

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# EXCEPTION_INT_DIVIDE_BY_ZERO (0xc0000094) at pc=0x65c4121a, pid=5292, tid=6000 
# 
# JRE version: 7.0 
# Java VM: Java HotSpot(TM) Client VM (20.0-b01 mixed mode, sharing windows-x86) 
# Problematic frame: 
# C [MyExceptionTester.dll+0x121a] 
# 
# An error report file with more information is saved as: 
# W:\elita\jnitesters\workspace\java\JNI\build\classes\hs_err_pid5292.log 
# 
# If you would like to submit a bug report, please visit: 
# http://java.sun.com/webapps/bugreport/crash.jsp 
# The crash happened outside the Java Virtual Machine in native code. 
# See problematic frame for where to report the bug. 
# 

#include "iostream" 
#include "Package_MyExceptionTester.h" 

void Java_Package_MyExceptionTester_compute 
    (JNIEnv *env, jobject obj) { 
     jthrowable exc; 
     try { 
      jint i = 1/0; 
      throw "C++ Message : Hey ! Can't Divide By Zero"; 
     } catch(char *str) { 
      jclass excClass = env->FindClass("java/lang/Exception"); 
      if(excClass == NULL) { 
        return; 
       } 
      env->ThrowNew(excClass,str); 
      } 

}

当我包括dll我收到以下消息后运行Java程序为什么我会收到此消息?为什么我看不到应该从java catch块打印的消息的输出。

回答

2
jint i = 1/0; 
throw "C++ Message : Hey ! Can't Divide By Zero"; 

这个异常不会被你的try/catch块所捕获,因为程序在throw语句之前崩溃了。并且0的一个划分也不是你能看到的例外。

也许一些可能帮助:

int d = 0; 
jthrowable exc; 
try 
{ 
    if (d == 0) 
     throw "C++ Message : Hey ! Can't Divide By Zero"; 
    jint i = 1/d; 
} catch(char *str) 
{ 
    jclass excClass = env->FindClass("java/lang/Exception"); 
    if(excClass == NULL) 
    { 
     return; 
    } 
    env->ThrowNew(excClass,str); 
} 
+0

这使我的JVM – saplingPro

-1

本地代码调用已经内部JVM。由于本机程序在抛出异常之前崩溃,本机程序的崩溃导致JVM崩溃。

+0

崩溃,但_Luchian_答案后,我赶上它的异常之前,它可以崩溃 – saplingPro

相关问题