Java 如何检查变量是否已初始化
首先,我对Java相当陌生,如果这个问题非常简单,那么很抱歉 问题是:我有一个Java 如何检查变量是否已初始化,java,Java,首先,我对Java相当陌生,如果这个问题非常简单,那么很抱歉 问题是:我有一个String[]s,它是通过拆分一个字符串生成的,其中每个项目都是一个数字。我想将s的项转换为int[]n s[0]包含n将保存的项目数,有效地s.length-1。我正试图使用foreach循环来实现这一点: int[] n; for(String num: s){ //if(n is not initialized){ n = new int[(int) num]; cont
String[]s
,它是通过拆分一个字符串生成的,其中每个项目都是一个数字。我想将s
的项转换为int[]n
s[0]
包含n
将保存的项目数,有效地s.length-1
。我正试图使用foreach循环来实现这一点:
int[] n;
for(String num: s){
//if(n is not initialized){
n = new int[(int) num];
continue;
}
n[n.length] = (int) num;
}
现在,我意识到我可以用这样的东西:
int[] n = new int[(int) s[0]];
for(int i=1; i < s.length; i++){
n[i-1] = (int) s[i];
}
int[] n = new int[Integer.parseInt(s[0]);
for (int idx = 0; idx < n; ++idx)
n[idx] = Integer.parseInt(s[idx + 1]);
int[]n=新的int[(int)s[0]];
对于(int i=1;i
但是我相信我将来会面临“如果n未初始化,则初始化它”的问题。如果在使用变量或对象之前将其初始化为
null
String myVar1 = null;
Person bobby = null;
您可以将变量或对象与not null进行比较
if (myVar != null) {
// myVar has a value.
}
您可以检查
null
:
int[] n;
for(String num: s){
if(n == null) {
n = new int[(int) num];
}
n[n.length] = (int) num;
}
请注意,只有当n是类成员时,才会发生这种情况。如果它是局部变量,编译器将不允许您在未初始化它的情况下对其执行任何操作。您不能将
字符串
强制转换为int
。Java是强类型的,没有像脚本语言中那样的隐式类型转换
int[] n = null;
for(String num: s){
if(n == null){
n = new int[(int) num];
continue;
}
n[n.length] = (int) num;
}
要将字符串
转换为int
,请使用显式转换,如Integer.parseInt(String)
数组的所有成员变量和元素都使用默认值初始化。对于int
类型,值为0。对于引用类型(对象的任何子类型),默认值为null
。局部变量不会获得默认值,但编译器会分析代码,以确保在读取变量之前分配值。否则,代码将无法编译
我想你想要的是这样的:
int[] n = new int[(int) s[0]];
for(int i=1; i < s.length; i++){
n[i-1] = (int) s[i];
}
int[] n = new int[Integer.parseInt(s[0]);
for (int idx = 0; idx < n; ++idx)
n[idx] = Integer.parseInt(s[idx + 1]);
int[]n=newint[Integer.parseInt(s[0]);
对于(int idx=0;idx
您无法检查代码中的变量是否已初始化,因为根据定义,从可能未初始化的变量读取会导致编译时错误
您可以将变量初始化为null
并检查该值,前提是您的变量不是基元类型,并且初始化后null
不是有效值
在特定的示例中,您显示的第二个代码肯定会更干净。您可能需要查看collections框架中的其他数据结构 ->
ArrayList是数组的一个合理的很好的替代品你唯一能做的就是检查
null
。如果你的代码在一个方法中,如果你不初始化它就不会编译。所以如果它编译并运行,你知道它至少被初始化为null
,然后做null
检查。就像其他人没有做过的那样ed,最接近“正确方法”的方法是将数组初始化为null
关于其他问题:
“n[n.length]”将引发“索引越界”异常。数组的元素范围为0到长度-1。在任何情况下,我认为您在第一种情况下想要说的是“n[0]”,在第二种情况下想要说的是“n[I]”
将数组的大小存储在第一个元素中可能是个坏主意。可以对int数组执行此操作,但在字符串数组中会很混乱,对布尔数组根本不起作用。即使在int情况下,您现在在同一数据结构中混合了两个非常不同的内容,这可能会造成混淆。如果数组大小为fi“长度”仍然保留大小。如果数组大小是可变的,并且您认为要创建一个足够大的数组,然后存储实际使用的数量,那么最好使用ArrayList,它可以干净地处理动态大小数组。我遇到了这个问题,正在检查
int
是否已初始化。在我的程序中它可能被初始化为0
,因此检查是否(inti=0)
没有多大用处
作为一种解决方案/解决方法,我创建了一个
boolean
变量,该变量在int
初始化时设置。希望这能有所帮助。只有当它最初显式初始化为null,或者它是一个对象/类成员时,我才编辑了我的答案,我应该更清楚地说明我的方向。关于引用类型的部分应该是“引用类型(对象的任何子类型)”,因为Object[]
不是Object
的子类,但它是一个子类型。谢谢,玩了一点之后,我发现我必须做新的整数才能转换它。@Javier:再次说明:这不是“转换”,而是“转换”。@Javier新整数(字符串)
在大多数情况下都不是一个很好的API。如果您想要一个Integer
对象,请使用Integer.valueOf(String)
取而代之。这将最大限度地减少创建的不同对象的数量。在这种情况下,如果您想要一个原语int
,请使用parseInt
方法,这样可以避免完全创建Integer
对象。@erickson非常感谢,这是一个很好的建议!@Joachim感谢您的澄清,我来自动态类型的background,所以我不完全理解其中的区别。这无法编译:默认情况下,局部变量未设置为null
。(此外,int casting存在问题,无法像@erickson所指出的那样工作)。谢谢。我不知道我可以给任何类型的变量赋值为null。@Javier:只给引用类型的变量/字段赋值。所以除了int
,boolean
,char
,short
,long
,float
,double
。引用类型包括Integer
,int[]
,以及无数的其他可能性。@多谢您的澄清,所以它永远不会消失