Final variables and try blocks
If you tried to initialize a final variable within a try block, you would get a compile-time error.
Here's an example class:
class Example {
private final String example;
public Example() {
try {
example = "Example";
} catch (Exception e) {
// Just an example.
}Obviously you wouldn't need to try-catch something like this (it's a stupid example - I know) , but the point is, the code wouldn't compile, and would return an error saying something like "example may not have been initialized".
So I've got two questions. Why is this, and is there any way around it?
Thanks in advance :)
Why is thisThe actual error message is "The blank final field example may not have been initialized". The Java compiler insists that all the fields have some actual value when a constructor has done its thing. Nonfinal fields will have the "default" value of null, but this is not so for final fields: if they had a default value, you couldn't change them from that default because they're final!
Once you enter a try block the compiler has no way of knowing that the assignment line will ever get carried out. Some exception might occur and the example field would be left uninitialised ie having no value whatsoever, not even null.
is there any way around it?In the catch part you could throw the exception and let the caller deal with it.
Or you could try and assign some value to example within the catch part. Now the compiler will complain "The final field example may already have been assigned". Supposing you wanted it to end up as null in this case (it's not clear why though... But you may have a sensible "default" if for example a file can't be written to or some other exceptional state has occured)
class Example {
private final String example;
public Example() {
String str;
try {
str = "Example";
} catch (Exception e) {
str = null;
example = str;
}
Similar Messages
-
OBIEE 11g, BI Apps EBS: What are default security variables and Init Block
Hi,
We are implementing BI Apps 7.9.6.3 [OBIEE 11.1.1.1.5 with EBS modules]. Out of the box RPD and mappings.
There are many VARIABLES and INIT BLOCKS in the RPD. Some of them are mainly for Siebel, Jd Edwards etc.
I need to know what are the default variables and Init Block configures in RPD. Also it will be highly appreciated if anyone can point out what segments we should configure if we need to implement security with simple database table authentication with SSO?
Thanks in advance.You should review this doc for the options for EBS/OBIA security:
http://docs.oracle.com/cd/E20490_01/bia.7963/e19042.pdf
If helpful, pls mark as correct or helpful. -
Need help on how to find unused variables and intialization blocks in rpd
Hi ,
I have to remove used initialization blocks and variables.
Could suggest me the wayt to find the unused variables and intialization blocks.
Thnx1.For the ones used in the RPD, you can right click on the presentation catalog and say Display related variable, init blocks etc.
2. The ones used in Presentation layer only could be identified when they get fired. refresh your dashboards and from the admin tool in online mode you can find which init blocks and variables are fired... eliminate by that way.
3. to know all the variables and init blocks present create the Metadata dictionary of the RPD and you will get a folder named Init blocks... identify and explore there.... -
Problem with final variables and inner classes
variables accessed by inner classes need to be final. Else it gives compilation error. Such clases work finw from prompt. But when I try to run such classes through webstart it gives me error/exception for those final variables being accessed from inner class.
Is there any solution to this?
Exception is:
java.lang.ClassFormatError: com/icorbroker/fx/client/screens/batchorder/BatchOrderFrame$2 (Illegal Variable name " val$l_table")
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at com.sun.jnlp.JNLPClassLoader.defineClass(Unknown Source)
at com.sun.jnlp.JNLPClassLoader.access$1(Unknown Source)
at com.sun.jnlp.JNLPClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
at com.icorbroker.fx.client.screens.batchorder.BatchOrderFrame.<init>(BatchOrderFrame.java:217)
at com.icorbroker.fx.client.screens.batchorder.BatchOrderViewController.createView(BatchOrderViewController.java:150)
at com.icorbroker.fx.client.screens.RealTimeViewController.initialize(RealTimeViewController.java:23)
at com.icorbroker.fx.client.screens.batchorder.BatchOrderViewController.<init>(BatchOrderViewController.java:62)
at com.icorbroker.fx.client.screens.displayelements.DisplayPanel$3.mousePressed(DisplayPanel.java:267)
at java.awt.Component.processMouseEvent(Component.java:5131)
at java.awt.Component.processEvent(Component.java:4931)
at java.awt.Container.processEvent(Container.java:1566)
at java.awt.Component.dispatchEventImpl(Component.java:3639)
at java.awt.Container.dispatchEventImpl(Container.java:1623)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3450)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3162)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3095)
at java.awt.Container.dispatchEventImpl(Container.java:1609)
at java.awt.Window.dispatchEventImpl(Window.java:1590)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:450)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)I've also been having the same problem. The only work-around seems to be to slightly change the code, recompile & hope it works. See http://forum.java.sun.com/thread.jsp?forum=38&thread=372291
-
Problem with final variables and inner classes (JDK1.1.8)
When using JDK1.1.8, I came up with following:
public class Outer
protected final int i;
protected Inner inner = null;
public Outer(int value)
i = value;
inner = new Inner();
inner.foo();
protected class Inner
public void foo()
System.out.println(i);
}causing this:
Outer.java:6: Blank final variable 'i' may not have been initialized. It must be assigned a value in an initializer, or in every constructor.
public Outer(int value)
^
1 error
With JDK 1.3 this works just fine, as it does with 1.1.8 if
1) I don't use inner class, or
2) I assign the value in initializer, or
3) I leave the keyword final away.
and none of these is actually an option for me, neither using a newer JDK, if only there is another way to solve this.
Reasons why I am trying to do this:
1) I can't use a newer JDK
2) I want to be able to assign the variables value in constructor
3) I want to prevent anyone (including myself ;)) from changing the value in other parts of the class (yes, the code above is just to give you the idea, not the whole code)
4) I must be able to use inner classes
So, does anyone have a suggestion how to solve this problem of mine? Or can someone say that this is a JDK 1.1.8 feature, and that I just have to live with it? In that case, sticking to solution 3 is probably the best alternative here, at least for me (and hope that no-one will change the variables value). Or is it crappy planning..?You cannot use a final field if you do not
initialize it at the time of declaration. So yes,
your design is invalid.Sorry if I am being a bit too stubborn or something. :) I am just honestly a bit puzzled, since... If I cannot use a final field in an aforementioned situation, why does following work? (JDK 1.3.1 on Linux)
public class Outer {
protected final String str;
public Outer(String paramStr) {
str = paramStr;
Inner in = new Inner();
in.foo();
public void foo() {
System.out.println("Outer.foo(): " + str);
public static void main( String args[] ) {
String param = new String("This is test.");
Outer outer = new Outer(param);
outer.foo();
protected class Inner {
public void foo() {
System.out.println("Inner.foo(): " + str);
} producing the following:
[1:39] % javac Outer.java
[1:39] % java Outer
Inner.foo(): This is test.
Outer.foo(): This is test.
Is this then an "undocumented feature", working even though it shouldn't work?
However, I assume you could
get by with eliminating the final field and simply
passing the value directly to the Inner class's
constructor. if not, you'll have to rethink larger
aspects of your design.I guess this is the way it must be done.
Jussi -
Session variable and initialization block issues
We are using OBIEE 10.1.3.3 and utilizes built in security features. (No LDAP or other single sign on). The user or group names are not stored in any external table. I have a need to supplement Group info of the user to the usage tracking we implemented recently as the NQ_LOGIN_GROUP.RESP column contains username instead of group name. So I created a session variable and associated with a new initialization block and also had a junk default value set to the variable. In the initialization block, I wrote the following query and as a result it inserted correct values into the table when the TEST button was clicked from the initialization block form.
insert into stra_login_data (username, groupname, login_time) values ('VALUEOF(NQ_SESSION.USER)', 'VALUEOF(NQ_SESSION.GROUP)', SYSDATE)
My intention is to make this execute whenever any user logs on. The nqserver.log reports the following error and it doesn?t insert values into the table.
[nQSError: 13011] Query for Initialization Block 'SET_USER_LOGIN_BLOCK' has failed.
[nQSError: 23006] The session variable, NQ_SESSION.USER, has no value definition.
[nQSError: 13011] Query for Initialization Block 'SET_USER_LOGIN_BLOCK' has failed.
[nQSError: 23006] The session variable, NQ_SESSION.GROUP, has no value definition.
When I changed the insert statement as below, this does get populated whenever someone logs in. But I need the values of GROUP associated with the user as defined in the repository.
insert into stra_login_data (username, groupname, login_time) values ('TEST_USER', TEST_GROUP', SYSDATE)
Could someone help me out! As I mentioned above, I need the GROUP info into the usage tracking. So, if there is another successful approach, could you please share?
Thank you
AminHi Amin,
See [this thread|http://forums.oracle.com/forums/thread.jspa?messageID=3376946�]. You can't use the GROUP session variable in an Init Block unless it has been seeded from an Init Block first. There isn't an easy solution for what you want, but here are some options:
1) Create a copy of your User => Groups assignments in your RPD in an table so you can use it in your Usage Tracking Subject Area. But this means you will have to replicate the changes in two places so it's not a good solution.
2) As the GROUP session variable is populated when you login you could theoretically use it a Dashboard and pass it a parameter to write the value to the database. But as I am not sure how can you make fire only once when the user logins it sounds like a bad idea.
3) Move your User => Groups assignments from your RPD to a DB table. Use OBIEE Write Back or something like Oracle APEX to maintain them.
I think 3) is the best solution to be honest. -
Repository variable and Init block
I created an Init block that is based off of a sql command in which the command is designed to give me the max date a table was updated after a data load. Well the variable I created based off of this has a timestamp of today's date. I want to create a report on the front end (actually just a column) that updates when a load has been completed. I use this (TIMESTAMPDIFF ( SQL_TSI_MINUTE, VALUEOF(“LAST_UPDATE_DATE”)), CURRENT_TIMESTAMP)) for the column formula but I'm either running into errors or getting nothing at all.
OBIEE 11.1.1.5
Please AdviseHey......long time but here it is. So I created an init block called Last_update_date and had it query a db table that automatically updates when a data load is complete. I set a variable with the current timestamp. Well When the table loads the variable locks in that time of the load. On the front end I referenced the table in an expression and created a report around it. I did a timestamp diff b/t current time and the time the init block locked in for the load, and called it ETL update column. I created an agent that starts a purging/caching cascade with the ETL update report as the condition.
Thanks -
Hi!
I suppose this topic pops up from time to time in forums (I've found some threads after google-ing some), but I couldn't find any authentic answers to this.
According to the standard coding guidelines, how on Earth should you write local final variables?
The java coding guidelines don't explicitly mention this case, only class-level final (static final) variables and some "ANSI" constants. (I don't have any idea what "ANSI constant" is supposed to mean, anyway).
Thanks!public int getSomeValue(final String parameter) {
final int length = parameter.getLength();
// do something
}Would you call "length" a constant here? Obviously
not, so why do we declare it final? Because it
doesn't change during the execution of this method
and to avoid accidentally assigning a different value
to it.I'm not sure I wouldn't. For several years I've been pretty satisfied with C++'s notion of "const" (in fact, I really miss real "const" functionality in Java, but that's another story).
You could write the equivalent in C++:
int getSomeValue(const std::string parameter) {
const int length = parameter.length();
// or .size()? I don't remember, but doesn't matter... :)
}You could even write things like this:
for(int i=0;i<5;++i) {
const int j = 2*i;
std::cout << j << endl;
}So, C++ says: if a variable is "const", its value won't change after it's created. The way I see it, the const variable is "recreated" every time you step into the block where it's defined from the outside. (I don't know whether it looks like the same from the implementation point of view, but that doesn't matter.)
And whatever C++ says, it's so, because it is a correct language. :)
Anyway, what you're saying makes sense, and if there's a more explicit way of saying "this is a constant" -as you suggested-, I'm going to use it.
But about the naming convention, I see there's a pretty good unison here, so thanks! :) -
Final keyword and return type ...
static byte m1() {
final char c = 'b';
return c; // THIS IS FINE NO COMPILER ERROR
static byte m2() {
char c = 'b';
return c; // COMPILER ERROR
The first return type is LEGAL, but the secoond type is not because it is not final. Why is this the case? Going from a char to a byte is a down conversion. Why does the compiler allow it for a final variable and dis-allow it for the other variable?i am curious... what is this one about ?See section 5.2 of the JLS, regarding assignment conversion:
Assignment conversion occurs when the value of an expression is assigned (�15.26) to a variable: the type of the expression must be converted to the type of the variable. Assignment contexts allow the use of an identity conversion (�5.1.1), a widening primitive conversion (�5.1.2), or a widening reference conversion (�5.1.4). In addition, a narrowing primitive conversion may be used if all of the following conditions are satisfied:
The expression is a constant expression of type byte, short, char or int.
The type of the variable is byte, short, or char.
The value of the expression (which is known at compile time, because it is a constant expression) is representable in the type of the variable. -
Doubts reg try block and return statements
hi
public int test()
try
System.out.println("hi");
return 1;
catch(Exception e)
System.out.println("err");
return 2;
finally
System.out.println("final");
return 3;
//System.out.println("after");
//return 4;
when i call this function, it will printing 3... why ??
and also compilation error is coming when i put return statement after final block.. why is it so??but if commented the return statements in catcch and finally then it iam not getting any compilation error.
public int test()
try
System.out.println("hi");
return 1;
catch(Exception e)
System.out.println("err");
// return 2;
finally
System.out.println("final");
// return 3;
System.out.println("after");
return 4;
and iam just learning ..... regarding return and try block -
While local variable initialized inside try block compiler throws error???
Check out this code where two local variables(one String and the other int type) is declared at the beginning of the method and initialized inside try block. now when i compile this app, it gives an error sayin' that Variables not been initialized. Can anyone tell me why compiler is throwin' an error message?
Many thanks.
import java.io.*;
public class Test{
public static void main(String[] args){
String aa;
int c;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.println("EnterAnything:");
try{
aa = in.readLine();
c = 1;
catch(IOException e){
System.out.println(e.getMessage());
System.out.println(aa);
System.out.println(c);
}jfbriere,
Thanks to u all.
that every reference to the variable is necessarily preceded
by execution of an assignment
to the variable.But I've initialized the variable c and aa inside try block before referencing it as a parameter of println()?
Can u clarify this?
--DM -
Posiibility for terminating jvm inside try block so that finally block wont
posiibility for terminating jvm inside try block so that finally block wont execute at all ?
But in that case what will happen?
Is it safe for any practical situation ?
Threads: t.stop()
JVM : System.exit()
which one can really help and where?What if security Manager comes into picture?
class ExitCatchingSecurityManager extends SecurityManager
public void checkExit(int status)
Process.terminateProcessWithThreadGroup(getThreadGroup());
throw new SecurityException();
What if an application calls System.exit()?
We still have one big hole in our multiprocess library. If any application calls System.exit(), the JVM terminates, and all the pseudo-processes will be destroyed with no warning. Fortunately, Java's design once again comes to our aid. Any call to System.exit() is first checked by the SecurityManager to see if the application has permission to terminate the JVM. We can install our own SecurityManager to catch the System.exit() call, disallow it, and terminate the pseudo-process instead. The SecurityManager is actually quite simple to define:
class ExitCatchingSecurityManager extends SecurityManager
public void checkExit(int status)
Process.terminateProcessWithThreadGroup(getThreadGroup());
throw new SecurityException();
In addition, the SecurityManager should define all other checks so that they do not block pseudo-processes from running. A simple null call for all check* methods will work. We install our own SecurityManager by calling System.setSecurityManager(), i.e., by adding the following line near the startup of the multiprocess library:
System.setSecurityManager(new ExitCatchingSecurityManager());
The Process.terminateProcessWithThreadGroup() method is simple to define, by holding a collection of Process objects in the Process class, searching the collection to find the Process with the identical ThreadGroup, then terminating that Process. -
Class that contains finally block with out try block
How can we make a class that will contain finally block with out try block.
dkpadhy wrote:
How can we make a class that will contain finally block with out try block.You can�t.
And frankly it seems to me that you don�t understand what you�re doing.
Care to explain further? -
Final attributes and local variables - performance ??
Hi all,
I and a colleague have done some performance testing regarding the use of final attributes and final local variables, e.g.
with final:
public class MyClass {
private final int i;
public final void myMethod() {
final int j = 5;
// do something with i and j
}vs. non-final:
public class MyClass {
private int i;
public final void myMethod() {
int j = 5;
// do something with i and j
}I couldn't find any speed differences in a small test program, but my colleague did so in his application. Who is right ??
Still, I will have do some formal testing next week and I will post the results.
I'd prefer the version using final anyway because I find it better readable, but the issue I am having is whether I'll spend 2-3 days going through the program making everything final or not.I made some tests with final arguments to a method: I could not find any difference between final and non-final arguments. code is posted below
import java.io.*;
import java.net.*;
import java.rmi.*;
import java.util.*;
import javax.ejb.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import junit.framework.*;
import junit.extensions.*;
public final class FinalVariablesTest extends TestCase /* from junit */ {
* Constructors
public FinalVariablesTest(String name) {
super(name);
* helper methods/classes
protected void setUp() throws Exception {
super.setUp();
protected void tearDown() throws Exception {
super.tearDown();
* Test Suite
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
public static Test suite() {
return new TestSuite(FinalVariablesTest.class);
* Test Cases
/** tests the effect of passing an (final or non-final) int parameter
to a method which uses the variable in a for loop.
<p>
Linux System:
cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 8
model name : Pentium III (Coppermine)
stepping : 1
cpu MHz : 501.146
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
sep_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 mmx fxsr xmm
bogomips : 999.42
</pre>
<p>
Results:
<pre>
java version "1.4.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92)
Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode)
final non-final
498 500
491 494
491 493
491 494
534 494
492 494
491 494
492 493
491 494
495 494
4966 4944 (Totals)
</pre>
public final void testIntParametersToForLoop() {
final int RUNS = 10;
final int INNER = 1000000;
final int OUTER = 10;
System.out.println("-----------------------");
System.out.println("testIntParametersToForLoop");
for(int i=0; i<RUNS; i++) {
outerFinalIntParametersToForLoop(INNER, OUTER);
outerNonFinalIntParametersToForLoop(INNER, OUTER);
private final void outerFinalIntParametersToForLoop(final int INNER,
final int OUTER) {
// with final var in for loop
long start0 = System.currentTimeMillis();
for(int i=0; i<OUTER; i++) {
innerFinalIntParametersToForLoop(INNER * i);
long end0 = System.currentTimeMillis();
System.out.println(" final: " +
( end0 - start0 ) + " milliseconds");
private final void outerNonFinalIntParametersToForLoop(final int INNER,
final int OUTER) {
// with non-final var in for loop
long start1 = System.currentTimeMillis();
for(int i=0; i<OUTER; i++) {
innerNonFinalIntParametersToForLoop(INNER * i);
long end1 = System.currentTimeMillis();
System.out.println(" non final: " +
( end1 - start1 ) + " milliseconds");
private final void innerFinalIntParametersToForLoop(final int INNER) {
for(int i=0; i<INNER; i++) {
int testVar = i * INNER;
private final void innerNonFinalIntParametersToForLoop(int loops) {
for(int i=0; i<loops; i++) {
int testVar = i * loops; -
How can i access and assign java xml Document variable in javascript block
How can i access and assign org.w3c.dom.Document variable in javascript block
I tried this xmlDoc = "<%=xmldoc%>";
it is not working
plz give me solution.
thanx
VidyaThe solution would only work on MS IE browsers, as other browsers do not support an XML DOM.
It can be done, but you would be stuck with using the Microsoft broswer. If that is acceptable, I have some example code, and a book recommendation.
Maybe you are looking for
-
Extract ECC 5.0 New GL transaction Line item to BI 7.0(delta enabled)
Hi all, The back end system is ECC 5.0 and i need to extract New GL line item transaction level data (with document/transaction currency amount) to BI 7.0 .0FI_GL_4 datasource is on GLT0 table instead of NEW GL FAGLFLEXA and 0FI_GL_14 is available o
-
When I purchase a movie it never seems to load even though I have a strong wifi connection
When I purchase a movie it never loads and the countdown is usually hours
-
I have been updating Java 6 with update 1,2,3,5,7,11 and J2SE runtime environment 5.0 update 6,9,10. They are all listed in the add/remove program section of xp. Are they all being used when I use java or simply occupying space on the HD? Could I uni
-
Change form CNF to PCNF status
Dear all, I have one production order with 2 operations. In the setup I have that the final confirmation will be set automatically, means that when the sum of yeld and scrap quantity reach the total of the operation the final confirmation is set. Now
-
Hi, When i started my work in webdynpro using remote access to the customer system , i got an error like website cannot found, after some discussion they opened some port and i am able to access the layout . But suddenly the problem reoccured , I hav