Scott,
Some more hopefully useful info:
To eliminate the possibility that something might be wrong with my input
spreadsheet, and to verify that the POI 3.0 installation works OK, I
went ahead and compiled your xlcrtdemo program and ran it. It
successfully created the /tmp/xmldemo3.0.1.xls spreadsheet (SWEET !). I
then recompiled your upddemo program unmodified and ran it, and got the
same results as before.
Although I have noticed one other thing. When I had been running the old
version of your program, the error which java seems to throw into a
spooled file said "FATAL ERROR in native method: native code passed a
null object to a non-static method java.lang.Throwable" and the error
had been occurring at the line in hssf_open() " wwFile =
new_FileInputStream(wwStr);"
Ever since I installed the latest version, the error is occurring at the
next line: " wwPOIFS = new_POIFSFileSystem(wwFile);", and the text that
Java throws out is slightly different: " FATAL ERROR in native method:
Received NULL object reference java.lang.Throwable".
Don't know if that gives you anything to work with, but I hope so.
Thanks
Greg
|-----Original Message-----
|From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-
|bounces@xxxxxxxxxxxx] On Behalf Of Fleming, Greg (ED)
|Sent: Friday, November 30, 2007 9:43 AM
|To: RPG programming on the AS400 / iSeries
|Subject: RE: Java error when updating existing Excel spreadsheets using
|HSSF
|
|Matt,
|
|wwPOIFS is defined: "like(POIFSFileSystem)" which is defined as
|"CLASS(*JAVA
|: 'org.apache.poi.poifs.filesystem.POIFSFileSystem')"
|
|It is initialized to null, and the failing statement is attempting to
|set it's value equal to new_POIFSFileSystem(wwFile).
|
|wwFile evaluates to 11 in debug (below I said 8; it was actually wwStr
|that is 8). I think wwFile points to wwStr, which points to the name
of
|my input file "(/John/HSSFTest.xls)".
|
|new_POIFSFileSystem is defined thus: like(POIFSFileSystem)
|extproc(*JAVA:'org.apache.poi.poifs.filesystem.POIFSFileSystem':*CONSTR
U
|CTOR).
|
|I thought something might have been wrong with the input file, so I
|created them using a variety of methods, from clientAccess Data
Transfer
|(output BIFF8), to SQL2XLS (which uses POI 2.5). I know better than to
|create it using Excel, because I have Excel 2007 on my machine, and I
|know POI can't handle those. I did try one that was created using Excel
|2000, but no luck with that either.
|
|POI 2.5 is installed in a separate directory from POI 3.0, so I don't
|suppose there is a conflict. SQL2XLS sets the Classpath to point to
the
|directory where 2.5 is located, and I installed 3.0 in the QIBM
location
|so Classpath doesn't have to be set. I'm submitting my demo job, so
the
|JVM won't be started twice in the same job.
|
|I also ran the demo program once with the name of an input file that
|didn't exist, and it did return a "file not found" error, so I'm
|inclined to think it is finding the current file, but just isn't able
to
|open it.
|
|Thanks
|
|Greg
|
|
||-----Original Message-----
||From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-
||bounces@xxxxxxxxxxxx] On Behalf Of Haas, Matt (CL Tech Sv)
||Sent: Friday, November 30, 2007 8:44 AM
||To: RPG programming on the AS400 / iSeries
||Subject: RE: Java error when updating existing Excel spreadsheets
using
||HSSF
||
||Greg,
||
||How is wwPOIFS getting created? Is it null? How about
||newPOIFSFileSystem? I've never used POI from RPG (but I do use POI)
but
||I do quite a bit of Java programming and any of these being null can
||cause a null pointer exception.
||
||Matt
||
||-----Original Message-----
||From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-
||bounces@xxxxxxxxxxxx] On Behalf Of Fleming, Greg (ED)
||Sent: Friday, November 30, 2007 8:14 AM
||To: RPG programming on the AS400 / iSeries
||Subject: RE: Java error when updating existing Excel spreadsheets
using
||HSSF
||
||Scott,
||
||I guess what I'm looking for at this point is some direction on what I
||can do to find more detail.
||
||When I debug, I step through the upddemo program and step into the
||hssf_open() procedure,
||Then when I step into the "wwPOIFS = new_POIFSFileSystem(wwFile);"
||statement the program terminates.
||
||Is there a way to debug the Java program itself to see what's going on
||in more detail ?
||
||The wwFile variable doesn't appear to be null at the time (I think it
||showed up as 8 in debug), so I don't know what "null object" is being
||passed, nor to what "non-static method" it is being passed.
||
||As you can see, the job log isn't terribly informative, either.
||
||I don't reckon it was necessary, but just for craps and giggles I went
||ahead and ran the CRTVJVAPGM command on the POI 3.0.1. class (optimize
||40), but that didn't make any difference either.
||
||Thanks again for any direction or suggestions you can provide.
||
||And if you can't, then you can't. We have a really crappy workaround
|we
||can implement if we can't get your code working. I understand there
is
||only so much you can do without being here, and I seriously doubt I
can
||get the boss to fly you down to South Florida. ;->
||
||Greg
||
|||-----Original Message-----
|||From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-
|||bounces@xxxxxxxxxxxx] On Behalf Of Scott Klement
|||Sent: Thursday, November 29, 2007 8:14 PM
|||To: RPG programming on the AS400 / iSeries
|||Subject: Re: Java error when updating existing Excel spreadsheets
|using
|||HSSF
|||
|||Hi Greg,
|||
|||Is there some way I can reproduce this error on my box? I'm really
|||struggling to determine what, specifically, is going on.
|||
|||So I guess I'm saying that either you need to debug the code in
detail
|||to figure out what's going on, or you need to tell me how to
reproduce
|||the problem so I can debug the code in detail. Right now I just
don't
|||have any information about the problem other than "it doesn't work
and
|||the JVM crashes." Which is just a bit too broad for me to
|||troubleshoot...
|||
|||
|||
|||
|||Fleming, Greg (ED) wrote:
|||> Scott,
|||>
|||> I downloaded your latest, installed the 3.0.1 POI, changed the
||upddemo
|||> program to include the "if book = *null" code you mentioned below.
|It
|||> never gets to the "if" block, though, because the error occurs
|inside
|||of
|||> the hssf_open procedure and the program terminates immediately.
|||>
|||> I still get the same error, but now it happens on the next line "
|||> wwPOIFS = new_POIFSFileSystem(wwFile);" which seems odd, given that
|||this
|||> line is inside a monitor block. As soon as I step into the line,
|||> program terminates.
|||>
|||> There aren't any messages prior to the JVM termination in the job
||log.
|||> As you can see in this snippet, it goes straight from calling the
|||> upddemo program to crashing:
|||>
|||> *NONE Request 11/29/07 13:23:23.598896
|||> QWTSCSBJ *N QCMD QSYS 0189
|||> Message . . . . : -CALL
|||> PGM(UPDDEMO)
|||> MCH74A5 Escape 40 11/29/07 13:23:30.047264
|||> realcftrap2 001728 QJVAJNI QSYS *STMT
|||> To module . . . . . . . . . :
|||> QJVAJNI
|||> To procedure . . . . . . . :
|||> CallVoidMethodA
|||> Statement . . . . . . . . . :
||1
|||> Message . . . . : The Java
|||> Virtual Machine has ended.
|||> Cause . . . . . : Java
|Virtual
|||> Machine 1 has ended because of reason 2. The
|||> reason codes are defined as
|||> follows: 01- A Java program called the
|||> java.lang.System.exit method
|||with
|||> a zero status code. 02- A Java program
|||> called the
|||java.lang.System.exit
|||> method with a non zero status code of 134.
|||>
|||> Again as before, there is also a spooled file produced from the job
|||> containing this text:
|||> FATAL ERROR in native method: native code passed a null object to a
|||> non-static method
|||> java.lang.Throwable
|||>
|||> Anything else I can look at to find some kind of error messages
|prior
|||to
|||> the inglorious death of the JVM ?
|||>
|||> Thanks again.
|||>
|||> Greg
|||>
|||>
|||> |-----Original Message-----
|||> |From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-
|||> |bounces@xxxxxxxxxxxx] On Behalf Of Scott Klement
|||> |Sent: Thursday, November 29, 2007 12:39 PM
|||> |To: RPG programming on the AS400 / iSeries
|||> |Subject: Re: Java error when updating existing Excel spreadsheets
|||using
|||> |HSSF
|||> |
|||> |Greg,
|||> |
|||> |You are using an outdated copy of HSSFR4. Please download and use
|||the
|||> |current one. I know that your copy is outdated because the
|||> |FileInputStream vs FileOutputStream thing was corrected in Aug
2006
||-
|||-
|||> |more than a year ago.
|||> |
|||> |The most recent version can be found in the following article
|||> |(Systeminetwork.com membership required, but a free "associate"
|||> |membership will work):
|||> |
http://www.systeminetwork.com/article.cfm?id=55032
|||> |
|||> |Having said that, it's important to understand that RPG's O=Object
|||data
|||> |type aren't the actual Java objects. They're just REFERENCES to
|the
|||> |objects. Under the covers, they're just numbers -- and the
numbers
|||are
|||> |used by the JVM to locate the actual object, which always resides
|in
|||> the
|||> |JVM itself. So whether I coded FileInputStream or
FileOutputStream
|||> |doesn't really matter, as long as the number does actually refer
to
||a
|||> |FileInputStream object in the JVM. The reason that code made it
|||into
|||> |wide use is because it worked, despite being coded incorrectly,
|||because
|||> |it still referred to the right type of object.
|||> |
|||> |
|||> |Regarding the "JVM ended, Reason code 2" error:
|||> |
|||> |That almost always happens when you pass a *NULL object to a Java
|||> |routine. Like I said, RPG's O=Object data type is only a number
||that
|||> |refers to a Java object. If you set that number to *NULL (which
|||under
|||> |the covers is zero) the JVM will be trying to refer to an object
||that
|||> |doesn't exist, and that causes it to become confused and end
|||> abnormally.
|||> |
|||> |Note that hssf_open() returns *NULL if it can't open the file.
|Your
|||> |code is SUPPOSED to check for that *NULL, and either try again, or
|||end
|||> |the program, or whatever it needs to do, when it encounters the
|||*NULL.
|||> |What it should NOT do is pass that *NULL object to another Java
|||> routine.
|||> | And I suspect that this is what it's doing.... it's not checking
|||for
|||> |the *NULL, and is proceeding as if everything is fine. And when
||Java
|||> |gets that *NULL value, it crashes the JVM.
|||> |
|||> |So you can fix that by changing your code to something like this:
|||> |
|||> | book = HSSF_open('/path/to/whatever.xls');
|||> | if (book = *null);
|||> | *inlr = *on;
|||> | return;
|||> | endif;
|||> |
|||> |So... if the open failed, the program does not try to manipulate
|the
|||> |workbook (since it was never loaded), it just ends.
|||> |
|||> |That'll stop the JVM from crashing, but won't cause the
HSSF_open()
|||> |routine to load your spreadsheet. There should be earlier
messages
|||in
|||> |the job log (earlier than that JVM ended thing) that explain why
|the
|||> |file didn't open...
|||> |
|||> |
|||> |
|||> |Fleming, Greg (ED) wrote:
|||> |> Scott,
|||> |>
|||> |> Some further info may help us narrow this down.
|||> |>
|||> |> In debug, the error appears to occur in the HSSF_Open procedure
|at
|||> |line
|||> |> 1559
|||> |> wwFile = new_FileInputStream(wwStr);
|||> |>
|||> |> I had read on another list somewhere that the preceding
|definition
|||on
|||> |> line 1553:
|||> |> D wwFile s
|like(jFileOutputStream)
|||> |> Was in error and should be corrected to:
|||> |> D wwFile s
like(jFileInputStream)
|||.
|||> |>
|||> |> I did this, recompiled the module and re-created the service
|||program,
|||> |> then rebound
|||> |> The upddemo program. But I still get the same error either way.
|||--
|||This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing
|||list
|||To post a message email: RPG400-L@xxxxxxxxxxxx
|||To subscribe, unsubscribe, or change list options,
|||visit:
http://lists.midrange.com/mailman/listinfo/rpg400-l
|||or email: RPG400-L-request@xxxxxxxxxxxx
|||Before posting, please take a moment to review the archives
|||at
http://archive.midrange.com/rpg400-l.
||
||
||--
||This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing
||list
||To post a message email: RPG400-L@xxxxxxxxxxxx
||To subscribe, unsubscribe, or change list options,
||visit:
http://lists.midrange.com/mailman/listinfo/rpg400-l
||or email: RPG400-L-request@xxxxxxxxxxxx
||Before posting, please take a moment to review the archives
||at
http://archive.midrange.com/rpg400-l.
||
||
||--
||This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing
||list
||To post a message email: RPG400-L@xxxxxxxxxxxx
||To subscribe, unsubscribe, or change list options,
||visit:
http://lists.midrange.com/mailman/listinfo/rpg400-l
||or email: RPG400-L-request@xxxxxxxxxxxx
||Before posting, please take a moment to review the archives
||at
http://archive.midrange.com/rpg400-l.
|
|
|--
|This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing
|list
|To post a message email: RPG400-L@xxxxxxxxxxxx
|To subscribe, unsubscribe, or change list options,
|visit:
http://lists.midrange.com/mailman/listinfo/rpg400-l
|or email: RPG400-L-request@xxxxxxxxxxxx
|Before posting, please take a moment to review the archives
|at
http://archive.midrange.com/rpg400-l.
As an Amazon Associate we earn from qualifying purchases.