我正在尝试使用SWIG将C 类包装到Java类中。此类C 类具有引发异常的方法。
我有三个目标,尽管据我所知遵循了手册,但目前没有一个目标:
throws <exceptiontype>
在C ++中引发的方法上声明java.lang.Exception
Exception.getMessage()
在生成的SWIG类中重写。似乎问题的根源似乎typemap
没有应用我的,因为以上均未发生。我做错了什么?
最小的示例如下。C
++不必编译,我只对生成的Java感兴趣。异常的类无关紧要,并且下面的代码使用IOException仅仅是因为文档中使用了它。所有代码均从此处的示例改编而成:
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会抛出空指针异常不同。相