2012-05-09 126 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

相關問題