当前位置: 首页 > 面试题库 >

通过SWIG处理Java中的C ++异常

穆鸿卓
2023-03-14
问题内容

我正在尝试使用SWIG将C 类包装到Java类中。此类C 类具有引发异常的方法。

我有三个目标,尽管据我所知遵循了手册,但目前没有一个目标:

  • 要使Java类throws <exceptiontype>在C ++中引发的方法上声明
  • 要获取SWIG生成的Exception类以进行扩展 java.lang.Exception
  • Exception.getMessage()在生成的SWIG类中重写。

似乎问题的根源似乎typemap没有应用我的,因为以上均未发生。我做错了什么?

最小的示例如下。C
++不必编译,我只对生成的Java感兴趣。异常的类无关紧要,并且下面的代码使用IOException仅仅是因为文档中使用了它。所有代码均从此处的示例改编而成:

  • http://www.swig.org/Doc1.3/Java.html#typemap_attributes
  • http://www.swig.org/Doc1.3/Java.html#exception_typemap

C ++头文件(test.h):

#include <string>

class CustomException {
private:
  std::string message;
public:
  CustomException(const std::string& message) : message(msg) {}
  ~CustomException() {}
  std::string what() {
    return message;
  }
};

class Test {
public:
  Test() {}
  ~Test() {}
  void something() throw(CustomException) {};
};

SWIG .i文件:

%module TestModule
%{
#include "test.h"
%}

%include "std_string.i" // for std::string typemaps
%include "test.h"

// Allow C++ exceptions to be handled in Java
%typemap(throws, throws="java.io.IOException") CustomException {
  jclass excep = jenv->FindClass("java/io/IOException");
  if (excep)
    jenv->ThrowNew(excep, $1.what());
  return $null;
}

// Force the CustomException Java class to extend java.lang.Exception
%typemap(javabase) CustomException "java.lang.Exception";

// Override getMessage()
%typemap(javacode) CustomException %{
  public String getMessage() {
    return what();
  }
%}

swig -c++ -verbose -java test.i与SWIG 2.0.4
一起运行时,异常类不会扩展,java.lang.Exception并且所有Java方法都没有throws声明。


问题答案:

看到这个,您将自己踢一下。您的SWIG界面的固定版本为:

%module TestModule
%{
#include "test.h"
%}

%include "std_string.i" // for std::string typemaps

// Allow C++ exceptions to be handled in Java
%typemap(throws, throws="java.io.IOException") CustomException {
  jclass excep = jenv->FindClass("java/io/IOException");
  if (excep)
    jenv->ThrowNew(excep, $1.what());
  return $null;
}

// Force the CustomException Java class to extend java.lang.Exception
%typemap(javabase) CustomException "java.lang.Exception";

// Override getMessage()
%typemap(javacode) CustomException %{
  public String getMessage() {
    return what();
  }
%}

%include "test.h"

%include "test.h"后,
你想申请到班test.h,而不是之前的typemaps。SWIG必须在首次看到它们适用的类时就已经看到它们。



 类似资料:
  • 问题内容: 您将如何配置SWIG .i文件以处理C FILE *类型?下面的函数设置一个文件,以便可以将日志输出写入该文件。我需要从Java类中调用。当前,当我仅将C头文件包含在以下函数中时,SWIG将生成公共静态void setLogFile(SWIGTYPE_p_FILE fd)函数。有任何想法吗? C函数: 我尝试使用以下方法#1并得到以下异常: test.i: 例外: 问题答案: 给定的看

  • 本文向大家介绍Java 中的异常处理?相关面试题,主要包含被问及Java 中的异常处理?时的应答技巧和注意事项,需要的朋友参考一下  Java异常类层次结构图 在 Java 中,所有的异常都有一个共同的祖先java.lang包中的 Throwable类。Throwable: 有两个重要的子类:Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大

  • 本文向大家介绍JAVA基础--如何通过异常处理错误,包括了JAVA基础--如何通过异常处理错误的使用技巧和注意事项,需要的朋友参考一下 《Thinking in Java》上对这章的讲解不少,可见重要性,学习和总结一些主要的记录下来。 一、创建自定义异常 输出: Throw SimpleException from f() Exception.SimpleException at Exceptio

  • 主要内容:try/catch语句,C#中的异常类,自定义异常类,抛出异常在 C# 中,异常是在程序运行出错时引发的,例如以一个数字除以零,所有异常都派生自 System.Exception 类。异常处理则是处理运行时错误的过程,使用异常处理可以使程序在发生错误时保持正常运行。 C# 中的异常处理基于四个关键字构建,分别是 try、catch、finally 和 throw。 try:try 语句块中通常用来存放容易出现异常的代码,其后面紧跟一个或多个 catch 语句

  • 异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。 异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。 throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。 catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。 try

  • 问题内容: 在Java中,如果特定的代码行导致程序崩溃,则将捕获异常并继续执行程序。 但是,在C ++中,如果我有一段导致程序崩溃的代码,例如: 然后程序仍然崩溃,并且没有捕获到异常。 那么C ++中异常处理的意义是什么?我误会了吗? 问题答案: 崩溃的行正在取消引用无效的指针。在C ++中,这不会引发异常。相反,它是未定义的行为。 C ++中不存在空指针异常,这与Java会抛出空指针异常不同。相