在“ R使用Java入门 ”中,您学习了如何初始化 JVM 以使用Java with R,设置类路径,并调用您创建的 Java 对象。在“ 使用Java字符串和R中的Swing API”中,您学习了使用字符串,创建Java Swing应用程序,以及查找对象是否是类的实例。在本教程中,我们将讨论使用rJava R包来处理异常,数组,集合,转换和比较Java对象,以及获取系统属性。本教程包含以下部分。
检查和清除例外
如前所述,.jnew(class,…,check = TRUE,silent =!check)函数通过将检查 arg 设置为TRUE(默认值)来检查异常。因为默认情况下“静默”参数是!检查,如果存在错误,将输出错误消息。例如,从不存在的类hello / world中使用check = TRUE创建一个新的Java对象。
> v < – .jnew(“hello / world”,check = TRUE)
以下输出指示错误。
.jnew(“hello / world”,check = TRUE)中的错误:
java.lang.ClassNotFoundException
>
提供以下函数来检查异常和抛出异常。
功能 | 描述 | 用法 |
.jcheck | 检查JVM是否存在任何挂起的异常并清除它们。当check = TRUE时,.jnew函数隐式调用.jcheck函数,这是默认值。 | .jcheck(silent = FALSE ) |
.jthrow | 抛出Java异常。在使用中的“异常”是异常对象。 | .jthrow(exception,message = NULL) |
.jgetEx | 轮询任何待处理的异常并返回异常对象(如果有)。 | .jgetEx(clear = FALSE) |
.jclear | 清除挂起的异常。 | .jclear() |
如果.jnew函数调用中check = FALSE,则不会生成错误消息,异常不会被清除,并且可能会获取异常对象。例如,使用不存在的类调用.jnew,并且check = FALSE。不生成错误消息。
> if(!is.null(e < – 。jgetEx()))print(“Java exception was raised”)
[1]“Java异常出现”
可以输出异常消息。
>打印(e)
[1]“Java-Object {java.lang.ClassNotFoundException}”
>
该.jcheck函数清除异常,如果连续叫了两次,一个输出FALSE或0表示是一样的。
> print(.jcheck(silent = TRUE))
[1] 1
> print(.jcheck(silent = TRUE))
[1] 0
使用数组
rJava包提供.jarray函数,用于从向量或Java引用列表创建Java数组引用。
.jarray(x,contents.class = NULL,dispatch = FALSE)
该contents.class如果Java的引用的列表被用来创建一个数组,并且指示该Java类用于该阵列中的对象时使用。默认值为java.lang.Object类。
例如,下面创建一个int 1到5的数组。
> a < – .jarray(1:5)
>打印(a
[1]“Java-Array-Object [I:[I @ 27d16a7f]
>
该.jevalArray返回的内容或数组元素。例如,输出数组“a”中的元素。输出int 1至5。
> .jevalArray(a)
[1] 1 2 3 4 5
>
该.jarray返回一个Java数组引用jarrayRef。作为另一个示例,从向量创建数组,使用R函数“c”创建向量。
> b < – .jarray(c(“hello”,“world”))
随后,使用.jevalArray来计算数组以输出数组的元素。
> .jevalArray(b)
[1]“hello”“world”
>
使用收藏集
集合可以像任何其他Java对象一样创建。作为示例,使用J高级API for Java 为java.util. Vector 类创建类引用。
> Vector < – J(“java.util.Vector”)
>
使用“new”运算符从类引用中创建一个名为“v”的Java对象引用。
> v < – new(Vector)
向Vector对象添加元素。
> v $ add(“item1”)
[1] TRUE
> v $ add(“item2”)
[1] TRUE
> v $ add(“item3”)
[1] TRUE
>
前面的函数调用的输出显示在R Console中(见图1)。
从前面的函数调用输出,显示在R控制台中
图1:来自前面的函数调用的输出,如R控制台中所示
使用Vector类方法firstElement()打印第一个元素。
> print(v $ firstElement())
[1]“item1”
使用size()方法输出数组的大小。
> print(v $ size())
[1] 3
使用Vector的 toArray ()方法输出数组的Object引用。
> print(v $ toArray())
[1]“Java-Array-Object [Ljava / lang / Object;
:[Ljava.lang.Object; @ 36ed5ba6“
使用toString()方法将Vector类作为Sting输出。
> print(v $ toString())
[1]“[item1,item2,item3]”
使用lastElement()方法输出Vector引用中的最后一个元素。
> print(v $ lastElement())
[1]“item3”
使用 isEmpty ()方法查找Vector是否为空。
> print(v $ isEmpty())
[1] FALSE
使用remove()方法删除元素。
> print(v $ remove(“item1”))
[1] TRUE
随后,如果第一元素被打印,则输出“item2”而不是“item1”。
> print(v $ firstElement())
[1]“item2”
使用Vector类中的removeAllElements()方法删除所有元素。
> print(v $ removeAllElements())
空值
随后,查找Vector对象是否为空,并返回TRUE。
> print(v $ isEmpty())
[1] TRUE
>
作为集合另一个例子创建类型的对象“H” 的java.util. HashMap 。
> h < – new(J(“java.util.HashMap”))
在HashMap中放入几个键/值对。
> h $ put(“1”,“hello”)
> h $ put(“2”,“world”)
> h $ put(“3”,new(J(“java.lang. Double ”),“10.2”))
使用size()方法打印HashMap对象的大小。
> print(h $ size())
[1] 3
输出的值HashMap中使用的值()的方法HashMap中。
> print(h $ values())
[1]“Java-Object {[10.2,world,hello]}”
使用get()方法获取键的值。
> print(h $ get(“1”))
[1]“hello”
>
强制转换Java对象
该.jcast功能蒙上了Java对象到另一个类,并具有以下用法。
.jcast(obj,new.class =“java / lang / Object”,
check = FALSE,convert.array = FALSE)
“obj”是要转换的Java对象,类是要转换的类。如果check = TRUE,则使用.jinstanceof函数执行检查,以验证对象是类的实例。如果check = FALSE,这是默认值,则不执行检查,如果对象不是类的实例,则会生成错误。该convert.array = FALSE不数组对象转换为jarrayRef参考。例如,创建一个名为“v”的Vector类对象。
> v < – .jnew(“java / util / Vector”)
使用.jcast将对象转换为类java / lang / Object。
> .jcast(v,new.class =“java / lang / Object”,
check = TRUE,convert.array = FALSE)
[1]“Java-Object {[]}”
上述函数调用的输出显示在R Console中,如图2所示。
从前面的函数调用输出,显示在R控制台中
图2:来自上述函数调用的输出,如R控制台中所示
获取系统属性
可以使用.jcall函数输出系统属性,方法是提供系统属性以获取作为java / lang / System 的getProperty方法的arg ,并将值作为String返回。
> .jcall(“java / lang / System”,“S”,“getProperty”,
“os.name”)
[1]“Windows 7”
> .jcall(“java / lang / System”,“S”,“getProperty”,
“file.separator”)
[1]“\”
> .jcall(“java / lang / System”,“S”,“getProperty”,“java.class.path”)
[1]“C:/ Users / Deepak Vohra / Documents / R / win-library / 3.3 / rJava /
java / boot; C:\ OracleNoSQLDatabase \ kv-client-3.0.5 \ kv-3.0.5 \
lib \ kvclient.jar; C:\“
> .jcall(“java / lang / System”,“S”,“getProperty”,“java.home”)
[1]“C:\ Program Files \ Java \ jdk1.7.0_55 \ jre”
> .jcall(“java / lang / System”,“S”,“getProperty”,“java.vendor”)
[1]“Oracle公司”
> .jcall(“java / lang / System”,“S”,“getProperty”,“java.version”)
[1]“1.7.0_55”
> .jcall(“java / lang / System”,“S”,“getProperty”,“line.separator”)
[1]“ r n”
> .jcall(“java / lang / System”,“S”,“getProperty”,“os.arch”)
[1]“amd64”
> .jcall(“java / lang / System”,“S”,“getProperty”,“path.separator”)
[1]“;
> .jcall(“java / lang / System”,“S”,“getProperty”,“user.dir”)
[1]“C:\ Users \ Deepak Vohra \ Documents”
>
比较Java引用
可以通过使用二进制比较运算符比如==,<,>,<=或> =来比较Java引用。例如,创建三个类型为Double的对象,其中两个对象将来自相同的双值10.0和一个来自双5.0。
> Double < – J(“java.lang.Double”)
> d1 < – new(Double,10.0)
> d2 < – new(Double,10.0)
> d3 < – new(Double,5.0)
>
使用==二元运算符查找d1是否等于d2 。
> d1 == d2
输出如下。
[1] TRUE
比较,如果D1小于D2与<。
> d1 <d2
输出如下。
[1] FALSE
将d1和d3与<=进行比较。
> d1 <= d3
输出如下。
[1] FALSE
将d1和d3与> =进行比较。
> d1> = d3
输出如下。
[1] TRUE
查找d1是否小于d2,其中<。
> d1> d2
输出如下。
[1] FALSE
>
总结
在这个三部分教程中,我们讨论了使用Java中的Java。我们讨论了大多数Java功能,例如创建Java对象,调用Java方法,使用Strings,创建Swing应用程序,查找Object是否是类,检查异常,使用数组,使用集合,转换Java对象,获取系统属性,以及比较Java引用以及初始化JVM和设置类路径。