2012-05-09 6 views
3

자바 코드 :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을 포함 후에 자바 프로그램을 실행하면 이 메시지를받는 이유는 무엇입니까? 그리고 왜 출력 메시지가 자바 캐치에서 인쇄되어야 볼 수 없습니다.

답변

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

이 예외는 throw 문 앞에 프로그램이 충돌하기 때문에 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

네이티브 코드를 호출은 JVM 내부에있다. 네이티브 프로그램이 예외를 throw하기 전에 충돌하기 때문에 네이티브 프로그램의 충돌로 인해 JVM도 충돌합니다.

+0

이 충돌하지만 _Luchian_이 (가) 응답을 얻은 후에 충돌이 발생하기 전에 예외를 잡습니다. – saplingPro

관련 문제