2012-05-09 3 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++ Код:

#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); 
      } 

}

Когда я запустить программу Java после включения DLL я получаю следующее сообщение:

# 
# 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. 
# 

Почему я получаю это сообщение? И почему я не вижу вывод, который должен быть сообщением, напечатанным из java catch.

ответ

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

Это исключение не перехвачено вашего try/catch блока, так как программа падает перед оператором броска. И разделение на 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

Машинный код вызова был внутри виртуальной машины Java. Так как нативная программа выходит из строя, прежде чем бросать исключение, авария в собственных программах также приводит к сбою JVM.

+0

, но после ответа от _Luchian_ я поймаю исключение, прежде чем он сможет сбой – saplingPro

Смежные вопросы